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 算法

Download history 74/week @ 2024-04-27 96/week @ 2024-05-04 136/week @ 2024-05-11 129/week @ 2024-05-18 120/week @ 2024-05-25 77/week @ 2024-06-01 89/week @ 2024-06-08 82/week @ 2024-06-15 82/week @ 2024-06-22 112/week @ 2024-06-29 98/week @ 2024-07-06 105/week @ 2024-07-13 86/week @ 2024-07-20 184/week @ 2024-07-27 155/week @ 2024-08-03 50/week @ 2024-08-10

每月489次下载
11 个crate中(8个直接) 使用

Apache-2.0

155KB
2.5K SLoC

k: rust-lang的运动学库

Build Status crates.io codecov docs discord

k 具有以下功能。

  1. 正向运动学
  2. 逆向运动学
  3. URDF加载器

k 使用 nalgebra 作为数学库。

请参阅 文档 和 examples/ 获取更多详细信息。

构建示例的要求

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

带GUI的IK示例

cargo run --release --example interactive_ik

ik_sample

按下以下键来移动操作器的末端。

  • f: 向前
  • b: 向后
  • p: 向上
  • n: 向下
  • l: 向左
  • r: 向右
  • z: 重置操作器的状态。
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 对象中。

ik_sample

您可以获取节点的本地/世界变换。请参阅以下图例以了解节点的 local_transform()world_transform()

ik_sample

OpenRR 社区

这里OpenRR 用户和开发者的 discord 服务器。

依赖项

~7–14MB
~172K SLoC