## k

k is for kinematics

### 54 releases(31 breaking)

 0.31.0 Nov 8, 2023 Apr 28, 2023 Dec 7, 2022 Nov 16, 2022 Nov 23, 2017

#106 in Algorithms

Used in 11 crates (8 directly)

Apache-2.0

155KB
2.5K SLoC

# `k`: Kinematics library for rust-lang

`k` has below functionalities.

1. Forward kinematics
2. Inverse kinematics

`k` uses nalgebra as math library.

See Document and examples/ for more details.

## Requirements to build examples

``````sudo apt install g++ cmake xorg-dev libglu1-mesa-dev
``````

## IK example with GUI

``````cargo run --release --example interactive_ik
``````

Push below keys to move the end of the manipulator.

• `f`: forward
• `b`: backward
• `p`: up
• `n`: down
• `l`: left
• `r`: right
• `z`: reset the manipulator state.
``````use k::prelude::*;

fn main() {
let chain = k::Chain::<f32>::from_urdf_file("urdf/sample.urdf").unwrap();
println!("chain: {chain}");

// Set initial joint angles
let angles = vec![0.2, 0.2, 0.0, -1.0, 0.0, 0.0, 0.2, 0.2, 0.0, -1.0, 0.0, 0.0];

chain.set_joint_positions(&angles).unwrap();
println!("initial angles={:?}", chain.joint_positions());

// Get the transform of the end of the manipulator (forward kinematics)
chain.update_transforms();

println!("initial target pos = {}", target.translation);
println!("move z: +0.1");
target.translation.vector.z += 0.1;

// Create IK solver with default settings
let solver = k::JacobianIkSolver::default();

// Create a set of joints from end joint
// solve and move the manipulator angles
solver.solve(&arm, &target).unwrap();
println!("solved angles={:?}", chain.joint_positions());

chain.update_transforms();
println!("solved target pos = {}", solved_pose.translation);
}
``````

## Structure of API

Top level interface is `Chain` struct. It contains `Node`s and they have the relations between nodes (parent/children). Actual data (joint angle(position), transform between nodes) is stored in `Joint` object inside nodes.

You can get local/world transform of nodes. See below figure to understand what is the node's `local_transform()` and `world_transform()`.

## `OpenRR` Community

Here is a discord server for `OpenRR` users and developers.

~6–14MB
~158K SLoC