Crates.io | openrr-planner |
lib.rs | openrr-planner |
version | 0.1.0 |
source | src |
created_at | 2021-02-10 02:33:20.571906 |
updated_at | 2023-03-31 08:41:51.377242 |
description | Collision avoidance path planning for robotics |
homepage | |
repository | https://github.com/openrr/openrr |
max_upload_size | |
id | 353002 |
size | 227,890 |
Collision Avoidance Path Planning for robotics in Rust-lang.
This starts as a copy of gear
crate.
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:?}");
}
cargo run --release --example reach
f
/b
to translate IK targetf
/b
to rotate IK targetg
to move the end of the arm to the targeti
to just solve inverse kinematics for the target without collision checkr
to set random posec
to check collisionv
to toggle shown element collision<->visualThe example can handle any urdf files (sample.urdf is used as default). It requires the name of the target end link name.
cargo run --release --example reach YOUR_URDF_FILE_PATH END_LINK_NAME
For example,
cargo run --release --example reach $(rospack find pr2_description)/robots/pr2.urdf.xacro l_gripper_palm_link
cargo run --release --example reach $(rospack find ur_description)/urdf/ur10_robot.urdf.xacro ee_link
cargo run --release --example reach $(rospack find sawyer_description)/urdf/sawyer.urdf right_hand
Licensed under the Apache License, Version 2.0.