#robot #path-planning

openrr-planner

机器人的避碰路径规划

7 个版本

0.1.0 2023 年 3 月 31 日
0.0.7 2022 年 12 月 9 日
0.0.6 2021 年 7 月 1 日
0.0.5 2021 年 3 月 29 日
0.0.3 2021 年 2 月 19 日

#99机器人

Download history 20/week @ 2024-03-11 19/week @ 2024-03-18 18/week @ 2024-03-25 40/week @ 2024-04-01 13/week @ 2024-04-08 13/week @ 2024-04-15 13/week @ 2024-04-22 14/week @ 2024-04-29 18/week @ 2024-05-06 22/week @ 2024-05-13 21/week @ 2024-05-20 15/week @ 2024-05-27 10/week @ 2024-06-03 18/week @ 2024-06-10 23/week @ 2024-06-17 17/week @ 2024-06-24

69 每月下载量
用于 7 个 crate(3 个直接使用)

Apache-2.0

89KB
2K SLoC

OpenRR Planner

crates.io docs docs

使用 Rust-lang 机器人避碰路径规划。这最初是 gear crate 的副本。

Video

文档

代码示例

最小代码示例

use std::{path::Path, sync::Arc};

use k::nalgebra as na;
use ncollide3d::shape::Compound;
use openrr_planner::FromUrdf;

fn main() {
    let urdf_path = Path::new("sample.urdf");
    let robot = Arc::new(k::Chain::from_urdf_file(urdf_path).unwrap());

    // Create path planner with loading urdf file and set end link name
    let planner = openrr_planner::JointPathPlannerBuilder::from_urdf_file(urdf_path)
        .expect("failed to create planner from urdf file")
        .collision_check_margin(0.01)
        .reference_robot(robot.clone())
        .finalize()
        .unwrap();
    // Create inverse kinematics solver
    let solver = openrr_planner::JacobianIkSolver::default();
    let solver = openrr_planner::RandomInitializeIkSolver::new(solver, 100);
    // Create path planner with IK solver
    let mut planner = openrr_planner::JointPathPlannerWithIk::new(planner, solver);
    let target_name = "l_tool_fixed";
    // Create obstacles
    let obstacles = Compound::from_urdf_file("obstacles.urdf").expect("obstacle file not found");

    // Set IK target transformation
    let mut ik_target_pose = na::Isometry3::from_parts(
        na::Translation3::new(0.40, 0.20, 0.3),
        na::UnitQuaternion::from_euler_angles(0.0, -0.1, 0.0),
    );
    // Plan the path, path is the vector of joint angles for root to target_name
    let plan1 = planner
        .plan_with_ik(target_name, &ik_target_pose, &obstacles)
        .unwrap();
    println!("plan1 = {plan1:?}");

    // Apply plan1 to the reference robot (regarded as the real robot)
    let arm = k::Chain::from_end(robot.find(target_name).unwrap());
    arm.set_joint_positions_clamped(plan1.iter().last().unwrap());

    // Plan the path from previous result
    ik_target_pose.translation.vector[2] += 0.50;
    let plan2 = planner
        .plan_with_ik(target_name, &ik_target_pose, &obstacles)
        .unwrap();
    println!("plan2 = {plan2:?}");
}

带有 GUI 运行示例

如何运行

cargo run --release --example reach

GUI 控制

  • 上/下/左/右/f/b 来平移 IK 目标
  • Shift + 上/下/左/右/f/b 来旋转 IK 目标
  • 输入 g 将机械臂末端移动到目标
  • 输入 i 仅为目标求解逆运动学而不进行碰撞检查
  • 输入 r 设置随机姿态
  • 输入 c 检查碰撞
  • 输入 v 切换显示元素的碰撞<-->可视

使用您的机器人

示例可以处理任何 urdf 文件(默认使用 sample.urdf)。它需要目标末端连杆的名称。

cargo run --release --example reach YOUR_URDF_FILE_PATH END_LINK_NAME

例如:

PR2

cargo run --release --example reach $(rospack find pr2_description)/robots/pr2.urdf.xacro l_gripper_palm_link

Video

通用机器人:UR10

cargo run --release --example reach $(rospack find ur_description)/urdf/ur10_robot.urdf.xacro ee_link

Sawyer movie

Sawyer

cargo run --release --example reach $(rospack find sawyer_description)/urdf/sawyer.urdf right_hand

UR5 movie

许可证

根据 Apache 许可证,版本 2.0 许可。

依赖项

~22–30MB
~433K SLoC