54个版本 (31个重大更改)
0.31.0 | 2023年11月8日 |
---|---|
0.30.0 | 2023年4月28日 |
0.29.1 | 2022年12月7日 |
0.29.0 | 2022年11月16日 |
0.6.0 | 2017年11月23日 |
#174 in 算法
每月489次下载
在 11 个crate中(8个直接) 使用
155KB
2.5K SLoC
k
: rust-lang的运动学库
k
具有以下功能。
- 正向运动学
- 逆向运动学
- URDF加载器
k
使用 nalgebra 作为数学库。
请参阅 文档 和 examples/ 获取更多详细信息。
构建示例的要求
sudo apt install g++ cmake xorg-dev libglu1-mesa-dev
带GUI的IK示例
cargo run --release --example interactive_ik
按下以下键来移动操作器的末端。
f
: 向前b
: 向后p
: 向上n
: 向下l
: 向左r
: 向右z
: 重置操作器的状态。
从urdf创建链接树并解决IK
use k::prelude::*;
fn main() {
// Load urdf file
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());
let target_link = chain.find("l_wrist_pitch").unwrap();
// Get the transform of the end of the manipulator (forward kinematics)
chain.update_transforms();
let mut target = target_link.world_transform().unwrap();
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
let arm = k::SerialChain::from_end(target_link);
// solve and move the manipulator angles
solver.solve(&arm, &target).unwrap();
println!("solved angles={:?}", chain.joint_positions());
chain.update_transforms();
let solved_pose = target_link.world_transform().unwrap();
println!("solved target pos = {}", solved_pose.translation);
}
API结构
顶级接口是 Chain
结构。它包含 Node
,并且它们具有节点之间的关系(父/子)。实际数据(关节角度(位置)、节点之间的变换)存储在节点内部的 Joint
对象中。
您可以获取节点的本地/世界变换。请参阅以下图例以了解节点的 local_transform()
和 world_transform()
。
OpenRR
社区
这里 是 OpenRR
用户和开发者的 discord 服务器。
依赖项
~7–14MB
~172K SLoC