From MoveIt2
Step-by-step migration guide for MoveIt2 users.
API Mapping Table
| MoveIt2 Concept | Kinetic Equivalent |
|---|---|
MoveGroupInterface | Planner |
PlanningSceneInterface | Scene |
MoveIt Servo | Servo (kinetic-reactive) |
RobotModel | Robot |
RobotState | JointValues + KinematicChain |
PlanningScene | Scene + CollisionEnvironment |
MoveItCpp | kinetic::prelude::* |
Task Constructor | kinetic::task::Task |
collision_detection::World | CollisionEnvironment |
kinematics::KinematicsBase | IKSolver enum |
robot_trajectory::RobotTrajectory | TimedTrajectory |
planning_interface::MotionPlanRequest | Goal + PlannerConfig |
AllowedCollisionMatrix | AllowedCollisionMatrix |
Config Translation: MoveIt YAML to Kinetic TOML
MoveIt2 uses YAML files (generated by MoveIt Setup Assistant).
Kinetic uses a single kinetic.toml file per robot.
MoveIt2 YAML (joint_limits.yaml):
joint_limits:
shoulder_pan_joint:
has_velocity_limits: true
max_velocity: 3.15
has_acceleration_limits: true
max_acceleration: 5.0
Kinetic: Joint limits come directly from the URDF. No separate file needed.
Kinetic reads <limit> tags from your URDF automatically.
MoveIt2 YAML (kinematics.yaml):
arm:
kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin
kinematics_solver_search_resolution: 0.005
kinematics_solver_timeout: 0.05
Kinetic TOML:
[ik]
solver = "dls" # or "opw", "fabrik", "subproblem"
damping = 0.05
MoveIt2 SRDF (collision disable):
<disable_collisions link1="link5" link2="link7" reason="Never"/>
Kinetic TOML:
[collision]
skip_pairs = [["link5", "link7"]]
MoveIt2 SRDF (named poses):
<group_state name="home" group="arm">
<joint name="joint1" value="0.0"/>
<joint name="joint2" value="-1.5708"/>
</group_state>
Kinetic TOML:
[named_poses]
home = [0.0, -1.5708, 0.0, -1.5708, 0.0, 0.0]
8-Step Migration Checklist
-
Copy your URDF. Place it in
robot_configs/<name>/. Kinetic parses the same URDF format as MoveIt2. -
Create kinetic.toml. Translate your SRDF groups, named poses, and collision pairs. See the config translation above.
-
Replace MoveGroupInterface with Planner.
Planner::new(&robot)replacesMoveGroupInterface(node, "arm"). -
Replace PlanningSceneInterface with Scene.
Scene::new(&robot)replacesPlanningSceneInterface(). -
Replace Servo with kinetic Servo.
Servo::new(&robot, &scene, ServoConfig::default())replacesmoveit_servo::Servo(node, params). -
Update goal types. MoveIt2’s
setJointValueTargetbecomesGoal::Joints(...).setPoseTargetbecomesGoal::Pose(...). -
Replace trajectory execution. MoveIt2’s
execute()callsmove_group_->execute()through ROS action servers. Kinetic usesRealTimeExecutorwith aCommandSinkcallback. -
Remove ROS dependencies. Kinetic has zero ROS/ROS2 dependencies. Remove
rclcpp,moveit_ros_planning_interface, and related packages.
Before/After Code Examples
Planning a Joint-Space Goal
MoveIt2 (C++):
auto move_group = MoveGroupInterface(node, "arm");
move_group.setJointValueTarget({0.5, -0.5, 0.3, 0.0, 0.0, 0.0});
auto [success, plan] = move_group.plan();
if (success) move_group.execute(plan);
Kinetic (Rust):
#![allow(unused)]
fn main() {
let robot = Robot::from_name("ur5e")?;
let planner = Planner::new(&robot)?;
let start = vec![0.0, -1.5708, 0.0, -1.5708, 0.0, 0.0];
let goal = Goal::Joints(JointValues(vec![0.5, -0.5, 0.3, 0.0, 0.0, 0.0]));
let result = planner.plan(&start, &goal)?;
}
Adding Scene Obstacles
MoveIt2 (C++):
auto scene_interface = PlanningSceneInterface();
moveit_msgs::msg::CollisionObject obj;
obj.id = "table";
obj.primitives.push_back(box_shape);
obj.primitive_poses.push_back(table_pose);
scene_interface.applyCollisionObject(obj);
Kinetic (Rust):
#![allow(unused)]
fn main() {
let mut scene = Scene::new(&robot);
scene.add("table", Shape::Cuboid(0.8, 0.6, 0.02),
Pose::from_xyz(0.5, 0.0, 0.0));
let planner = Planner::new(&robot)?.with_scene(&scene);
}
Servo Teleoperation
MoveIt2 (C++):
auto servo = moveit_servo::Servo(node, servo_params);
servo.start();
// Publish TwistStamped to /servo_node/delta_twist_cmds
Kinetic (Rust):
#![allow(unused)]
fn main() {
use kinetic::reactive::{Servo, ServoConfig};
let servo = Servo::new(&robot, &scene, ServoConfig::teleop());
let cmd = servo.send_twist(&twist)?;
// cmd.positions and cmd.velocities ready for hardware
}
Key Differences from MoveIt2
| Aspect | MoveIt2 | Kinetic |
|---|---|---|
| Language | C++ (Python bindings) | Rust (Python bindings) |
| ROS dependency | Required (ROS2) | None |
| IPC | ROS topics/actions/services | Direct API or HORUS IPC |
| IK solver | Plugin (KDL, Trac-IK) | Built-in (OPW, DLS, FABRIK, Subproblem) |
| Collision | FCL | SIMD sphere model + CAPT broadphase |
| GPU support | None | wgpu trajectory optimizer |
| Configuration | YAML + SRDF + launch files | Single kinetic.toml |
| Thread model | ROS executor | Direct, zero overhead |