Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

From MoveIt2

Step-by-step migration guide for MoveIt2 users.

API Mapping Table

MoveIt2 ConceptKinetic Equivalent
MoveGroupInterfacePlanner
PlanningSceneInterfaceScene
MoveIt ServoServo (kinetic-reactive)
RobotModelRobot
RobotStateJointValues + KinematicChain
PlanningSceneScene + CollisionEnvironment
MoveItCppkinetic::prelude::*
Task Constructorkinetic::task::Task
collision_detection::WorldCollisionEnvironment
kinematics::KinematicsBaseIKSolver enum
robot_trajectory::RobotTrajectoryTimedTrajectory
planning_interface::MotionPlanRequestGoal + PlannerConfig
AllowedCollisionMatrixAllowedCollisionMatrix

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

  1. Copy your URDF. Place it in robot_configs/<name>/. Kinetic parses the same URDF format as MoveIt2.

  2. Create kinetic.toml. Translate your SRDF groups, named poses, and collision pairs. See the config translation above.

  3. Replace MoveGroupInterface with Planner. Planner::new(&robot) replaces MoveGroupInterface(node, "arm").

  4. Replace PlanningSceneInterface with Scene. Scene::new(&robot) replaces PlanningSceneInterface().

  5. Replace Servo with kinetic Servo. Servo::new(&robot, &scene, ServoConfig::default()) replaces moveit_servo::Servo(node, params).

  6. Update goal types. MoveIt2’s setJointValueTarget becomes Goal::Joints(...). setPoseTarget becomes Goal::Pose(...).

  7. Replace trajectory execution. MoveIt2’s execute() calls move_group_->execute() through ROS action servers. Kinetic uses RealTimeExecutor with a CommandSink callback.

  8. 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

AspectMoveIt2Kinetic
LanguageC++ (Python bindings)Rust (Python bindings)
ROS dependencyRequired (ROS2)None
IPCROS topics/actions/servicesDirect API or HORUS IPC
IK solverPlugin (KDL, Trac-IK)Built-in (OPW, DLS, FABRIK, Subproblem)
CollisionFCLSIMD sphere model + CAPT broadphase
GPU supportNonewgpu trajectory optimizer
ConfigurationYAML + SRDF + launch filesSingle kinetic.toml
Thread modelROS executorDirect, zero overhead