Skip to main content

10.2.0

· 60 min read

Major Features​

Camera Calibration Objectives​

You can now calibrate a camera against your robot with four Objectives:

  • Calibrate Eye In Hand Camera for a wrist-mounted camera
  • Calibrate Eye To Hand Camera for a fixed one
  • Calibrate Multiple Cameras for any mix of both in a single motion pass
  • Calibrate Camera Intrinsics for the camera's own lens model

You can also print a ChArUco board from the new board editor and let Generate Calibration Waypoints plan the views; the robot then moves through them, detects the board, solves the calibration, warns when the fit is poor, and reports the camera pose. See the camera calibration guide.

Collision Checking Controls for RRT Planning​

Collision checking in the ProRRT planning Behaviors is now tuned from a single collision-check setting. An opt-in sanity check re-validates every planned trajectory, replans from a new seed when it finds a collision, and fails naming the colliding bodies rather than returning a trajectory that tunnels through an obstacle; on the collision-tunneling benchmark it cuts residual tunneling roughly 7 to 12 times. The same setting sets the checking resolution in workspace terms, so joints that sweep the robot through large arcs are checked more finely, and pads both the robot's links and the world's objects. Every control is off by default, so existing plans are unchanged until you turn one on, as motion planning best practices describes. Core

Mimic Joints Across Planning and Control​

Planning groups that contain mimic joints, such as a linkage-driven gripper, now work end to end. Motion planning, inverse kinematics seeding, and per-joint planning costs all accept them: the mimic joints follow the joint they are geared to, only the actively driven joints are commanded, and the Joint Control tab no longer offers to jog a joint that cannot move on its own. The Runtime also checks at load time that no mimic joint can be driven past its own position, velocity, acceleration, or jerk limits, and refuses to start with an error naming the joint and the fix rather than running a robot model whose mimic joint can exceed its own limits. Core

Train VLA Policies in the Cloud from the Desktop App​

The Trainer UI sidebar can now send a dataset to RunPod and bring back a trained Vision-Language-Action (VLA) policy without leaving the Desktop App. Store the RunPod credentials once, review the paid resources before they start, watch training progress live, and publish the checkpoint when it finishes; Trainer verifies that the cloud resources are cleaned up and configures the result for ExecutePolicy. Each checkpoint carries a policy manifest recording the frame rate, robot-state width, camera mapping, and base model and dataset revisions it was trained with, so it can be configured from its Hugging Face revision alone, as Train a VLA Policy with Trainer shows.

Evaluate a Policy Before You Trust It​

The Trainer UI sidebar's new Evaluate tab runs a task Objective for a fixed number of trials and reports how many passed, with the range the pass rate would likely fall in over many more trials. Supply a reset Objective to set up each trial and a scoring Objective to judge it, and the same loop that runs from the Desktop App runs from a script. Evaluate a VLA Policy explains how trials are scored and how to write both Objectives.

Import and Review LeRobot Datasets​

Datasets published on Hugging Face can now be brought into the Trainer UI sidebar and judged episode by episode before they shape a policy. Play each episode with its Dataset Signals and matched camera views, keep or reject it, and import the kept and unreviewed episodes for training. The reverse direction is covered too: a Prepare and Upload workflow validates a LeRobot dataset and publishes it to Hugging Face Hub, with add-only or local-override updates and reusable credentials.

Qualcomm Dragonwing NPU Acceleration​

MoveIt Pro now runs Open Neural Network Exchange (ONNX) models on the Hexagon neural processing unit (NPU) of Qualcomm Dragonwing processors. On a Snapdragon host the moveit_pro command selects the Qualcomm-enabled ARM64 image and offers to install the packages the NPU needs. Models exported from Qualcomm AI Hub for the Qualcomm AI Engine Direct runtime run on the NPU automatically, and the shipped segmentation Behaviors accept Segment Anything Model (SAM3 and SAM2) exports from AI Hub. Configure Qualcomm Dragonwing takes a board from flashing Ubuntu to a connected Desktop App.

Stereo Visual Odometry​

A robot that cannot trust its wheel odometry can now estimate its own motion from a synchronized stereo camera pair. Stereo visual odometry publishes the estimate as standard ROS odometry, runs on the CPU with the ALIKED and LightGlue feature models, and is started, reset, stopped, and queried from a Behavior Tree or a service. The lunar_sim reference application demonstrates it on a Husky A300.

A Path-Traced Camera Renderer for the Simulator​

Simulated cameras can now render with Nyx, an optional path-traced renderer, publishing alongside or in place of the MuJoCo camera topics. It runs on amd64 NVIDIA and AMD ROCm images once its runtime is installed, and nothing changes until a configuration that supports it opts in.

A Sidebar for Every 3D Visualizer Display​

The 3D Visualizer has a sidebar that lists every display with its settings and a search box, so a display's options are found by name instead of hunted through menus. Open it from the navbar, the V key, or the View menu, where each display row now links into the sidebar for its settings. Point Cloud Snapshots gain an adjustable point size there, remembered across reloads.

The 3D Visualizer now shows a mobile base's navigation stack at work, not only its global plan. Live laser scans overlay the navigation map, with the point size and color of each sensor source adjustable. The Nav2 local plan and the controller's candidate trajectories are drawn alongside the global plan, each with its own toggle under Navigation in the View menu, with candidate-trajectory sources discovered automatically and off by default. The velocity the controller is commanding appears as an arrow for the linear velocity and an arc for the yaw rate, with both values labeled in the corner of the pane, so you can see what the base was told to do at the moment it did it.

Approve Planned Trajectories Before the Robot Moves​

A new Require approval before every robot motion setting previews each planned trajectory for approval before the robot follows it, without editing any Behavior Tree, including trajectories in Objectives you did not write. Turning it on asks for confirmation and explains what the approval gate covers: Behaviors that stream controller commands and teleoperation jogging are not gated, and it is a debugging aid, not a safety interlock.

Motion Speed Controls for Objectives and Teleoperation​

Objective motion speed on the Joint Trajectory Admittance Controller is set from the Motion Speed group in Settings, with the current percentage beside the slider and an indicator in the title bar whenever the robot is set below full speed, so a slowed robot is easy to spot, as controlling end effector speed describes. Teleoperation has its own speed, shown below the mode tabs, with an independent setting for each mode.

Enhancements​

Integrated AI Models and GPU Acceleration​

  • Trainer's recording controls can save an episode and continue recording, save and stop, or stop and discard the current episode. In the Desktop App, Until I Stop mode has its own reset delay, which defaults to no pause between episodes; a direct /trainer/start_recording call gets the same result by sending reset_time_s: 0, and a call that omits the field keeps the service's 5-second default. In Until I Stop mode, a Quest recording session ends after its episode is saved, so each Quest save produces one episode.
  • Trainer's LeRobot export stores camera streams as H.264 MP4 video again instead of PNG frames, so converted datasets are far smaller and load as standard LeRobot video datasets. Converting a recording whose camera topic holds H.264 or H.265 video packets now fails with an error naming the camera; record cameras as sensor_msgs/Image or sensor_msgs/CompressedImage.
  • A LeRobot pi0.5 fine-tuned checkpoint can be exported to a MoveIt Pro model bundle for LibTorch, ONNX Runtime, or both with the pi05-export command, or with the export-model workspace skill after training with train-model. The bundle carries the checkpoint's normalization statistics, camera mapping, joint order, and tokenizer, and a checkpoint with missing or conflicting facts is refused. The new Pi05 policy in moveit_pro_ml loads such a bundle and predicts action chunks on LibTorch from camera frames, joint state, and a task prompt.
  • NVIDIA CUDA images now include LibTorch for native TorchScript inference. Select the LibTorch runtime and CUDA device through model configuration; development images retain the headers for custom C++ integrations.
  • The NVIDIA CUDA image now ships ONNX Runtime 1.30.0, which loads the SAM3 models on the CPU when CUDA is unavailable.
  • GetMasks2DFromExemplar and GetMasks2DFromPointQuery run Qualcomm AI Hub SAM3 and SAM2 exports on the Hexagon NPU. Point the Behavior's model_bundle_manifest port at a bundle manifest for the export, as Configure Qualcomm Dragonwing describes. SAM3 exports take text prompts only, and SAM2 exports take at most two foreground points.
  • MoveIt Pro automatically configures supported AMD GPUs for VLA inference without requiring the AMD Container Toolkit.
  • Trainer's Record and Prepare tabs have a copy button beside the training data path, and the Training panel no longer scrolls sideways when a recorded dataset's path is too long to fit.

New Behaviors and Libraries​

  • DetectCharucoBoard, RecordCalibrationSample, ResetCalibrationSamplesVector, SolveEyeInHandCalibration, and SolveEyeToHandCalibration calibrate the pose of a camera mounted on the robot (eye-in-hand) or fixed in the workspace (eye-to-hand) from a ChArUco board.
  • RefineCalibrationBundleAdjustment and GetRefinedCameraCalibration jointly refine all camera calibrations by minimizing reprojection error over the recorded board corners, and report the fit before and after refinement.
  • GenerateCalibrationViews generates a ring of views around the current end effector pose that tilt about the board and shift across the image, and solves a collision-free joint state for each one.
  • CalibrateCameraIntrinsics calibrates a camera's focal lengths, principal point, and distortion from collected calibration samples and checks the intrinsics the camera publishes against the result. It takes the samples, the camera's name, and its CameraInfo, and outputs the calibrated CameraInfo.
  • GetWaypointNames retrieves the names of saved waypoints that start with a given prefix.
  • AccumulateSurfaceCoverage and RecordSurfaceCoverage paint the part of a target surface a tool has already treated and accumulate it across sweeps. Place AccumulateSurfaceCoverage beside the motion in a Parallel.
  • CropPosesToPointCloudFootprint keeps only the poses lying over the area a point cloud covers, and ExtractDominantPlaneFromPointCloud keeps only the points on a cloud's largest flat surface, so a path built on it follows that surface.
  • WaitForConditionFromGeminiQuery asks Gemini a yes/no question about the latest image from a camera topic and succeeds on the first yes. Run it next to a long-running Behavior such as ExecutePolicy under a Parallel to end that Behavior when the model judges the task done. It fails when it waits longer than message_timeout_sec for a new image or keeps failing calls for that long, and it needs GOOGLE_GEMINI_API_KEY and network access.
  • WaitForUserDecision shows its prompt text at the top of the Desktop App view, beside the other approval prompts, with an approve_label button that returns SUCCESS and a reject_label button that returns FAILURE, so an Objective can branch on the user's answer. It fails with an error when no Desktop App is connected or nobody answers within timeout_sec seconds.
  • PublishGhostRobotState publishes a robot state for the 3D Visualizer to render as a ghost robot, and clears it again when its hide port is set.
  • GetLaserScan, GetOccupancyGrid, ScanMatchResidual, and ReinterpretPoseFrame join the navigation Behaviors. With them an Objective can refine a particle-filter localizer's estimate without moving the robot and accept it only if the live laser scan fits the map, as the Nav2 guide shows in hangar_sim.
  • CallEmptyService calls a std_srvs/srv/Empty service.
  • StartStereoVisualOdometry, StopStereoVisualOdometry, ResetStereoVisualOdometry, and GetStereoVisualOdometryStatus control stereo visual odometry from a Behavior Tree. The ControlStereoVisualOdometry service does the same from outside one, and setting the read-only autostart parameter or launch argument to true starts tracking as the component loads.
  • SetMujocoFreeBodyPoses moves objects that have a free joint in the MoveIt Pro Simulator to the poses in poses, one per name in body_names, all in one simulation step. Each pose can be in any frame that connects to mj_world in the transform (TF) tree.
  • IsBlackboardVariableSet returns SUCCESS when a blackboard variable has been written to and FAILURE when it is unset, so an Objective can branch on whether a value exists.
  • Finally is a new control node for guaranteed cleanup. Its second child runs after the first child succeeds, fails, or throws, and when the Objective is stopped, for example to re-enable a collision rule after an operation that may fail. When an Objective is stopped, the cleanup branch runs to completion, motion and gripper commands included, for up to halt_timeout_msec milliseconds (10000 by default).

Behavior and Library Improvements​

  • ExecutePolicy now pauses at rest and resumes when the policy's next action chunk arrives late, instead of failing the run. It warns once per run when pausing begins and reports the pause count and total paused time at the end. The total_action_steps budget now counts executed policy motion only, so neither the wait for the first chunk nor a pause consumes it, and a run takes correspondingly longer in wall time.
  • PlanToJointGoal now names the offending joint, the value it was given, the limit it violated, and by how much when a joint goal is outside limits, in the joint's own units, and says whether that limit came from the robot model or from a joint range constraint.
  • PlanToJointGoal, SetupMTCPlanToRobotState, SetupMTCConnectWithProRRT, SetupMTCPlanToPose, PoseJog, and JointJog can pad world objects: set override_scene_world_padding: true and world_padding in meters in their collision_check_params input port, or use the port's field editor. Octree and plane shapes cannot be padded, so world padding adds no margin around an octomap.
  • PoseJog and JointJog accept the same collision_check_params input port as the ProRRT planning Behaviors for their collision-check padding, with their standalone link_padding port deprecated the same way. The teleoperation Objective's padding inputs now cover PoseJog as well as its planning Subtrees.
  • PlanToJointGoal can be subclassed: pass an ExtraValidator to its constructor to reject joint-space configurations the built-in collision and constraint checks accept, and inherit the rest of the Behavior unchanged.
  • TransformPoseFrame, CalculatePoseOffset, PlanCartesianPath, and the other core pose-consuming Behaviors now resolve a PoseStamped input at the pose's own timestamp, so a pose captured by a moving camera keeps its original intent; a timestamp too old for the transform buffer falls back to the latest transform and reports it instead of failing.
  • GenerateSurfaceCoveragePath can now follow a scanned surface. Wire a point cloud to its new point_cloud port and set projection_mode to SURFACE: the region is read as a 3D selection box (its +Z axis toward the tool, its X axis along the sweep), the raster is projected onto the points inside it, and the path keeps the standoff from the measured surface with the tool held within orientation_cap of the box axis. The new orientation_offset port turns the tool about the waypoint's own axes in either mode. Without a cloud the Behavior sweeps the region's top face as before; it is now asynchronous, returning RUNNING while the path is generated.
  • GenerateSurfaceCoveragePath now takes its raster layout from a single raster_layout port of the new RasterLayout message (line spacing, point spacing, margin, and lines along the region X or Y axis), with a Desktop App dialog that previews the raster, its waypoint count, and path length over the node's region before you run the Objective. The line_spacing, point_spacing, and margin ports still work but are deprecated; move their values into raster_layout.
  • GetOrientedBoundingBoxFromPointCloud can now take its X and Y axes from the reference pose with align_xy_to_reference, for flat regions whose own principal axes are meaningless.
  • GetPoseFromPixelCoords has a new optional camera_info input that takes the clicked image's CameraInfo. Set it when the point cloud comes from a different camera than the image, so the pose lands on the point you clicked.
  • GetPoints2DFromGeminiQuery now defaults to the gemini-robotics-er-2-preview model, because Google no longer serves gemini-2.5-flash to new API keys, and a failed Gemini request now reports Google's error message instead of the raw JSON body.
  • CalibrateCameraPose is deprecated in favor of the Calibrate Eye To Hand Camera Objective, which calibrates a fixed camera from a printed ChArUco board mounted on the arm instead of the AprilTag calibration tool. The Behavior still works but will be removed in a future version; the camera calibration guide covers the replacement workflow.
  • SetInitialPose takes an optional pose to seed the localizer at, such as a pose an operator places.
  • GetOdom has a new odometry_twist output port. It holds the odometry twist as a TwistStamped, stamped with the odometry time and expressed in the odometry child_frame_id.
  • AddURDF can now display a URDF's visual geometry as well as adding its collision geometry to the planning scene. It is off by default; set show_visual_geometry to true and the object renders as authored, with its own meshes and materials, alongside the collision shapes. Planning and collision checking still use <collision> geometry only.
  • Move to Joint State, Move to Named Waypoint, and Move to Named Waypoint (JTC) have a require_user_approval port. Set it to true to preview the planned trajectory and wait for approval before the robot moves, as Move to Cartesian Pose already does.
  • ComputeInverseKinematics, SolveIKQueries, ValidateTrajectory, ComputeSignedDistanceField, GenerateVacuumGraspPoses, and GenerateCalibrationViews now report why a planning scene message could not be applied instead of a generic "Error setting the planning scene".
  • BreakpointSubscriber now derives a topic of its own when breakpoint_topic is left empty, and reports that topic in the topic field of /breakpoint_encountered. Custom tooling that compares that field against /moveit_pro_breakpoint should treat it as an opaque value to publish back to instead.
  • JointTrajectoryAdmittanceController reports reference velocities and accelerations on its controller_state topic in wall-clock time when time_scale_percentage is below 100, and its admittance response adds to the wall-clock reference velocity.

Simulation Improvements​

  • The MoveIt Pro Simulator now publishes its full state vector on /mujoco/qpos_stamped, with the model's kinematic mapping on /mujoco/qpos_schema, so external tools can mirror bodies such as cables and hoses that were previously visible only inside the simulation. Set qpos_publish_rate to change the rate or to zero to disable it; publishing is on by default at 60 Hz.
  • A camera-based 3D lidar in the MoveIt Pro Simulator can add sensor noise. Set range_noise_stddev, range_noise_mean, dropout_probability, and noise_seed in its URDF <sensor> block, as the image-based lidar section describes.
  • A camera-based 3D lidar in the MoveIt Pro Simulator can publish a LaserScan instead of, or as well as, its point cloud. Set lidar_output to scan or both in its URDF <sensor> block, with scan_topic and scan_row to choose the topic and the ring. The scan is published in a <camera_name>_ROS frame the Simulator broadcasts, so it can replace a node that flattens the cloud into a LaserScan. If your configuration already publishes a static <camera_name>_ROS frame for such a node, remove it when you turn on the scan.
  • A MuJoCo camera's <sensor> block accepts color_enabled; set it to false to keep an RGB-D camera's depth image and point cloud while leaving its color and camera_info topics to another publisher, as Create MoveIt Pro Simulator Models describes.

Discovery and Security​

  • A deployment can point at an inference server on another machine over verified HTTPS, as endpoint authentication describes. moveit_pro inference-key prints an inference-only key with no access to the Runtime's other endpoints, and the inference server that moveit_pro run starts now receives it as MOVEIT_INFERENCE_KEY, which the vla_sim example's server and adapter use. A custom inference server should require it as its bearer token, a custom adapter should send it, and a deployment started without the moveit_pro command must set it. Passing MOVEIT_FRONTEND_KEY to the inference server is deprecated and will be removed in a future release. With an HTTPS INFER_URL, Trainer's Configure for ExecutePolicy verifies a checkpoint and reports its ExecutePolicy settings and the serving settings to set on the inference host.
  • MoveIt Pro Runtime logs now correlate Desktop App Objective activity with the client IP observed by the WebSocket bridge.

Misc User Interface Improvements​

  • A failed motion plan's alert now offers Inspect failed plan in Task Constructor Debugger, which opens the debugger on the stage where planning ran out of solutions. This also fixes the Task Constructor Debugger's planning-iteration history, which previously stayed empty, and with it the debugger icon shown on a planning Behavior in the Behavior Tree view.
  • JSON files saved by SaveMTCTaskInspection can be imported into the Task Constructor Debugger to inspect saved planning stages, failures, and trajectories.
  • When a planning Behavior refuses a pose for collision, the 3D Visualizer now draws the collision geometry inflated by that check's link padding over the rejected pose, so the clearance the check demanded is visible instead of appearing as empty space around the contact points. The rejected robot configuration is also drawn when a joint goal is refused for being outside limits or outside an orientation constraint tolerance, as it already was for a goal in collision.
  • Breakpoints can now be set from the Behavior Tree node actions, and each one is resumed on its own instead of continuing every breakpoint at once.
  • The Ports panel lists deprecated ports after active ports under a labeled divider, so current ports are easier to find on Behaviors that still carry deprecated ones, and a port value can be returned to unset from the Edit Menu, so it falls back to its default instead of being authored as an empty string; an unset port is marked as such with the default it will use.
  • The Alert Sidebar and its settings were reworked. Alerts show the time they arrived, down to the second, with the date on hover. Alert Settings sets severities separately for toast messages and the Alert Sidebar, replacing the single Toast Notifications switch: toasts are limited to errors by default, the sidebar keeps listing errors, warnings, and info, the bell icon counts whatever no longer appears as a toast, and the two severity lists sit side by side with the arrow keys moving between them. Editor alerts now appear in the Alert Sidebar from the first launch, alongside Runtime alerts, instead of staying hidden until an Objective is opened in the editor; deselect either source under Alert Settings. Upgrading keeps a deselected Runtime source but restores Editor once.
  • Camera panes can overlay the robot and 3D scene on the camera image using the camera's calibration, with adjustable image opacity, so a calibration can be checked by eye.
  • The 3D Visualizer draws camera frusta, with live and recorded camera images positioned in the scene and per-camera controls in the sidebar.
  • Named visualization configurations can be saved and loaded from View, then Configuration, in a 3D Visualization pane to switch pane layouts, display settings, TF selections, and individual robot-link visibility. Terminal panes restore through normal startup and respect the Runtime's host-shell permissions.
  • The Particle Filter overlay under Navigation in the View menu is now enabled by default for every discovered particle-cloud topic, so a mobile base shows its localization without being configured for it. Disable a source to opt out; the choice is saved in your browser. Upgrading to 10.2 ignores Particle Filter visibility choices saved on an earlier release, so a source you had disabled comes back enabled once.
  • The Commanded Velocity overlay is enabled under Navigation in the View menu. The navigation overlays' topics are Desktop App settings: nav2LocalPlanTopic for the Nav2 local plan, nav2CmdVelTopic (default /cmd_vel) for the Commanded Velocity overlay, and nav2CmdVelFrame for the frame of a publisher that sends an unstamped geometry_msgs/Twist.
  • The 3D Visualizer renders a translucent ghost robot from moveit_msgs/DisplayRobotState messages published on /display_robot_state, so an Objective can show a suggested robot configuration without planning a trajectory for it. Toggle it under View, Display, Robot - Display State.
  • A Surface Coverage layer in the 3D Visualizer, with a legend and a visibility toggle in the View menu, fills in live the part of a target surface a tool has treated as it sweeps, recorded from where the tool actually went rather than where it was asked to go, and the history survives the Objective run that produced it. GenerateSurfaceCoveragePath gained a preview dialog that shows the raster, waypoint count, and path length before the Objective runs.
  • An optional TF label overlay keeps frame names readable through robot and scene geometry while preserving normal axis occlusion.
  • The 3D Visualizer's measurement tool, now Measure distance and coordinates, reports the position under the cursor in the active fixed frame, in the readout and on a label beside the point, and snaps to the point a point cloud actually holds, so you can read a sensor coordinate without placing an object there.
  • Each point cloud source in the 3D Visualizer sidebar offers a Reduced Stream choice. It streams that source at about a tenth of the bandwidth for a MoveIt Pro Desktop App on a remote link, while other viewers keep full quality.
  • Robot link colors and transparency can be changed in the Desktop App by setting PlanningScene.object_colors IDs to URDF link names. Use alpha zero to hide a link's visuals without hiding its children or disabling collision checking, as interacting with the planning scene describes.
  • The Pose teleoperation settings gained a Jog Collision Checking toggle, so an operator can jog the end-effector out of a collision without leaving the manual-control panel.
  • A persistent GPU Status pane shows the configured GPU deployment settings separately from the observed simulation, ML inference, device, driver, renderer, and execution-provider outcomes, and a read-only GPU status command and endpoint collect the same diagnostics for support.
  • The Desktop App can start a MoveIt Pro Runtime on the computer it is running on (Linux only). Click the Quickstart tab on the connection screen, pick an example robot configuration, and click Launch; the app shows the Runtime's log, connects when it is ready, and shuts it down again with Stop. Quickstart opens first when there are no saved connections and no running Runtimes, as Connect with the MoveIt Pro Desktop App shows.
  • The Desktop App can be locked to Operator mode, which runs, stops, and resets Objectives but hides editing, or to Read-Only mode, which only watches, from Desktop App Settings on the connection screen. A password you create protects the setting, and both modes stay off until you turn one on.
  • The Desktop App opens with a short introduction on first run, recommending PickNik's free live monthly training course, integration services, and tutorials, with a "Don't show me this again" checkbox.
  • The Desktop App is more responsive while following active nodes in expanded Behavior Trees.
  • The Desktop App window title names the connected Runtime's version when it differs from the Desktop App's.

Reference Application Changes​

  • so101_base_config and so101_sim are new configurations for the SO-101 arm: a mock-hardware simulation with joint and pose teleoperation, the XLeRobot fin gripper in place of the stock jaws, a driver for the physical arm over the Feetech STS3215 servo bus with torque that follows the ros2_control lifecycle, and leader-arm mirroring and calibration tooling.
  • rebot_bench_base_config and rebot_bench_sim are new configurations for the reBot B601-RS bench, with a RobStride hardware backend and a MuJoCo twin of the bench.
  • lunar_sim was rebuilt as a Husky A300 lunar simulation: a cratered heightfield with non-repeating regolith, a star field and far horizon, moon base landmarks and boulders, A300 lidars, a mast scene camera, and an arch-mounted OAK-D Pro whose stereo renders feed stereo visual odometry. The new lunar_sim_behaviors package adds TeleoperateBase, which drives the base over cmd_vel during teleoperation.
  • hangar_sim now navigates on the fused localization estimate instead of simulation ground truth, feeds both lidar scans to AMCL (Adaptive Monte Carlo Localization) without merging them, refines localization in place with a fit-to-map gate, publishes and visualizes the MPPI (Model Predictive Path Integral) local plan, shows the commanded velocity overlay by default, re-seeds AMCL after a simulation teleport, and ports the image-based lidar.
  • lab_sim gained surface coverage demo Objectives, a closed-loop AprilTag counterpart to the 3 Waypoints Pick and Place demo, and support for the Nyx path-traced camera renderer.
  • vla_sim gained a scripted red-block pick demonstration for data collection, Objectives that end the policy run once the cubes are stacked, Objectives for evaluating the cube-stacking policy, verified HTTPS for remote inference with the inference key, serving on the host GPU target (including ROCm), and /health and /status endpoints that report the serving precision and loaded configuration.
  • hand_eye_calibration_sim gained a Move to Home Objective, bigger calibration boards, an intrinsic calibration start pose, and a listing in the launcher.
  • factory_sim configures its bin poses in YAML and derives the rim, crop, and drop poses from them, and times the bracket pick-and-place cycle with the Stopwatch Behaviors.
  • kitchen_sim and dual_arm_sim are standalone configurations built on a vendored franka_description 2.9.0; franka_base_config was removed, and both packages attribute their third-party MuJoCo models and meshes.
  • space_satellite_sim_camera_cal was removed; the hand_eye_calibration_sim configuration and the Calibrate Eye To Hand Camera Objective replace it.
  • All configurations migrated their deprecated link_padding ports to collision_check_params, use the 10.2 Runtime launch entry point, and set goal tolerances that satisfy the Joint Trajectory Admittance Controller's enforced goal tolerance.
  • kinova_sim, in moveit_pro_kinova_configs, lowers the Robotiq MuJoCo actuator damping and sets stall_velocity_threshold so blocked gripper closes settle and succeed, and the Robotiq mock hardware no longer declares command interfaces on mimic joints.

Documentation Improvements​

  • The C++ API reference is now part of the documentation site, sharing its navigation and search instead of living on a separate Doxygen site.
  • Added a Vision Language Model (VLM) Prompting Best Practices guide covering coordinate conventions, hallucination control, reference images, and evaluating prompt changes when using a VLM from a Behavior Tree.
  • Added a Whole-Body Motion concept page describing how MoveIt Pro represents and executes coordinated mobile-base and arm motion, and which base types that model supports.
  • Added Visualize a Ghost Robot, covering the topic, the Behavior, and which message fields are rendered.
  • Added End a Policy Run on a Signal, a guide to ending an ExecutePolicy run as soon as the task is done, with a cube-pose check and a Gemini detector as vla_sim examples.
  • Added Train a VLA Policy with Trainer and Evaluate a VLA Policy, covering cloud training from Trainer and how each evaluation trial is scored, how to write a reset Objective and a scoring Objective, and how to run evaluations from a script.
  • Added a Localization Tuning guide for tuning and measuring a mobile base's AMCL and odometry localization stack.
  • Added a Mobile Base Support page that summarizes the localization, mapping, navigation, sensors, and drive types MoveIt Pro supports for mobile bases.
  • Added Require Approval for All Motion, covering the approval setting and the require_user_approval port.
  • Added Collect a Support Bundle, covering collection levels, sensitive artifacts, size limits, archive review, and manual transfer.
  • Added Configure Qualcomm Dragonwing, a step-by-step guide for running the MoveIt Pro Runtime on Qualcomm Dragonwing boards, from flashing Ubuntu through NPU package setup to a connected Desktop App.

Other Improvements​

  • moveit_pro configure now asks its questions on one screen when run in a terminal. The user workspace and robot configuration are chosen from a list of what is on disk, answered questions stay visible, ← or backspace goes back to change one, and typing on a list enters a value it does not offer. The GPU validation rows update as each check finishes.
  • moveit_pro support-bundle, and Generate Support Bundle in Desktop App Settings, collect a diagnostic archive with selectable categories and collection levels, a manifest to review, and credential scrubbing, including when the Runtime is stopped. Collect a Support Bundle describes what each level gathers.
  • Each moveit_pro run now saves its console output and per-service exit records, including out-of-memory status, under ~/.ros/log_moveit_pro/moveit_pro_runs/<run>/ (under MOVEIT_HOST_LOG_DIR when set), with moveit_pro_runs/latest pointing at the most recent run, so a later command or relaunch no longer overwrites the output of a failed run. Each run keeps up to 1 GiB of console output, the start of the run plus its newest 64 MiB, and old runs are removed to keep the directory under 10 GiB and 100 runs; records are retained for MOVEIT_DIAGNOSTICS_RETENTION_DAYS, 14 by default. ~/.config/moveit_pro/last_moveit_pro_run.log now stops at 1 GiB.
  • The MoveIt Pro Runtime keeps a durable record of every failed Objective on the robot host, in the run directory's decision_log.jsonl, with the execution ID, Objective name, failure class, reason, and the Behavior error messages, and the Desktop App shows that retained failure history, so support can read why an Objective failed after the Desktop App is closed or the stack restarts.
  • Crashes now leave a trace in the console log: a Python process in a MoveIt Pro container that dies on a fatal signal such as a segmentation fault prints its Python traceback (set PYTHONFAULTHANDLER= to an empty value in the container environment to turn this off), and a crash in a Runtime composable node prints a stack trace in the same format as crashes in move_group and the Objective server.
  • The Model Context Protocol (MCP) server can now create and update Objectives, and complete custom Behavior packages with their build, plugin, and test wiring, from shipped authoring guidance, with validated and revision-checked edits that take effect without a workspace build or Runtime restart. It finds loaded Behaviors through compact, searchable results, requests port details only for the nodes you need, and searches Objectives by name, description, and category.
  • Host-user MCP sessions can start and cancel Objectives by goal ID, capture camera snapshots with camera poses and depth-backed point measurements (with optional Gemini scene inspection), and save named SSH target profiles that generate compact remote client entries. Policies are optional restrictions, and approvals follow the MCP client's settings.
  • moveit_pro mcp serve no longer needs --workspace or --config-package. It binds the running Runtime, or the configured workspace and config package when none is running, so claude mcp add --scope user moveit-pro -- moveit_pro mcp serve and codex mcp add moveit-pro -- moveit_pro mcp serve connect an agent to whichever Runtime you launch; with several Runtimes running, pass --instance <name> (--instance default for the unnamed deployment) or start the client inside that Runtime's workspace. moveit_pro mcp session list shows the MCP sessions on a host, which client and target each belongs to, and whether its launcher is still running, and an MCP button in the Desktop App's Host and AI Assistant terminals copies a ready-made Claude Code or Codex connection command for the connected Runtime.
  • The MOVEIT_WEBRTC_BITRATE and MOVEIT_WEBRTC_MAX_RESOLUTION Runtime settings lower the bandwidth camera panes use on constrained networks. Frames larger than the configured resolution are scaled down with their aspect ratio kept, and the 3D camera overlay keeps working on scaled streams.
  • Behavior Tree logs (.btlog) now write each node in the explicit <Action ID="..."> form, or Control, Decorator, or Condition, instead of an element named after the node type. Groot2 opens both forms. Update any custom tool that parses the tree XML inside a .btlog file.
  • The moveit_pro command asks you to accept Meta's SAM License before building the moveit_pro_sam3 package, states the field-of-use restriction the license carries, and excludes the package from the build if you decline. The prompt is shown again each time the example workspace is cloned or upgraded, even if you answered before; declining the upgrade, unattended runs, and runs with MOVEIT_ACCEPT_SAM3_LICENSE set keep the current answer, which you can also change with moveit_pro configure --sam3-license accept or moveit_pro configure --sam3-license decline.
  • On Qualcomm Snapdragon hosts missing the FastRPC packages, moveit_pro run offers to install qcom-fastrpc1 and qairt-dsp-binaries instead of only stopping.
  • Build failures now name the command that resumes the interrupted build.

MoveIt Pro Core​

The changes below ship to every MoveIt Pro customer. They are collected here because they also reach MoveIt Pro Core customers, who install the standalone Core archive rather than the full Application Platform. Major Features, bug fixes, and breaking changes that reach Core appear in their own sections, marked with the Core badge.

  • Motion planning now accepts planning groups that contain mimic joints. Inverse kinematics seeds and solutions cover the actively driven joints and mimic joints follow their driving joint, joint costs apply in both optimize_distance inverse kinematics and the motion planner cost ports, with a mimic joint's motion priced through its driving joint's cost, and the /get_planning_groups service reports each group's actively driven joints in a new active_variable_names field, with the existing variable_names field unchanged. A mimic joint's own position limits are not yet enforced during planning; the driving joint's limits and collision checking apply.
  • MoveIt Pro validates mimic joint position, velocity, acceleration, and jerk limits when loading a robot description. If a mimic joint could be driven past its own limits, the Runtime refuses to start with an error naming the mimic joint, its driving joint, the offending ranges, and where to fix them; a joint_limits.yaml that raises a driving joint's velocity above what its mimic joint's limit allows needs a matching entry for the mimic joint. Setting a planning group's position bounds through the C++ or Python API now fails with a descriptive error when the new bounds would let a mimic joint violate its own position limits, instead of silently accepting them.
  • ProRRT planning can validate motions against collisions at a workspace resolution through the opt-in workspace_step planner parameter, also set from the collision_check_params port of the ProRRT planning Behaviors: motions of joints that sweep the robot through large arcs, such as base joints or arms carrying long attached objects, are checked proportionally more finely, roughly halving collision tunneling through thin obstacles at the recommended 0.1 m resolution. The parameter is off by default, so existing motion plans are unchanged until it is set.
  • Link padding on the ProRRT planning Behaviors is now set through collision_check_params (override_scene_link_padding: true with link_padding). Without the override, the planning scene's own padding applies. The standalone link_padding port is deprecated: while set it still takes precedence, and the Behavior logs the migration edit. The shipped motion Objectives keep their default padding of 0.01 m.
  • pro_rrt can pad world objects, scenario captures record the world padding a PlanToJointGoal plan used, and pro_rrt_replay applies it. Captures from earlier releases replay as before.
  • ProRRTPlanner() with no padding argument now inherits the planning scene's link and world padding instead of overriding both to zero; pass 0.0 explicitly to override both to zero as before. It gains use_scene_world_padding(), which returns the planner to the scene's own world padding after an override, and get_link_padding() and get_world_padding(), which report the padding the next plan applies. The constants kDefaultLinkPadding and kDefaultWorldPadding are deprecated in favor of kZeroLinkPadding and kZeroWorldPadding, since unset padding now inherits the scene's value and zero is an explicit override; the old names still work and will be removed in a future release.
  • pro_rrt::planPathToJointGoal and planTrajectoryToJointGoal accept an optional caller-supplied validation function that rejects joint-space configurations the built-in collision and constraint checks would accept, for example a coupled bound over several joints.
  • The Cartesian planning Behaviors (SetupMTCPathIK, SetupMTCCartesianSequence, SetupMTCMoveAlongFrameAxis, SetupMTCCartesianMoveToRobotState, SetupMTCMultiEEFMoveAlongAxis) and the Python PathIK stage and CartesianPlanner now apply the planning scene's link padding to self-collision checks by default, as the ProRRT planner does. In a scene that carries link padding they may now reject poses that bring links close together; call set_pad_self_collisions(False) on the Python stage or planner to leave self-collision checks unpadded as before.
  • The inverse kinematics stage of SetupMTCPlanToPose, SetupMTCCartesianSequence, and SetupMTCBatchPoseIK now applies link padding to self-collision checks by default, as the ProRRT and Cartesian planning Behaviors do, so in a scene that carries link padding, or with a padding override on SetupMTCPlanToPose, these Behaviors may reject goals where two padded robot links touch. No Behavior port turns this off; from the Python API set pad_self_collisions = False on the ComputeIK stage, or call setPadSelfCollisions(false) in C++.
  • The Python CollisionRequest gains pad_environment_collisions and pad_self_collisions, so is_path_in_collision and scene.check_collision callers can choose which collision checks use the padded robot links.
  • RDFLoader::create() and RobotModelLoader::create() return the loaded loader, or the reason the robot description could not be loaded, instead of a null model whose cause is only in the log. The constructors they replace are deprecated and work as before, except that after a failed load RobotModelLoader::getRDFLoader() now returns null rather than a loader holding null documents.
  • Planning-scene collision-object updates now return actionable errors and preserve existing geometry when validation fails. A collision object with a shape that cannot be constructed, an empty id, empty or duplicate subframe names, or a MOVE in an unknown frame is rejected with an error that names the field and a next step, instead of being partially applied, and PlanningScene.apply_collision_object in the Python API raises ValueError with the reason instead of returning silently.
  • PlanningScene::setRobotStateMsg() applies a moveit_msgs::msg::RobotState atomically and returns an error describing why a message could not be applied, and PlanningScene::setRobotState() does the same for a native RobotState. Both setCurrentState() overloads are deprecated in favor of these.
  • PlanningScene gains applyPlanningSceneMsg(), applyFullPlanningSceneMsg(), applyPlanningSceneDiffMsg(), and applyPlanningSceneWorldMsg(), which return the reason for every update in a planning scene message that the scene rejects. The bool methods setPlanningSceneMsg(), setPlanningSceneDiffMsg(), usePlanningSceneMsg(), processPlanningSceneWorldMsg(), and diff(msg) are deprecated and work as before.
  • The signed distance field that ComputeSignedDistanceField builds from a planning scene can now be computed directly from C++ in MoveIt Pro Core, so regression tests and tools that do not run an Objective can build the same field, with conservative primitive and octomap voxelization, bounded resource use, and actionable rejection of unsupported collision geometry.
  • MoveIt Pro now records which hardware source a computer's license is bound to in /opt/moveit_pro/licensing/fingerprint_pin, shared by every user of the computer, instead of each user's data directory. On computers activated by an earlier release, MoveIt Pro copies the existing record there and leaves the original, as Configure Licensing describes.
  • The moveit-pro-license helper ships as a native binary instead of a bundled Python environment, with Debian package (DEB) and Fedora package (RPM) downloads. The DEB replaces the previous package and keeps the moveit_pro_license command.
  • The Runtime reports academic licenses as the ACADEMIC license type in AgentInfo, and the About dialog shows them as "Academic License".

Bug Fixes​

  • Fixed the simulated vacuum gripper reporting a successful grasp when nothing was picked up. The gripper's state now follows the seal the simulation is actually holding, so a close onto an object the cups never sealed against no longer reports success. Because that state is now always derived from the simulation, the user attribute on a suction_cup_ site no longer sets its starting value.
  • Fixed a MuJoCo mobile base configured with base_link_name getting two TF parents, which made its pose flicker. The Simulator now publishes mj_world to the URDF root (or odom_frame), publishes the base's pose only for a floating parent joint, adds a <base link>_ground_truth frame with the true base pose, accepts a base_pose_source hardware parameter (auto, robot_state_publisher, or simulation), and skips any odometry TF broadcast or object frame that would give a frame a second parent. If another node publishes the parent edge of a base with a floating parent joint, set base_pose_source: robot_state_publisher.
  • Fixed a camera-based 3D lidar in the MoveIt Pro Simulator with a single row or column publishing a point cloud of only NaN values, and one with a 360 degree sweep publishing its first beam twice, once at each end of the sweep; its beams are now 360 / columns degrees apart.
  • Fixed RGB-D cameras and camera-based 3D lidars in the MoveIt Pro Simulator reporting a depth at the far clipping distance, instead of NaN, for pixels and beams that hit nothing, in some scenes that do not set <statistic extent> in their MuJoCo model. Objectives that consume the raw point cloud of such a camera, lab_sim's snapshots and segmentation among them, no longer see a wall of points hundreds of meters away.
  • Fixed a rare heap corruption when a PlanningSceneMonitor was destroyed while it was still publishing a planning scene update. Core
  • Fixed an intermittent hang when stopping or restarting PoseJog and shutting down planning scene monitoring. Core
  • Fixed an intermittent hang when destroying motion-planning tasks. Core
  • Fixed a possible crash when the planning scene service reads an octomap during sensor updates. Core
  • Fixed crashes when planning scenes receive malformed collision objects, incompatible robot state data, invalid octomap data, or null required inputs. Core
  • Fixed integer overflow in image, point-cloud, and voxel buffer sizing for large dimensions, and unsafe virtual dispatch when constructing a distance field from an octree. Core
  • Fixed PlanningScene robot state message application so that a message with an invalid joint value, an unknown joint, an unavailable transform, or an invalid attached object is rejected as a whole, without partially changing the planning scene. setPlanningSceneMsg and setPlanningSceneDiffMsg now return false when the robot state of the message is rejected, and a scene message without a robot state keeps the current one. Attachment operations in one message must not depend on each other: a detach-all cannot be combined with other attachment operations, and an attachment cannot be posed in the frame of an object changed by the same message. Core
  • Fixed an attachment whose header frame starts with / being posed with the joint values from before the message. Core
  • Fixed collision objects with non-finite or zero-norm poses being accepted; they are now rejected with an error naming the object and the field. Core
  • Fixed invalid octomap replacements so they preserve the last valid planning-scene collision geometry and report actionable errors. Core
  • Fixed collision padding set on the planning scene reverting when a full planning scene message arrived before the monitor published the change. Core
  • Fixed ExecuteMTCSolution overwriting the planning scene's link padding and scale with the values the MoveIt Task Constructor (MTC) task planned with. Core
  • Fixed ExecuteMTCSolution emptying the planning scene's allowed collision matrix and world when executing the debug_solution output of ValidateTrajectory or PlanCartesianPath, including with apply_start_scene enabled.
  • Fixed the MTC ProRRT planning Behaviors discarding the collision padding configured on the planning scene. Planning now uses the scene's link and world padding unless a padding value is set explicitly; an explicit 0.0 still removes it. Core
  • Fixed SetupMTCPlanToPose rejecting goals its own inverse kinematics stage accepted when its link_padding port or collision_check_params overrides the padding. The stage now checks the same padding as the planner. Core
  • Fixed planner crashes when start or goal joint positions contain non-finite values. Core
  • Fixed unnecessary full-turn motions and false trajectory-tolerance failures for independent continuous joints when planning and executing across ±π. Core
  • Fixed lost continuous-joint winding after set_group_position_bounds on a group containing a continuous joint. Position bounds requested for a continuous joint are now ignored with a warning naming the joint, and get_group_position_bounds reports its full [-pi, pi] range; the other joints in the group take their limits as before. Such a joint is now treated as periodic throughout: shortest-angular tolerances in the Joint Trajectory Admittance Controller, start +/- pi sampling in ProRRT, and joint-space MoveRelative rejecting offsets larger than pi rather than wrapping them. Use a bounded revolute joint in the URDF for absolute position limits. Core
  • Fixed /get_joint_limits reporting a continuous joint's URDF position range as [0, 0] with has_position_limits set; continuous joints now report no URDF position limits, so the Joint Monitor no longer draws a degenerate limits bar for them.
  • Fixed backward-planned whole-body trajectories ending with nonzero joint velocities after time parameterization. Core
  • Fixed GeneratePointToPointTrajectory rejecting valid start states for planning groups that contain mimic joints, crashing on planning groups that contain multi-DOF (degree-of-freedom) joints, which it now refuses with an error naming the unsupported group, and ending its trajectories one sample before the requested target state.
  • Fixed GetJointState emitting joint values misaligned with their names for planning groups that contain mimic joints.
  • Fixed ghost robot previews (waypoints, trajectories, gripper) showing mimic joints at stored values instead of the value derived from their driving joint.
  • Fixed ComputeSignedDistanceField reporting success while producing an incomplete or mislocated distance field. It now reports an error when the planning scene holds an octomap that is not at the planning frame origin, when the requested links carry no collision geometry, or when the robot state has not been updated.
  • Fixed MoveIt Pro libraries changing their file names on every patch release, which made user workspaces built on an earlier release fail to start with a cannot open shared object file error. Upgrading to this release needs the one-time clean rebuild listed under Breaking Changes; later patch releases will not. Core
  • Fixed a configure failure in custom Behavior packages declared as project(<name> CXX). Any package depending on MoveIt Pro's Behavior interface previously failed with a missing MPI::MPI_C target, and now builds without needing to enable the C language itself. Core
  • Fixed Behavior libraries in a user workspace being built with code-coverage instrumentation by default, which cost multi-threaded throughput while producing identical results. To collect C++ coverage, copy ~/.colcon/defaults.yaml, add the coverage-gcc mixin, and point COLCON_DEFAULTS_FILE at the copy; passing --mixin coverage-gcc on the command line replaces the configured mixin list rather than extending it, and also drops release. Core
  • Fixed a stream of pytest-cov was not found CMake warnings printed on every moveit_pro build and moveit_pro run. User-workspace builds no longer force Python test coverage on every package; a package now gets coverage only when it declares <test_depend>python3-pytest-cov</test_depend>. To enable it for a whole workspace, copy ~/.colcon/defaults.yaml, add the coverage-pytest mixin, and point COLCON_DEFAULTS_FILE at the copy. Passing --mixin instead does not work, because it replaces the configured list rather than extending it.
  • Fixed the Runtime running code from a Behavior plugin that links stock BehaviorTree.CPP before refusing to start. Such a plugin is now rejected before it loads, and the error names the library chain to rebuild against behaviortree_cpp_picknik.
  • Fixed the MoveIt Pro Runtime image omitting the build-configuration records (/usr/share/doc/<package>/BUILD_FLAGS.txt) of the LGPL (GNU Lesser General Public License) packages PickNik compiles, the records that let you build a binary-compatible replacement.
  • Fixed the dev container started by moveit_pro dev running ros2_control without realtime scheduling; it now carries the same rtprio and memlock limits as the drivers service, and drivers gains an unlimited memlock to match the Real-time Performance troubleshooting guide.
  • Fixed a Stop request being ignored for as long as a Behavior held a tick open, so an Objective can now be stopped while one of its Behaviors is still working.
  • Fixed a Stop that arrived while a motion was still being set up being reported as successful while the robot moved anyway. The trajectory is no longer sent once the Objective has been stopped.
  • Fixed the Objective server staying alive after a heap-corruption crash inside its crash handler; it now exits within 10 seconds so the Runtime shuts down and can be restarted.
  • Fixed ambiguous /do_objective requests by requiring exactly one of objective_name or objective_xml_string and publishing an actionable warning when the request is rejected.
  • Fixed UI notifications and pose markers being dropped when several Behaviors publish them within a few milliseconds of each other.
  • Fixed repeated missing-color warnings when point-cloud Behaviors process valid geometry-only clouds.
  • Fixed a crash in the MoveIt Pro Runtime when a joint state publisher reported joint names without positions while a URDF tool was attached. Joint states that do not pair one position with each name are now rejected, and a tool is no longer posed from a non-finite or multi-variable joint value.
  • Fixed the waypoint manager serving hand-edited waypoints whose joint names and values have different lengths. Waypoints with mismatched counts, or with a joint listed under the wrong joint-state array, are now dropped on load with an error naming the waypoint, the file, and the cause.
  • Fixed a Subtree port whose model declares no default failing the whole Objective at startup with is defining a mandatory port called [...], but you are not remapping it. Such a port is now remapped to an empty value, so the Objective builds.
  • Fixed a Subtree port whose model declares an empty default being impossible to leave unset. The port editor now offers Unset for it and saving keeps the attribute omitted, so the Runtime applies the declared default, and the unset badge distinguishes a declared empty default from no declared default at all instead of warning that the port would fail.
  • Fixed a missing mandatory Subtree port remap being silently replaced with an empty value. An Objective that omits a required remap now reports the missing remap when the tree is built, instead of running with an invented empty constant.
  • Fixed Script added from the Behavior palette silently succeeding without running its code, and Precondition failing with an unattributable error, because the Behavior catalog advertised an empty default for ports that have none. These ports are no longer pre-filled when the node is added, and a missing required value is reported against the port when the node runs.
  • Fixed the Teleoperate Objective overriding the Request Teleoperation Subtree's user_interaction_prompt default with an empty string. The declared prompt now applies, so enabling user interaction on that Objective shows the intended text instead of a blank prompt.
  • Fixed a Behavior Tree parameter named xmlns being saved into an Objective, which then failed to load with a server error on every attempt to open it. The name is now rejected when the Objective is saved, and an Objective that fails to load now reports its name, its file, and the reason the Runtime could not read it instead of only a server error.
  • Fixed PATCH /objectives/{id}/data, POST /objectives, and the MCP Objective authoring tool accepting raw Objective XML that binds an XML namespace, which produced an Objective that could neither be opened nor run, and in one spelling could no longer be found by ID at all. All three now reject it with a message naming the offending element or attribute and how to fix it.
  • Fixed Objectives being shown as editable when their files cannot be written, which made the Desktop App offer an edit the Runtime then rejected.
  • Fixed live Objective updates being lost or overwritten in the Desktop App editor, and creating, displaying, editing, and renaming Objectives whose names contain apostrophes.
  • Fixed MCP execution status losing an Objective's final outcome after it finished, and an MCP Runtime launch remaining blocked by a reservation from an exited launcher.
  • Fixed moveit_pro mcp serve leaving its container and session files behind when the AI client stopped it with SIGTERM or SIGHUP, and moveit_pro mcp serve --instance <name> taking shutdown ownership from a running moveit_pro run --instance <name>, which could stop that Runtime from shutting down its services.
  • Fixed JointTrajectoryAdmittanceController refusing to deactivate while a trajectory was executing, which let a robot stopped by its driver (for example on a protective stop) report the trajectory, and the Objective, as succeeded. The controller now aborts the executing goal with INVALID_STATE and deactivates; a SwitchController that deactivates it mid-trajectory succeeds and fails the executing Behavior instead of being refused.
  • Fixed JointTrajectoryAdmittanceController running a goal whose path or goal tolerance is zero, negative, or not a number, which it now rejects before the robot moves. In ExecuteTrajectory and ExecuteMTCSolution, set goal_position_tolerance to a positive value or remove it to use the controller's default_goal_tolerance.
  • Fixed JointTrajectoryAdmittanceController rejecting every new goal after the joints left the path tolerance on the last control cycle of a trajectory.
  • Fixed the Joint Trajectory Admittance Controller stopping over the full-speed distance when time_scale_percentage is below 100; stops now brake at stop_accelerations, so stopping distance shrinks with the square of the time scale, and the controller no longer holds its position command before braking after cancellations and controller faults.
  • Fixed unstable time scaling in the Joint Trajectory Admittance Controller with small time_scale_filter_constant values, and rejected non-positive or non-finite constants.
  • Fixed the Joint Trajectory Admittance Controller stopping an executing trajectory when it received a goal it could not stitch to; it now refuses the new goal and leaves the running one alone.
  • Fixed payload gravity compensation in the Joint Trajectory Admittance Controller so goals use their configured end-effector mass, center of gravity, and gravity_vector, including with rotated force/torque sensors. Use zero end-effector mass when sensor measurements already exclude payload weight.
  • Fixed the admittance controller accepting changes to configuration-only parameters without applying them. Runtime changes to sensor frames, sensor names, force/torque filter cutoff, stopping accelerations, and the time-scale filter constant are now rejected. Set these values in the initial controller configuration; changing them requires unloading and loading the controller with updated configuration.
  • Fixed collision checking being shared across teleoperation modes. Turning it off in Joint teleoperation no longer disables it for Pose teleoperation, and each mode keeps its own setting.
  • Fixed a race condition that could let the robot keep jogging with collision checking skipped after an operator turned it back on mid-motion.
  • Fixed coverage path generation rejecting flat regions with zero thickness.
  • Fixed the coverage path generated from a region drawn on a camera image being rotated away from the selection and extending past it.
  • Fixed the heading of a pose picked with GetPoseFromUser depending on the 3D view's Fixed Frame; it now follows the robot's URDF root link.
  • Fixed the AdjustPoseWithIMarker marker jumping after a drag, and Localize Robot rejecting its pose, when the 3D view's Fixed Frame is not the robot's model frame.
  • Fixed captured point cloud snapshots not appearing in the orthographic axis views of the 3D Visualizer.
  • Fixed incorrect or black colors when streaming point clouds from cameras that store packed colors in floating-point fields to the Desktop App.
  • Fixed the occupancy grid hiding the ground grid and the scene beneath it. Free space is now transparent, unknown cells are shown in gray rather than red, and the map no longer flickers against the ground grid as the camera moves.
  • Fixed measurement labels being cut in half by the surface they measure, and being scaled and offset incorrectly after a view pane is made fullscreen.
  • Fixed keep-out zone sizes and positions reverting to the slider limits when a larger value was typed. Size and position are now set with a jog strip that has no end of travel: drag it to raise or lower the value by any amount, hold Shift for finer control, or type the number directly. Size accepts anything above 0.01 m and position is unrestricted.
  • Fixed the move-and-rotate gizmo around a keep-out zone keeping its original size after the zone was resized, which left the rings far too large for a zone that had been made smaller.
  • Fixed a keep-out zone created or cloned while keep-out zones were locked having no interactive marker, so it could not be moved, rotated, or re-selected in the 3D Visualizer. Creating a zone now unlocks the planning scene.
  • Fixed toggles being hard to read. An off toggle is now neutral gray and an on toggle green, instead of two shades of blue that differed only in brightness; in the training panel an off toggle previously had no visible track at all. Toggles also draw a focus ring when reached with the keyboard.
  • Fixed the Alert Sidebar recording one row per open panel each time the robot's joint states dropped out and came back, instead of one row per event.
  • Fixed duplicate Objective requests splitting one execution's alerts across multiple Alert History sections.
  • Fixed Trainer episode lists remaining stale after deleting an episode and recording another.
  • Fixed recording started outside the Desktop App being allowed during playback, including preparation and shutdown, and Trainer's Record tab naming the selected dataset, rather than the one being recorded, when the selection changed during a recording.
  • Fixed the train-model skill reusing stale Weights & Biases credentials on shared RunPod volumes and leaving credentials behind when private file permissions could not be enforced.
  • Fixed unwanted automatic inference server restarts. Restart a failed server with moveit_pro run --only-inference-server.
  • Fixed ML inference logs reporting a CPU fallback when CPU was requested, and ML runtime messages missing from MoveIt Pro logs.
  • Fixed the license fingerprint under WSL2 (Windows Subsystem for Linux) changing on every WSL restart. The fix requires mirrored networking, listed under Breaking Changes. Core
  • Fixed startup errors for rejected robot descriptions to show the specific validation failure instead of a generic crash or misleading license guidance. Core
  • Fixed moveit_pro export_logs ignoring MOVEIT_HOST_LOG_DIR and including the targets of symbolic links. Skipped log entries are reported during export.
  • Fixed missing startup errors when a Runtime container fails before log streaming begins; moveit_pro run now recovers and saves the failed container's output in both normal and verbose modes.
  • Fixed global --verbose being ignored by moveit_pro run and moveit_pro update_acm.
  • Fixed moveit_pro configure reporting success after the user canceled it.

Breaking Changes​

  • Custom Behavior plugins must be rebuilt for this release. The Behavior Tree library's version changed, so a prebuilt plugin shipped inside a derived container image fails to load until you rebuild it with moveit_pro build. A workspace you build from source needs only the one-time clean rebuild below.
  • A user workspace built on an earlier release must be rebuilt once from clean after upgrading, because MoveIt Pro library file names changed. Run moveit_pro build user_workspace --colcon-args "--cmake-clean-cache", or delete the workspace's build/, install/, and log/ directories before moveit_pro build. Library file names no longer change on every patch release, so later patch releases will not need this. Core
  • A custom Behavior registered with the ID Finally conflicts with the new built-in Finally control node and must be renamed.
  • Activating a node-locked license under WSL2 (Windows Subsystem for Linux) now requires networkingMode=mirrored in .wslconfig and Windows 11 22H2 or later. An install left in the default network address translation mode fails activation with steps to switch, and a WSL machine activated before this release reactivates once after switching. Core
  • The dev service that moveit_pro dev starts now requires a rootful Docker daemon, as drivers already did, because it carries the rtprio and memlock limits that realtime scheduling needs and a rootless daemon cannot raise them.
  • The moveit-pro-license helper no longer runs on Debian Bookworm now that it ships as a native binary instead of a bundled Python environment. Core
  • The Objective editor and the REST API now refuse to save an Objective or Subtree named Root or root, or whose name contains <, >, &, ", /, \, :, *, ?, |, or a control character. The REST API did not check these names before. An Objective already saved under such a name still loads and runs, so you can open it and rename it in the editor. The editor now also accepts periods, parentheses, and non-ASCII characters, which it previously rejected, so names like Test Presoak 1.2 and Move to Waypoint (JTC) can be typed.
  • A Subtree or Objective port declaration must now start with a letter. Rename a port such as _my_port to my_port. BehaviorTree.CPP never bound a port with a leading underscore at a Subtree call site. Node attributes such as _while and _skipIf are unaffected. The Objective editor rejects the name where it is typed, and saving an Objective that still declares one returns an error naming the port. An Objective that already declares such a port still opens, so you can fix it in the editor.
  • The MoveIt Pro Simulator now refuses to start a configuration that would give a transform frame two parents, where it previously ran with broken TF, and names the fix in the error: a planar joint between the URDF root and the base link (make it fixed, or floating with a same-named MuJoCo free joint); a floating joint other than the base's own parent joint, unless it is off the root-to-base path and listed in ignore_joint_validation; a base parent floating joint below the URDF root or under an odom_frame other than the root (root the URDF at that joint's parent link and leave odom_frame unset, or set base_pose_source: robot_state_publisher); a base moving with a MuJoCo free joint under a non-floating URDF parent joint (make that joint floating, or set odom_frame to an odometry frame outside the URDF); odom_frame set to mj_world or a URDF link below the root; and a URDF link, MuJoCo body, or site named <base link>_ground_truth, which the Simulator now publishes itself.
  • JointTrajectoryAdmittanceController now aborts a trajectory with GOAL_TOLERANCE_VIOLATED when the joints end outside the goal tolerance, where it reported success before. ExecuteTrajectory, ExecuteMTCSolution, and ExecutePolicy now fail where they passed with the joints off target. For a motion that ends in contact, set goal_position_tolerance to cover the expected deviation. For a simulation or robot that lags the commanded trajectory, raise default_goal_tolerance in the controller configuration or set the new default_goal_time_tolerance parameter, which gives the joints that many seconds after the trajectory end time to come within the goal tolerance before the goal aborts.
  • Removed apt-owned pytest implementation and metadata paths from Runtime images containing the pytest 9.0.3 security update; use the supported /usr/local/lib/ installation through python3 -m pytest and remove hard-coded apt pytest paths and pytest-specific import-path overrides. See the migration guidance.
  • moveit_pro_ml::DeviceKind and moveit_pro_ml::DevicePreference gain an Npu value. Code with an exhaustive switch over either enum needs a case for it.
  • Removed TransformsConstPtr, TransformsWeakPtr, TransformsConstWeakPtr, TransformsUniquePtr, TransformsConstUniquePtr, Transforms::transformVector3, and Transforms::transformRotationMatrix from MoveIt Pro Core. Replace the pointer aliases with the equivalent std smart-pointer specializations, and replace either helper call with output = transforms.getTransform(from_frame).linear() * input. Core
  • ASSIGN_OR_RETURN and ASSIGN_OR_RETURN_WITH_PREFIX now move the value into the left-hand side. Code that declared the left-hand side as a non-const reference, such as ASSIGN_OR_RETURN(T& value, ...), no longer compiles; declare it by value or as const T&. Core
  • Removed the unused moveit_pro_base_py::moveit_py_utils target, moveit_py/moveit_py_utils/copy_ros_msg.h, moveit_py/moveit_py_utils/copy_ros_msg.hpp, and their 16 moveit_py::moveit_py_utils conversion functions. Downstream bindings should depend on picknik_py_binding_tools, link picknik_py_binding_tools::picknik_py_binding_tools, include <picknik_py_binding_tools/ros_msg_typecasters.h>, and expose typed ROS message parameters and return values through the provided pybind typecasters. Core
  • Removed moveit_pro_base/version.hpp, its compile-time version and git-identity macros, and the moveit_pro_version executable. Replace moveit_pro_version with moveit_pro --version; the removed compile-time macros and git-identity output have no direct replacement. Core
  • Removed unused RobotTrajectory APIs: size() (use getWayPointCount()); getWayPointDurationFromStart(), findWayPointIndicesForDurationAfterStart(), and getStateAtDurationFromStart() (accumulate getWayPointDurations() or getWayPointDurationFromPrevious() and interpolate between getWayPoint() results, or use getDuration() when only the final duration is needed); the addPrefixWayPoint(), insertWayPoint(), and removeWayPoint() overloads (rebuild the waypoint sequence with addSuffixWayPoint()); print() and its stream operator (format trajectory data from getWayPointCount(), getWayPoint(), and the duration accessors); the pathLength(), smoothness(), and waypointDensity() helpers (compute application-specific metrics from the waypoints); and toJointTrajectory() (call getRobotTrajectoryMsg() and consume its joint_trajectory member, handling multi-DOF joints explicitly when needed). Core
  • Removed unused color-manipulation, plane, and cone helpers from the legacy moveit_pro_rviz_marker_tools C++ API. Rebuild dependents, continue using the retained color identifiers with setColor, and construct the corresponding planar or cone visualization_msgs::msg::Marker values directly. Core
  • Selected MTC stage, container, and task constructors are now explicit. Use ContainerType(impl) for a concrete container or direct base initialization from its implementation pointer, and replace copy-list initialization with direct-list initialization such as Task task{}; std::make_unique<T>(...) construction is unaffected. Construct InterfaceState(scene), SubTrajectory(trajectory), and SolutionSequence(std::move(parts)) explicitly; InterfaceState copy construction is unaffected. Construct InterfaceFlags(enum_value) and Interface::UpdateFlags(enum_value) explicitly from enums, while implicit integer flag use remains supported. Wrap list iterators with Interface::iterator(...) or Interface::const_iterator(...) when passing or assigning them to those adapters, including mutable-to-const conversion. Use static_cast<bool>(planner_result) or planner_result.success when assigning or returning planner results as ordinary booleans, while contextual conditions such as if (planner_result) remain supported. Replace cost_ordered::push(std::pair<...>) with insert(value, cost), or construct the queue's value_type before passing it to push. Directly construct the MTC Interface callback type, the Interface::DisableNotify scoped guard, MarkerVisualizationProperty, and TaskSolutionPanel when converting callbacks, interface references, names, or parent pointers. Core

10.1.1

· 5 min read

Enhancements​

Behavior and Library Improvements​

  • DetectAprilTags provides an optional detection_count output for Objectives that need to handle an empty detection result.

Reference Application Changes​

  • moveit_pro_sam3 now downloads the SAM3 (Segment Anything Model 3) models from their upstream release at build time instead of shipping them in the repository. The SAM3 Objectives and Subtrees in lab_sim, hangar_sim, kitchen_sim, dual_arm_sim, picknik_ur_base_config, and franka_base_config load their models from this package. To build without network access, put the four model files in a directory and pass -DSAM3_MODEL_URL=file:///<dir>.
  • The lab_sim Pick All Bottles with AprilTags Objective now finishes after the last bottle instead of reporting an empty-detection error. Detection and motion failures still fail the Objective.

Other Improvements​

  • The moveit_pro command now asks you to accept Meta's SAM License before building the example workspace's moveit_pro_sam3 package, which downloads the SAM3 model at build time. Declining excludes the package from the build, so the model is not downloaded and the SAM3 Objectives cannot load it. Change the answer later with moveit_pro configure --sam3-license accept or moveit_pro configure --sam3-license decline.

Bug Fixes​

  • Fixed interactive marker dragging moving in the wrong direction when the 3D view's fixed frame is not the robot's root link, such as map on a mobile robot.
  • Fixed excessive transform network traffic when viewing a remote Runtime, especially when transform features are not in use.
  • Fixed point cloud and particle filter visibility settings being forgotten when topics temporarily disappear or reconnect.
  • Fixed pane swapping in grid layouts, where a divider offered a single control that exchanged whole rows or columns. Every pair of panes that share an edge now has its own swap control, so a pane can be swapped with the one directly beside or below it.
  • Fixed failure-path highlighting so expanding a collapsed Subtree in Edit mode reveals and highlights the failed Behavior from the preceding run.
  • Fixed joint states being sent to a remote Desktop App at the robot's control rate instead of the display rate, which crowded out other data on slow connections.
  • Fixed misleading downstream conversion errors when PushBackVector or InsertInVector receives an uninitialized value. The failure now identifies the missing input and points to Subtree port mapping.
  • Fixed the get_capabilities tool of the MCP (Model Context Protocol) server telling agents to run build_workspace when the bound robot configuration package does not exist yet. It now points to create_config.
  • Fixed offline license activation selecting the wrong network interface on hosts where a network interface's backing device cannot be resolved, or where the host /sys is mounted under a path containing a component such as usb1. Core
  • Fixed the Training Config dialog stalling while discovering cameras. The dialog now opens immediately, adds discovered cameras while preserving your edits, and provides more space for configuration.
  • Fixed the Alert Sidebar badge counting an unread alert every time the Runtime started.
  • Fixed episode deletion in the Training panel blocking other training controls. Deletion is also faster, can be canceled, shows a spinner while it runs, and preserves recording splits to reduce memory use during later conversion.
  • Fixed Runtime, moveit_pro command, and Desktop App licensing diagnostics so they preserve the specific failure cause and no longer give irrelevant key-change advice. Core
  • Fixed RetrieveWaypoint returning every joint stored in a waypoint instead of only the joints of joint_group_name, which sent joints outside the requested planning group to the planner and controller. An Objective that used the output as a whole-robot state now receives only that group's joints.
  • Fixed the Joint Monitor showing no value for joints with no position limits, such as continuous wheel joints and mobile-base yaw joints. They now show a ±180° bar with the live position wrapped into it, and joints keep the order the robot model reports instead of being sorted by whether they have limits.
  • Fixed license deactivation failing on a machine whose TPM (Trusted Platform Module) or network interface is no longer readable, which left the seat held until support released it. Core
  • Fixed a failure while loading license metadata leaving a machine activated with no hardware tier recorded, which could consume a second activation on the next start. Core
  • Fixed a machine with an unwritable data directory holding its floating license seat until the lease expired instead of releasing it at shutdown. Core
  • Fixed the Training panel relabeling previously recorded episodes when a new episode was saved. Each episode now shows the task it was recorded under, in both the episode list and the playback scrubber.
  • Fixed Objectives failing to load when they call a Subtree without setting a port whose declared default is an empty string.
  • Fixed slow Octomap updates for large point clouds in planning scenes with many meshes.
  • Fixed unavailable Teleoperation appearing as an enabled mode, and added a way to return to Objectives if the Teleoperation workspace cannot load.
  • Fixed the robot disappearing from the 3D view when changing the fixed frame back to world.
  • Fixed Nav2 path arrowheads in the 3D view not showing each pose's orientation, including the final goal heading.
  • Fixed keep-out zone size edits in the Planning Scene Editor not updating the 3D view until leaving the editor.

9.4.4

· 3 min read

Enhancements​

Reference Application Changes​

  • moveit_pro_sam3 now downloads the SAM3 (Segment Anything Model 3) models from their upstream release at build time instead of shipping them in the repository. The SAM3 Objectives and Subtrees in lab_sim, hangar_sim, kitchen_sim, dual_arm_sim, picknik_ur_base_config, and franka_base_config load their models from this package. To build without network access, put the four model files in a directory and pass -DSAM3_MODEL_URL=file:///<dir>.

Other Improvements​

  • The moveit_pro command now asks you to accept Meta's SAM License before building the example workspace's moveit_pro_sam3 package, which downloads the SAM3 model at build time. Declining excludes the package from the build so the model is not downloaded. Change the answer later with moveit_pro configure --sam3-license accept or moveit_pro configure --sam3-license decline.

MoveIt Pro Core​

The changes below ship to every MoveIt Pro customer. They are collected here because they also reach MoveIt Pro Core customers, who install the standalone Core archive rather than the full Application Platform, and so are the subset of this release that a Core-only deployment receives.

  • A TPM (Trusted Platform Module) whose endorsement key name uses an algorithm earlier releases did not recognize is now accepted, matching MoveIt Pro 10. Machines that have already activated keep the hardware source they activated with and are unaffected.

Bug Fixes​

  • Fixed misleading remediation for activation-limit, network, and unknown license failures in the Desktop App.
  • Fixed a machine whose data directory cannot be written holding its floating license seat until the lease expired instead of releasing it at shutdown. Core
  • Fixed license deactivation running against a partially configured license client after an earlier activation attempt failed. Core
  • Fixed licensing error messages printing the license key into the log file customers send to support. The offline activation message now names the expected filename pattern and directory instead of the full path. Core
  • Fixed the joint trajectory admittance controller, JointTrajectoryAdmittanceController, refusing to deactivate while a trajectory was executing, which let a robot stopped by its driver (for example on a protective stop) report the trajectory, and the Objective, as succeeded. The controller now aborts the executing goal with INVALID_STATE and deactivates; a SwitchController that deactivates it mid-trajectory succeeds and fails the executing Behavior instead of being refused.
  • Fixed the license fingerprint under WSL2 (Windows Subsystem for Linux 2) changing on every WSL restart. The Runtime now needs networkingMode=mirrored in .wslconfig and Windows 11 22H2 or later to activate a node-locked license under WSL2. An install left in the default NAT (Network Address Translation) mode now fails activation with steps to switch, and a WSL machine activated before this release reactivates once after switching. Core
  • Fixed MoveIt Pro libraries changing their file names on every patch release, which made user workspaces built on an earlier release fail to start with a cannot open shared object file error. After upgrading to this release, rebuild your user workspace once from clean with moveit_pro build user_workspace --colcon-args "--cmake-clean-cache", or delete its build/, install/, and log/ directories before moveit_pro build. Later patch releases do not need this rebuild. Core
  • Fixed a potential crash when requesting a planning scene while the live octomap is being updated. Core

10.1.0

· 23 min read

Major Features​

Per-Joint Planning Costs​

The joint_costs port on a PlanToJointGoal Behavior in the Objective editor, set to make the three mobile base joints ten times as expensive to move as the arm joints

Not every joint is equally cheap to move. On a machine with hydraulic base joints and electric wrist joints, a plan that reaches the goal mostly with the wrist is worth preferring even when the raw shortest path would swing the heavy joints. MoveIt Pro can now bias which joints move by giving each one a cost, and the planner search, the solution ranking, and the inverse kinematics candidate selection all honor that preference. Costs are opt-in, so upgrading changes nothing until you set them. Core

Collision Padding for the World and for What the Robot Carries​

Collision padding used to be something you applied to the robot's own links. It now extends to world objects and to attached bodies, so a payload can be given extra clearance while it is being placed without duplicating its collision mesh. Padding is applied to collision checking only, so the 3D Visualizer keeps drawing the exact geometry. Core

Collision Ghosts in the 3D Visualizer​

ValidateTrajectory refusing a Cartesian path, with the colliding robot pose drawn as an orange ghost and a red contact sphere where the suction cups meet the fuselage

When motion is refused because a robot state is in collision, the 3D Visualizer now draws the robot in the offending pose as a translucent ghost, next to the red spheres marking where it touches. Previously the spheres were all you got, leaving you to picture the pose they belonged to. The ghost appears wherever a pose is rejected, whether a plan's start or goal is blocked, a trajectory fails validation, or an inverse kinematics target turns out to be reachable but blocked.

Inverse Kinematics That Says What Blocked the Pose​

A ComputeInverseKinematics failure, with the rejected pose drawn as a ghost with a red contact sphere against the fuselage, and the error names collision_Plane_009 and wrist_2_link

An inverse kinematics request refused for collision used to report only that no solution was found, leaving the cause to guesswork. ComputeInverseKinematics now names the colliding bodies in its failure message and draws red contact spheres on the rejected-pose preview in the 3D Visualizer, so the pair that stopped the solve is both named in the log and shown in place.

Alerts Without the Popups​

Turning off Toast Notifications in the Alert Sidebar settings, then a failed Objective adding a red unread count to the alert bell instead of a popup, which clears when Alert History opens

Alerts no longer have to interrupt what you are looking at. Turn off Toast Notifications in the Alert Sidebar's settings and popups stop appearing entirely; the sidebar icon instead carries a count of the alerts you have not seen, which clears when you open Alert History. Alert history and that unread mark are now kept per Runtime connection, so switching from one robot to another no longer shows you the other one's alerts. Toasts stay on by default, but the intent is to move away from them: interrupting the operator's view for every message does not scale with how much MoveIt Pro has to report, so the Alert Sidebar is where alerts are headed and the default is expected to follow in a later release.

Objective Authoring Through the Model Context Protocol​

moveit_pro mcp install printing a ready-to-paste remote Claude Desktop entry for the MCP endpoint of a Runtime

The MoveIt Pro Model Context Protocol (MCP) server gained the pieces an agent needs to author Objectives against a live Runtime: canonical local Objective validation, session identity and scope reporting, and a robot configuration that refreshes after a workspace build without reconnecting. It can also generate a ready-to-paste remote client entry for Claude Desktop and Cursor.

In-App Keyboard Shortcuts​

The Keyboard Shortcuts reference, listing shortcuts that work anywhere in MoveIt Pro and those for the Behavior Tree editor

MoveIt Pro now ships a keyboard shortcut reference you can open from Settings or with Shift+?, listing the shortcuts for the platform you are on. Single-letter keys open each panel, and the reference is grouped by whether a shortcut works anywhere in MoveIt Pro or only in the Behavior Tree editor.

hangar_sim Revamped for Full Navigation​

The hangar_sim mobile base approving a navigation path and rolling across the hangar floor next to the airplane, with costmaps and streamed point clouds in the 3D Visualizer

The hangar_sim reference application can now be driven around its map properly. Its mecanum wheels were remodeled so the mobile base rolls smoothly instead of juddering, the base height follows from that corrected geometry, and the navigation controller is pinned to a known-good version running open loop. Its teleoperation and box-moving Objectives were brought up to date with 10.0 along the way.

Enhancements​

Integrated AI Models and GPU Acceleration​

  • A MoveIt Pro Trainer conversion that skips an episode for a low frame rate now names the frame rate the dataset is pinned to, and directs you to record the take into a new dataset created at a frame rate no higher than the camera rate.

Behavior and Library Improvements​

  • Move to Named Waypoint and Move to Cartesian Pose are the new names of the waypoint and pose motion Objectives, chosen for clearer intent. The previous names remain as deprecated compatibility aliases.
  • Move to Cartesian Pose (JTC) now exposes max_ik_solutions and max_mtc_solutions, so the planning budget can be tuned without editing the wrapped Objective. The defaults match the previous implicit values, so existing Objectives plan as before.
  • ConvertDataset gained an action_source port, so an Objective can convert a recording that carries no commanded joint positions by labeling actions with the next recorded state. This matches the Action source setting on the Convert tab.

Simulation Improvements​

  • A simulated camera can now be turned off from the robot description with <param name="camera_enabled">false</param> in its <sensor> block, so a camera defined in the MuJoCo scene is neither rendered nor published.

Discovery and Security​

  • moveit_pro run now prints the hostname, any detected configured IPv4 addresses, the frontend-key retrieval command, and, for named instances, the API port needed to connect the MoveIt Pro Desktop App from another computer. The credential itself is never exposed in startup output.

Misc User Interface Improvements​

  • Costmap colors in the 3D Visualizer now match RViz, so the inscribed radius and lethal obstacle costs are distinguishable at a glance instead of blending into a grey gradient.
  • The X-Axis (Front), Y-Axis (Side), and Z-Axis (Top) views now remember their zoom level between sessions, instead of reopening at a fixed zoom. Use Reset Camera to return them to the default framing.
  • The Add Connection dialog now asks for the optional connection name after the frontend key, explains when a Runtime needs an alternate address, and identifies 3200 as the default REST API port.
  • Connection failures in the MoveIt Pro Desktop App now name the address and ports that were tried and whether a stored frontend key was used, so a failure can be diagnosed from the message alone.
  • The Planning Scene Editor gained a Clone action that duplicates the selected keep-out zone, keeping its size and rotation and placing the copy beside the original.
  • The Task Constructor Debugger now selects a planning iteration's first stage on open, so its solutions and properties appear without an extra click. Sidebar spacing is tighter as well.
  • The MoveIt Pro Desktop App now titles each window with the robot configuration, Runtime, and MoveIt Pro version it is connected to, so multiple open windows can be told apart in the window switcher.
  • Long Behavior descriptions in the Behavior Tree editor are now cut off after ten lines, with a Show More control to read the rest.
  • The MoveIt Pro Desktop App menus were reorganized: the canvas layout presets moved from the top navigation bar into Settings, under View and then Layout, and the About dialog now reports the connected Runtime version alongside the Desktop App version.

Reference Application Changes​

Changes to the reference applications in moveit_pro_example_ws between 10.0.0 and 10.1.0.

  • Added the hand_eye_calibration_sim robot configuration package.
  • hangar_sim gates its forward stereo camera pair behind the enable_vo configuration setting.
  • hangar_sim makes the Cartesian Path with Collision Checking example fail by design, to demonstrate a collision-checked Cartesian path being refused.
  • lab_sim converts Behavior-collected training data with next-state action labels, wires trajectory_timing into Select Region for Coverage Path, and raises the gripper stall velocity threshold above simulated contact chatter.
  • vla_sim raises the stacking Objective's goal_path_tolerance to 0.5.
  • factory_sim uses a reachable solid-face bracket grasp.
  • kinova_sim prepares the arm's starting posture for the admittance path example.
  • The shared robotiq_description gripper package, used by the Robotiq-equipped configurations, namespaces its activation General-Purpose Input/Output (GPIO) and removes command interfaces from mimic joints under mock hardware.

Documentation Improvements​

Other Improvements​

  • Error messages about a missing user workspace now name moveit_pro setup_workspace, the command that creates one, rather than moveit_pro configure, which only records a path.
  • moveit_pro configure now offers to download the default user workspace when the configured path has none.
  • The default MoveIt Pro example workspace now downloads roughly twice as fast, by fetching its history without the file contents. Workspaces cloned from your own repository are unchanged.
  • Trajectory and action-client failures now name the configured controller action server, making multi-appendage controller issues easier to diagnose.
  • The agent logs now record complete /do_objective request payloads, including inline Behavior Tree XML and parameter overrides.
  • The shipped agent skills now read MoveIt Pro documentation from the Markdown pages and the llms.txt index at docs.picknik.ai, including archived release lines.
  • The Meta Quest teleop app is now downloaded and verified against a published checksum the first time you connect a headset, rather than shipped with MoveIt Pro. The first connection on each computer needs internet access. On an offline machine, place the app in ~/.local/share/moveit_pro/quest_oculus/, where MoveIt Pro finds it with no further configuration.
  • apt purge moveit-pro now removes the configured workspace's build and install folders, asking first when run from a terminal.

MoveIt Pro Core​

The changes below ship to every MoveIt Pro customer. They are collected here because they also reach MoveIt Pro Core customers, who install the standalone Core archive rather than the full Application Platform, and so are the subset of this release that a Core-only deployment receives.

  • PlanToJointGoal, SetupMTCPlanToPose, SetupMTCPlanToRobotState, SetupMTCConnectWithProRRT, and SetupMTCCartesianSequence gained an optional joint_costs port taking one cost per active joint, each at least 1.0. ComputeInverseKinematics gained a solve_mode port that ranks solutions by cost-weighted distance when set to optimize_distance. The costs also work on planning groups containing continuous joints, and can be set from the Python kinematics API through IKParams.joint_costs.
  • PlanToJointGoal, SetupMTCPlanToRobotState, SetupMTCPlanToPose, and SetupMTCConnectWithProRRT now accept the trajectory_timing port in time-optimal mode, and the shipped Move to Joint State, Move to Cartesian Pose, Move to Named Waypoint, and their Joint Trajectory Controller (JTC) variants expose it alongside their existing scale-factor inputs. The port also takes max_deviation, the maximum blend deviation from the planned path at each waypoint, which createTrajectoryFromWaypoints can set through trajectory options without changing the existing API.
  • The Path IK solver can now enforce a goal tolerance by refining the final path waypoint until its translation and rotation error are within the requested bounds, or failing with the remaining error. It is available through set_goal_tolerance on the Path IK solver options, the PathIK MoveIt Task Constructor (MTC) stage, and the Cartesian planner in the C++ and Python APIs. Callers provide both tolerances and can set either to infinity to leave that component unconstrained. Cartesian planner failures now report the underlying reason instead of Partial path IK found.
  • Pose IK and Cartesian path IK now support planning groups that contain mimic joints. Mimic joints follow their driving joint in the solution, but the solver does not enforce their own position limits.
  • World collision objects can now be padded for motion planning from the MoveIt Pro Python API, through ProRRTPlanner(world_padding=...) or set_world_padding(). Only collision checking sees the inflated shapes. Octree and plane shapes cannot be padded, and the planning result says so when that withholds a requested margin.
  • The Python PlanningScene gained collision padding methods for robot links, world objects (per object or all), and attached bodies, honored by the Python planning functions and collision checks. A carried object can be given extra clearance during placement with set_attached_body_padding, without duplicating collision meshes.
  • The Python ProRRTPlanner now exposes set_configuration_space_step, set_seed_attempts, and set_optimization_iterations, matching the options available through pro_rrt.RRTParams.
  • Planning failure messages now report the configured padding when the colliding body is an attached object.
  • MTC introspection memory is now bounded by default: only the most recently planned MTC tasks, 10 by default and configurable with mtc_introspection_retained_tasks in the objectives section of the robot configuration package's config.yaml, keep their introspection data, so Objectives with many MTC planning Subtrees no longer grow memory without limit. Evicted tasks still appear in the Task Constructor Debugger's planning iterations list, but their solutions can no longer be loaded.

Bug Fixes​

  • Fixed attached objects receiving zero collision padding and scaling when attached to a robot link without its own collision geometry, such as a flange or tool frame. Grasped payloads now respect link_padding; lower it on motion Behaviors if a close-quarters placement no longer plans. Core
  • Fixed the link_padding input port on ComputeInverseKinematics, which was being overwritten by the planning scene and had no effect on collision checking. Inverse kinematics now applies the padding you ask for, so it may refuse poses that were previously accepted. Set link_padding to 0.0 to restore the earlier padding. Core
  • Fixed the ProRRT shortcut stage validating segments more coarsely than the planner's own step, which let paths pass through obstacles between collision checks. The returned path is now sampled at the configured configuration_space_step in the Euclidean norm along its full length. Planning takes moderately longer at the same step; raise configuration_space_step to trade validation density for time. Core
  • Fixed SetupMTCMoveAlongFrameAxis accepting a max_distance of zero, a negative value, NaN, or infinity, which silently commanded a 1 metre Cartesian motion instead of failing. Such an Objective now fails before planning. Core
  • Fixed SetupMTCMoveAlongFrameAxis accepting a min_distance greater than its max_distance, which planned the motion and then always rejected it without explaining why. Core
  • Fixed zero-radius trajectory concatenation to preserve nanosecond-precise timestamps across CPU architectures. Core
  • Fixed the RViz Motion Planning Tasks panel showing zeroed statistics and missing tasks when RViz is started after an Objective with multiple MTC tasks has already run. Core
  • Fixed collision checking and path downsampling reading past the end of a trajectory waypoint when the planning group contained a mimic joint, which could report an unchecked trajectory as collision-free. Mimic joints are now derived from the joints they follow. Core
  • Fixed link padding and scale values that failed validation still being applied to the robot's collision geometry. A non-finite or non-positive value is now rejected and logged instead of reaching collision checking, and a planning scene carrying one bad entry alongside good ones still applies the good ones. A link scale of 0 is now refused rather than stored, so use the Allowed Collision Matrix to exclude a link from collision checking. Core
  • Fixed a spurious Tried to remove world object ... but it does not exist in this scene warning when a planning scene update removes a world object that is already absent. The removal now succeeds as a no-op. Core
  • Fixed ValidateTrajectory checking the wrong robot configuration when a trajectory listed the planning group's joints in a different order than the group, which could report a colliding trajectory as collision-free. Positions are now matched to joints by name in ValidateTrajectory, RecordJointTrajectory, and BlendJointTrajectories, the last of which could otherwise move the wrong joints after blending.
  • Fixed the Joint Velocity Controller interpreting the first velocity command of a batch by array position instead of joint name. A JointJog command that names a subset of the joints or lists them out of order now moves the named joints only.
  • Fixed a possible stall when planning a MoveIt Task Constructor task, where recording the task for the Task Constructor Debugger could block until it timed out.
  • Fixed the Task Constructor Debugger requesting the same stage's solutions twice when the stage was selected again while its previous request was still in flight.
  • Fixed a misleading "switching planning groups or controllers at runtime not supported" message when changing the arm or planning group during teleoperation. The switch always worked, and the notice is now a DEBUG-level log line.
  • Fixed ExecutePolicy warning about a clamped gripper command whenever a policy's gripper target landed slightly outside the joint's position limits. A target within 2% of the joint's position range past a limit is now clamped without a warning, and a larger overshoot is still reported.
  • Fixed MuJoCo viewer startup or closure hanging simulation and controller updates.
  • Fixed mesh marker rendering in the 3D Visualizer, where a marker naming an unsupported format such as .obj failed the whole view instead of being skipped, COLLADA (.dae) markers ignored the marker's color and mesh_use_embedded_materials fields, and STL markers rendered fully opaque when transparency was requested.
  • Fixed the 3D view blaming the MoveIt Pro Runtime when a robot mesh request never reached it. The error now distinguishes a request the Runtime answered from one that was dropped on the way, and points at the browser, its extensions, or a proxy in the second case.
  • Fixed the train-model skill crashing on the first training batch that decoded a video frame, because an unpinned torchcodec resolved to a build binary-incompatible with the pinned PyTorch version. The bootstrap now pins a compatible torchcodec and fails during setup rather than partway into a paid training run if the pin is ever wrong.
  • Fixed conversion of MCAP recordings to the LeRobot dataset format running out of memory on datasets with many recordings. Peak memory is now bounded by the largest single recording, a conversion that fails part-way no longer disturbs the previously converted dataset, and a converter killed by the operating system now reports the signal in the job log instead of the log going silent.
  • Fixed the MoveIt Pro Desktop App's launch and shutdown handling, where a closed, failed, or stalled instance left a process behind that blocked every later launch, launching again while it was still starting opened a second window and connection, and installed releases could not run side by side against their matching Runtimes.
  • Fixed compatible MoveIt Pro Desktop App and Runtime releases being rejected solely because their release version strings differed.
  • Fixed the MoveIt Pro Desktop App showing a generic Electron icon instead of the MoveIt Pro icon in Finder, Spotlight, and Launchpad.
  • Fixed user workspace path handling in moveit_pro configure, moveit_pro setup_workspace, and moveit_pro build user_workspace, which rejected a path written with ~ or an environment variable, recorded a mistyped or never-downloaded path instead of reporting or downloading it, reported "User workspace set." after rejecting a path, and discarded an invalid value without saying why.
  • Fixed MoveIt Pro treating the current working directory as the user workspace when none was configured, and moveit_pro run failing with "the user workspace does not exist" instead of offering to download the default workspace when it had not been downloaded yet.
  • Fixed the GPU validation checklist reporting a bare "Skipped" for the container toolkit on a machine with no GPU, where the row below it gave the reason.
  • Fixed newer AMD GPUs reporting as unrecognized because shells picked up Ubuntu's older Heterogeneous System Architecture runtime ahead of the one shipped with ROCm 7.2.2. Ubuntu's rocminfo is no longer installed.
  • Fixed the MoveIt Pro Desktop App asking for a frontend key again when editing a saved connection's address or service ports. The stored key now moves with the connection, and is only required again after you delete it.
  • Fixed the Teleoperate Objective starting automatically when the Teleoperation workspace is restored after startup or a Runtime reconnection. Selecting Teleoperation during a session still starts it.
  • Fixed Meta Quest teleoperation staying on "Searching for headset" after the on-headset app was closed, uninstalled, or crashed. MoveIt Pro now notices the controller data has stopped and reconnects on its own.
  • Fixed attached collision objects, TF frames, and other TF-positioned elements lagging behind the robot model in the 3D view when /tf has several publishers, such as in simulation.
  • Fixed a custom view pane losing its view selector when its content failed to load, which left no way to switch the pane to a different view.
  • Fixed expanding a Subtree in the Behavior Tree editor disconnecting the Subtree's contents when its file has a comment above the root node, which could also truncate that file when the Objective was saved.
  • Fixed Objectives failing to load when Behaviors under ReactiveSequence use generic XML tags.
  • Fixed deleted Objectives remaining selected or visible in the MoveIt Pro Desktop App sidebar.
  • Fixed adding keep-out zones failing before the planning scene has loaded.
  • Fixed loading a saved planning scene immediately clearing its restored objects.
  • Fixed the interactive marker's planning indicator remaining visible after planning fails or while waiting for trajectory approval.
  • Fixed the Task Constructor Debugger labeling candidates with non-finite costs as successful.
  • Fixed lawnmower coverage path generation on arm64 platforms such as Jetson, where every row was traversed in the same direction and the end effector cut diagonally back across the covered area instead of stepping between rows.
  • Fixed MuJoCo cameras rendering on the CPU instead of an available GPU when DISPLAY points at an X server without GPU acceleration.
  • Fixed slow startup of camera views that publish images infrequently, including AprilTag overlays.
  • Fixed green or corrupted camera and visualization streams for certain image widths.
  • Fixed the MCP build_workspace job aborting with a configuration discrepancy prompt when the host's saved MoveIt Pro command-line interface (CLI) configuration did not match the session's target.
  • Fixed the MCP get_recent_logs tool returning stale startup output instead of recent Runtime activity, and losing the startup diagnostics of a failed Runtime launch. It also gained bounded text filtering and log freshness information.
  • Fixed StopRecording completing before a following ConvertDataset could find the recorded dataset.
  • Fixed Trainer's dataset list remaining stale after a recording finishes.
  • Fixed automatically created Training Configs choosing a frame rate higher than the observed camera rate.
  • Fixed Trainer sidebar conversion of Objective recordings without commanded-joint messages by defaulting to Auto action labels. Conversions report their label source and prevent mixed-label output, with a confirmed retry that uses next-state labels for all episodes. Strict Command conversion remains available.
  • Fixed ConvertDataset reporting success for Command conversions when recording summaries confirm that the commanded-joint topic has no messages. The Behavior now fails before starting a job and names the action source setting to change.
  • Fixed moveit_pro run consuming a large fraction of a CPU core while idle, by removing redundant GPU detection and process-tree scanning from the launcher's polling loops.
  • Fixed the terminal being left with echo disabled after the moveit_pro CLI was killed while it was waiting at a prompt.
  • Fixed non-interactive installs and upgrades of the MoveIt Pro package printing a bare Error: from the workspace cleanup prompt. They now keep the workspace build artifacts and print the steps to rebuild.
  • Fixed the example workspace upgrade prompt stashing local changes and removing submodules, then failing, when the workspace was cloned with a single branch.
  • Fixed MoveIt Pro Desktop App release candidate package versions so successive candidates upgrade correctly and sort below the final release.

Breaking Changes​

  • ROS test dependencies are no longer installed in the MoveIt Pro Runtime image, which reduces its size and removes a GPL-3.0 Qt binding that a test fixture pulled in. Packages MoveIt Pro declared only as test dependencies are no longer installed on their own account, including the Panda, Fanuc, and PR2 test fixtures, xvfb, launch_testing, ros2_control_test_assets, topic_tools, and example_interfaces. If your workspace relies on one, declare it in your own package.xml and your workspace's dependency install will provide it, or install it directly with sudo apt install ros-$ROS_DISTRO-<package>.
  • The default blend deviation drops from 0.1 to 0.05 for every time-optimal trajectory, which reduces collision tunneling at path corners at the cost of slightly slower corners. Core
  • The velocity_scale_factor, acceleration_scale_factor, and trajectory_sampling_rate ports on PlanToJointGoal, SetupMTCPlanToRobotState, SetupMTCPlanToPose, and SetupMTCConnectWithProRRT are deprecated. They are used only when trajectory_timing is unwired. Core
  • ProRRTPlanner's padding argument and set_padding() are deprecated in favor of link_padding and set_link_padding(). The old spellings keep working and emit a deprecation warning. Core
  • The previous names of the waypoint and pose motion Objectives are deprecated aliases of Move to Named Waypoint and Move to Cartesian Pose. Existing Objectives keep working.

9.4.3

· 3 min read

Enhancements​

Reference Application Changes​

  • Migrated the formerly CLIPSeg-based text-segmentation Objectives in lab_sim, hangar_sim, kitchen_sim, and dual_arm_sim to Segment Anything Model 3 (SAM3).
  • Migrated the text-prompt segmentation Subtrees in picknik_ur_base_config, franka_base_config, and dual_arm_sim to SAM3, with the breaking interface changes below.

Breaking change: text-prompt Subtree ports​

Custom Objectives calling any of these Subtrees must update their input mappings:

  • Segment Image from Text Prompt Subtree.
  • Segment Image from No Negative Text Prompt Subtree.
  • Segment Point Cloud from Text Prompt Subtree.
Previous inputRequired update
promptsReplace with a single text_prompt.
thresholdReplace with confidence_threshold, which defaults to 0.5.
negative_promptsRemove; SAM3 has no equivalent input.
erosion_sizeRemove.
clip_model_path, clipseg_model_pathRemove. Use the bundled SAM3 defaults or configure encoder_model_path, decoder_model_path, geometry_encoder_model_path, and text_encoder_model_path.
model_packageSet to moveit_pro_sam3, or omit it to use that new default.

Retune existing threshold values: SAM3's confidence_threshold scores each detection, whereas CLIPSeg's threshold filtered individual pixels.

When no detection passes the threshold, these Subtrees now return success with empty mask outputs instead of failure. The point-cloud Subtree also returns an empty point_cloud_vector. Use the new mask_count output to handle zero detections before consuming the results.

The underlying GetMasks2DFromTextQuery Behavior remains registered in MoveIt Pro 9.4 for customers supplying their own CLIPSeg models.

Other Improvements​

  • The MoveIt Pro Runtime image no longer installs the unused FreeImage library. An overlay workspace that uses libfreeimage without declaring it must add <depend>libfreeimage-dev</depend> to its own package.xml.

Bug Fixes​

  • Fixed the interactive marker trajectory approval prompt disappearing after a failed plan, and fixed the ghost robot staying visible after the marker resets.
  • Fixed the interactive marker's planning indicator remaining visible after planning fails or while waiting for trajectory approval.
  • Fixed the terminal being left with echo disabled after the moveit_pro command was killed while it was waiting at a prompt.
  • Fixed the orthographic overhead (top-down) 3D view rendering rotated instead of axis-aligned.
  • Fixed MoveIt Pro Runtime containers losing access to Trusted Platform Module (TPM) and GPU devices when a host device's group ID matched a group that already exists in the container.
  • Fixed the example workspace upgrade prompt stashing local changes and removing submodules, then failing, when the workspace was cloned with a single branch.
  • Fixed expanding a Subtree in the Behavior Tree editor disconnecting the Subtree's contents when its file has a comment above the root node, which could also truncate that file when the Objective was saved.
  • Fixed moveit_pro run reporting a container healthcheck timeout as an application crash. The command now names the service that failed its healthcheck, the check it ran, the startup budget it was given, and what the last probe reported.
  • Fixed moveit_pro run misreporting a healthy service as crashed on hosts running Python 3.10, where Docker's timestamps failed to parse.
  • Core Fixed the ProRRT planner crashing when start or goal joint positions contain non-finite values. It now returns a planning error that names each affected joint and its value.

10.0.0

· 49 min read
ROS Humble Support Removed

MoveIt Pro 10.0 now requires ROS 2 Jazzy. ROS Humble is only supported in 9.4 and prior versions, as Humble is reaching end of life in May 2027. Support for ROS 2 Lyrical is on the roadmap for the 10.x line later this year.

Major Features​

MoveIt Pro Desktop App​

The MoveIt Pro Desktop App running an Objective, showing the Objectives sidebar, the 3D Visualizer, the Behavior Tree, the Joint Monitor, and a live camera view

MoveIt Pro now ships as a desktop application for Linux, with macOS and Windows coming soon. A connection screen discovers Runtimes on your network and lets you save, edit, and switch between them, so moving between a simulation on your laptop and a robot on the bench is a simple click that drops you straight into the workspace shown above.

Runtime deployments no longer bundle or serve the web app, so the Desktop App is how you connect to a Runtime in 10.0.

VLAs: Run Learned Policies on Real Robots​

A robot arm executing a learned policy on real hardware, aligning and inserting a metal plate onto a fixture

MoveIt Pro can now execute a learned policy as continuous, collision-checked robot motion, whether that policy is a vision-language-action model, a diffusion policy, or anything else served behind the policy interface. Motion stays smooth while the model thinks: each batch of predicted actions is blended onto the trajectory already running, so the arm never pauses between inference steps, and every action is checked against joint limits and self-collision before it reaches the controller.

Collect Sim and Real Data for Training​

Teleoperating the arm while the Training panel records a labelled episode, with the Record panel enlarged at right

Teach a robot by demonstration without leaving MoveIt Pro. An Objective can now start a recording session, snapshot each episode as it is demonstrated, and convert the finished dataset to LeRobot format, ready to train a policy on. Recording from an Objective shares the sessions and defaults used by the Training panel, so scripted and hand-driven collection produce one consistent dataset.

Train Vision-Language-Action Models in the Cloud​

Three steps: record a dataset in MoveIt Pro, upload it to Hugging Face, train on Runpod

Fine-tune a pi0.5 or SmolVLA policy on your own LeRobot dataset without managing a local GPU. The new train-model skill checks the training setup, estimates the Runpod cost, launches and monitors the job in your account, and publishes a servable checkpoint to your Hugging Face Hub repository.

Meta Quest Controller Teleoperation​

A pair of Meta Quest controllers

Drive the arm with a Meta Quest controller. Hold the clutch and the arm follows your hand along a collision-checked path, tuned for responsive motion, with the index trigger stepping the gripper open and closed.

Connect a Coding Agent with the MCP Server​

The Model Context Protocol logo

MoveIt Pro now runs a Model Context Protocol (MCP) server, so a coding agent such as Claude Code or Codex can connect to your Runtime and inspect Objectives, Behaviors, Waypoints, robot state, and recent logs. Connect over local stdio, or over authenticated Streamable HTTP for an agent running elsewhere. The packaged MoveIt Pro skills that guide an agent through robot configuration, Objective and Behavior authoring, runtime workflows, and ROS 2 verification are now version-aware, so its advice matches the release you are running.

Selectable Fixed Frame in the 3D View for Navigation​

The View menu&#39;s Fixed Frame picker, listing the transform frames the scene can be drawn relative to

Until now the 3D view always drew the world from a fixed world origin, which is wrong for any robot that moves. You can now choose which transform frame the scene is drawn relative to. On a mobile robot this is the difference between being able to watch a navigation run and not: view from map or odom and the robot drives through its environment; view from base_link and the robot holds still while the world moves past it, which is what you want when inspecting an arm motion or a sensor reading.

Core Faster, More Predictable Motion Plans​

A robot&#39;s joint-space path before and after optimization: the wandering unoptimized path in red versus the shorter, more direct path in green

MoveIt Pro 10.0 improves motion planning in difficult kinematic workcells. MoveIt Task Constructor pipelines can generate a broad set of inverse-kinematics candidates, then use the spawn_top_k batch IK stage to send only the most promising candidates into the expensive path-planning stages. The Pose IK solver also keeps wide-range revolute-joint solutions at their nearest in-range equivalent instead of shifting them a full revolution away, preventing unnecessary winding on joints with ranges such as 720 degrees. Together, these changes reduce wasted planning work and produce more direct, predictable robot motion.

MoveIt Task Constructor Debugger​

Stepping back through planning iterations in the Task Constructor Debugger, inspecting each stage&#39;s solutions and previewing a trajectory

Understanding why a task failed to plan no longer means reading logs. The MoveIt Task Constructor debugger is now a dockable sidebar that keeps a history of planning iterations: pick any past planning call and inspect its stages, the solutions each one produced, and their properties, then preview a chosen solution's trajectory in the 3D Visualizer before running it.

Octomap in the 3D Viewer​

Height-colored occupied voxels streaming from the planning scene into the 3D view, alongside the robot model

See what the robot thinks is occupied without opening RViz. Turn on Octomap in the View menu and the planning scene's occupied voxels stream live from the robot into the 3D view as height-colored boxes, alongside the robot model and point clouds.

Navigation Particle Filter in the 3D Viewer​

A mobile base navigating a hangar with its AMCL particle cloud drawn as arrows, alongside the costmap overlays

Watch a mobile robot localize itself. The 3D view can now overlay the navigation particle filter, drawing each AMCL (Adaptive Monte Carlo Localization) hypothesis as an arrow, so a robot that is confidently localized looks visibly different from one that is lost. Turn it on under Navigation in the View menu.

Mouse Control of Simulated Cameras​

Orbiting, panning, and zooming a MuJoCo simulation camera directly from its image stream

Orbit, pan, and zoom a MuJoCo simulation camera directly from its image stream, the same way the 3D Visualization pane already works. Reposition a simulated camera to frame what you need without editing the scene.

ROS 2 Jazzy on NVIDIA Jetson​

The ROS 2 Jazzy Jalisco release logo

MoveIt Pro runs on NVIDIA Jetson devices under ROS 2 Jazzy, bringing the current release line to Jetson hardware. Requires JetPack 7.2.

Measurement Tool in the 3D Viewer​

Clicking points in the 3D scene to build a polyline, with each segment&#39;s length, a running total, and per-axis deltas

Measure distances directly in the 3D scene. Click points to build a polyline and each segment reports its length, with a running total and per-axis deltas, enough to check a fixture offset or a part's dimensions without leaving MoveIt Pro or moving the robot.

Tiling View Panes​

Right-clicking a pane opens the tiling menu: split horizontally, split vertically, or remove the pane

The canvas is now a tiling workspace. Right-click any pane to split it horizontally or vertically, then swap, resize, fullscreen, or reassign panes until the layout matches the task: a tall 3D view beside two camera feeds with a terminal underneath, for instance. Your arrangement is remembered per robot configuration package, and the layout presets remain as a one-click starting point.

Planning Scenario Capture for Debugging​

A PlanToJointGoal Behavior in the Objective editor, whose planning requests can now be captured to disk

When a planning failure is hard to reproduce live, intermittent, or only seen in the field, MoveIt Pro can now record each PlanToJointGoal request to disk as a scenario: the robot model, planning scene, and full request, captured at the moment of planning. Attach it to a planning-failure report and PickNik can reproduce exactly what the planner saw.

Security: Web Endpoint Authentication​

The Add Connection dialog, with the required frontend key generated on the Runtime and stored in the operating system credential store

The MoveIt Pro web endpoints now require a shared frontend key on every connection, so a Runtime on a shared network is not open to anyone who can reach it. The CLI generates and stores the key automatically, and the Desktop App uses it to authenticate the Runtime's TLS certificate before sending credentials.

Enhancements​

Integrated AI Models and GPU Acceleration​

  • Added a shared inference model pool that deduplicates model loads across Behaviors, reclaims GPU memory from idle models, and releases loaded models before driver shutdown for a clean exit on GPU hosts.
  • MoveIt Pro now auto-selects the AMD ROCm container image and runtime when an AMD GPU is detected, matching the image-selection logic already used for NVIDIA GPUs. In this release, AMD GPUs accelerate simulation and camera rendering only; ML inference on AMD hosts falls back to the CPU.
  • Added text-encoder, geometry-encoder, and decode support to SAM3Detect, so its inference pipeline matches the reference SAM3 implementation.

New Behaviors and Libraries​

  • SetInitialPose re-seeds particle-filter localization at the robot's current pose.
  • GetRegionFromUser pauses an Objective, switches the canvas to a named camera view, and asks the operator to drag a bounding box on the image. It returns the selection as a geometry_msgs/PolygonStamped in normalized image coordinates, validated on the Runtime rather than trusted from the Desktop App.
  • GetMask2DFromRegion turns a region selected that way into a 2D segmentation mask, so an operator-drawn box can feed the same downstream vision Behaviors as an automatic detection.
  • GenerateSurfaceCoveragePath lays out a raster path of tool poses over a rectangular region, with configurable standoff, margin, and spacing, ready for PlanCartesianPath to follow.

Behavior and Library Improvements​

  • Model Predictive Control (MPC) Behaviors now stop the robot at the end of a streamed trajectory if updates cease and fail with an error when the trajectory controller rejects a trajectory or is unavailable, instead of silently doing nothing.
  • PlanCartesianPath now exposes a trajectory_timing input port to choose how the planned Cartesian path is timed: the existing time-optimal parameterization, or a new constant-speed Cartesian trapezoidal velocity profile that holds the tool's Cartesian speed constant between acceleration and deceleration ramps. The previous velocity_scale_factor, acceleration_scale_factor, and trajectory_sampling_rate ports are deprecated in favor of the new port.
  • /masks_visualization now draws thicker bounding-box outlines, so detections are easier to see.
  • InitializeMTCTask deprecates its controller_names port. It is no longer used to select controllers for execution, because ExecuteMTCSolution uses its own controller_action_name port and an explicit SwitchController step, and it will be removed in a future release.
  • InitializeMTCTask deprecates its trajectory_monitoring port. It is no longer used by MoveIt Task Constructor (MTC) execution and will be removed in a future release; to collision-check a planned trajectory against an updated planning scene, use the ValidateTrajectory Behavior at the Behavior Tree level.
  • Visualization, IK, and marker Behaviors now use the robot model's root frame instead of a hardcoded world frame, so they work on mobile robots whose model is rooted elsewhere.
  • CreatePoseStamped, CreateStampedPose, CreateTransform, TransformPose, and OverridePoseOrientation now use typed Quaternion orientation and Vector3 position ports instead of vector<double>. Existing Objective XML keeps working; Behaviors that pass these values by blackboard reference must supply the matching message type. See the 10.0 migration guide.
  • AveragePoseStamped and AveragePoseStampedVector gain an optional reference_frame port. If poses arrive in a moving frame, like a camera detecting an AR tag while the robot moves, averaging them in that frame gives a wrong result; setting this port to a fixed frame transforms each pose there before averaging.
  • PlanCartesianPath and SetupMTCPathIK gain a cartesian_constraint port to select whether the tool orientation is constrained while following a Cartesian path, editable through a new modal. The position_only port is now deprecated.
  • Core ComputeInverseKinematics and SetupMTCBatchPoseIK gain a joint_costs port that weights how expensive each joint is to move, steering the solver toward solutions that favor the cheaper joints. Costs apply when the Behavior compares candidates, so ComputeInverseKinematics needs solve_mode set to optimize_distance; setting costs under first_found fails with an error rather than being ignored.
  • The ProRRT planning Behaviors (PlanToJointGoal, SetupMTCConnectWithProRRT, SetupMTCPlanToPose, and SetupMTCPlanToJointState) now take orientation constraints through a single typed orientation_constraint port, with a dialog for setting per-link angle tolerances and an editable dropdown of the robot's links. The keep_orientation, keep_orientation_tolerance, and keep_orientation_link_names ports have been removed; see the 10.0 migration guide to migrate existing Objectives.
  • The GetMasks2DFromExemplar Behavior now loads SAM3 from a single versioned model bundle manifest via the model_bundle_manifest and runtime_id ports, replacing the four per-model path ports, and warns in the UI when inference falls back to CPU.
  • GetMasks2DFromPointQuery now runs on the shared model pool and loads its SAM2 models from a versioned model bundle, replacing its encoder_model_path and decoder_model_path ports with a single model_bundle_manifest port plus an optional runtime_id. Its image port now requires a 3-channel color encoding (rgb8, rgb16, bgr8, or bgr16).
  • The GetMasks2DAutomask Behavior now loads its SAM2 models from a single versioned model bundle through the shared model pool, using the new model_bundle_manifest and runtime_id ports in place of the separate encoder_model_path, prompt_encoder_model_path, and decoder_model_path ports. Models are shared with other Behaviors using the same bundle instead of being loaded once per Behavior, and a Behavior that falls back to CPU inference now says so in the UI.

Simulation Improvements​

  • MuJoCo simulation models, both MJCF (MuJoCo Modeling XML File) and raw URDF, can now reference mesh and asset files by ROS package:// URI (Uniform Resource Identifier), resolved automatically across packages without flattening assets into a single directory.
  • Added an optional base_link_name hardware parameter to the MuJoCo simulation interface so mobile robots can name the base link explicitly, keeping simulated sensor transforms from conflicting with the robot's own transform tree.
  • Added camera_shadows and camera_offsamples simulation hardware parameters for opting into higher-fidelity offscreen sensor rendering.
  • MuJoCo's engine plugins (cable and shell elasticity, signed-distance-field collision, plugin actuators and sensors) are now available to simulation models. Declare the ones a model needs in its MJCF <extension> block. Signed-distance-field collision and elasticity are considerably more expensive per simulation step than MuJoCo's native primitives; if a scene using them causes the simulation to fall behind real time, raise the model's timestep headroom or reduce contact density rather than loosening controller path tolerances.
  • The MuJoCo interactive viewer window now opens shortly after the simulation starts stepping, rather than during hardware initialization, and is skipped if the simulation is already shutting down. A viewer that fails to open no longer stops the simulation.

Discovery and Security​

  • Discover all running MoveIt Pro hosts advertised on the local network in the Desktop App.
  • Run several isolated MoveIt Pro deployments side by side on one machine, each with its own containers, network namespace, ports, data, and logs, for comparing two robot configurations or testing an upgrade without disturbing a working setup.
  • Added a per-host instance discovery service that lists a machine's MoveIt Pro deployments and their running state, started automatically by moveit_pro run and managed with moveit_pro discovery up|down|status.
  • Compacted the fixed ports to REST API 3200, Foxglove 3201, video signaling 3202, WebRTC media 3203, instance discovery 3204, and terminal 3205. Port 3203 carries the WebRTC camera media and must be reachable from the machine running the Desktop App over both UDP and TCP, which may require a firewall change when upgrading.
  • Added API-key authentication and TLS support for MoveIt Pro Runtime web endpoints.
  • Desktop connections authenticate the Runtime TLS (Transport Layer Security) certificate before sending deployment credentials.
  • Added a signed Runtime identity endpoint and verifier so direct and operator-managed clients can authenticate a MoveIt Pro deployment before transmitting credentials.
  • MoveIt Pro now automatically generates, securely stores, injects, displays, and rotates a deployment-specific Frontend Key through the command-line interface (CLI) without making it a startup prerequisite.
  • Developers can let a trusted local host supply the frontend key without storing it in the browser.
  • Isolated custom view panes from reusable Desktop App credentials and limited pane URLs and navigation to trusted Runtime origins.
  • The Desktop App now verifies authentication and Desktop App/Runtime compatibility before starting ROS, requiring a matching release, protocol epoch, and capability set.
  • Discovery now reports a yellow Not Ready status for Runtimes that answer but are not yet ready to accept Desktop App connections.

Misc User Interface Improvements​

  • Added a "Mark as favorite" option when creating a new Objective.
  • The Objective editor now preserves the direction (input, output, or bidirectional) authored on each Subtree port, instead of displaying every Subtree port as bidirectional.
  • You can now select a group of nodes in the Objective editor and wrap them in a new Sequence with Ctrl+G / Cmd+G or the Group Under Sequence button, making large Behavior Trees easier to organize.
  • The Favorites section of the Objectives sidebar can now be pinned so it stays visible while you scroll the rest of the list. Use the pin button in the section header; the choice is remembered per browser.
  • The planning scene now opens locked by default, preventing accidental edits to keepout zones until you explicitly unlock it.
  • The Alert Sidebar now compresses the view panes when opened, like the other sidebars, instead of overlaying them.
  • The terminal view pane now has a Skills menu that inserts a MoveIt Pro agent slash command at the prompt for the core workflows (create robot config, create Objective, create Behavior, debug Objective, run Objective).
  • Terminal view pane controls now sit in the pane's top bar alongside the view selector, on a blue strip matching the camera panes.
  • The docked terminal can be moved back into a grid pane with a new pin control, mirroring the grid pane's pin-to-dock.
  • View pane selector buttons now use a bordered style matching the docked terminal's shell selector.
  • Edit, View, and Run Behavior Tree panes now share a single renderer with consistent visual chrome and node affordances.
  • Behavior Tree zoom and location are now preserved when switching between Edit, View, and Run.
  • After an Objective fails during a Run, switching to Edit now outlines the failed branch (parent nodes show a red border and the failed node pulses) and re-centers on it, so you can immediately see and fix what failed.
  • Simplified Behavior Tree editing to a single snap-to-place mode. The "Classic line draw between nodes" connection-style setting has been removed; the tree re-lays out automatically as you drag Behaviors into place.
  • Redesigned the app's dialogs with a cleaner, consistent look and full keyboard and screen-reader accessibility.
  • Improved keyboard navigation in the web UI: interactive controls now show a consistent focus ring when focused from the keyboard, and multi-column menus support moving between columns with the left and right arrow keys.
  • Behavior Trees now open and switch between View, Edit, and Run modes without loading spinners, staying laid out and visually continuous across transitions.
  • View pane selectors, auxiliary pane menus, fullscreen controls, the pane split/remove menu, and the 3D Visualizer side buttons now auto-hide until the pane is hovered or focused. This is optional: turn off Auto-hide View Pane Controls in the Settings menu to keep them visible at all times.
  • The Blackboard Viewer can now order its list of blackboards alphabetically (A-Z / Z-A) or chronologically (newest or oldest first) via a dropdown in the panel header, making it easier to find a specific blackboard instance when an Objective produces many.
  • The "New Behavior" menu now points to the terminal create-behavior skill instead of the old in-app package generator. It explains the one-time skills setup and opens the AI Assistant terminal to scaffold a Behavior (header, source, registration, CMake, and tests) in one guided step.
  • The Logs / Notifications sidebar search bar now matches the consolidated search field used across the other sidebars.
  • Moved the measurement, camera-reset, and keepout-zone-lock controls from the 3D visualization overlay into the View menu.
  • Remap Meta Quest face buttons to recording and waypoint actions from Cartesian Jog.
  • Teleoperation now opens in Pose mode and orders its controls as Pose, Joint, IMarker, and Waypoints.
  • The Alert Sidebar now stays open until the alert icon is clicked again.
  • Training data collection now shows a one-time notice describing what recordings capture, where they are stored, and the operator's privacy responsibilities, and marks the feature as beta in the panel header.
  • Trainer now records the frame rate each episode was configured for alongside the rate actually observed, and shows both, so a recording that ran slower than requested is visible before it reaches training.
  • Settings now opens as a right-sidebar panel alongside the active mode, matching Training Data Collection, instead of a dropdown menu.
  • The connection error screen now explains what went wrong and lists troubleshooting steps instead of showing a raw stack trace. Full diagnostics moved behind a collapsible "Advanced error details" section.
  • Added a search field to the Blackboard Viewer for filtering blackboard scopes by name.
  • Opening the alert history sidebar with a long history is now dramatically faster: rows are virtualized, cutting median time to first frame from 4,115 ms to 258 ms with 1,000 retained alerts.
  • Menu hover and keyboard highlighting are now consistent across dropdowns, context menus, and selects.
  • Added a tooltip to the "Subtree-only Objective" checkbox explaining that it hides the Objective from the runnable list while keeping it available as a Subtree in the Objective builder.
  • Camera panes now stream over WebRTC instead of MJPEG (Motion JPEG). Latency and bandwidth both drop, the browser decodes in hardware, and one encode serves every viewer of a topic instead of one per viewer, so opening the same camera on three screens no longer costs three times the CPU.
  • Objective, Waypoint, and Behavior creation are now available from the global Add menu in every mode.

Documentation Improvements​

Other Improvements​

  • The MoveIt Pro Desktop App adds compatibility preflight, automatic Runtime recovery, persistent profile layouts, and cross-shell clipboard support.
  • Added the moveit_pro run --only-ui flag to run the web interface alone as an operator console that connects to MoveIt Pro deployments elsewhere on the network.
  • Robot configuration packages can explicitly configure and inherit their runtime launch file through runtime_launch_file.
  • Added a /health readiness endpoint and container healthchecks so deployments can sequence and monitor MoveIt Pro's containers; the drivers and agent containers now exit on failure instead of staying "up" while non-functional, so a supervisor can detect and restart them.
  • Added a "Robot Config Package" selector to the New Objective dialog so Objectives can be saved directly into a shared base configuration instead of only the running configuration.
  • The API documentation now includes the template-instantiated Behaviors (such as ResetPoseStampedVector, SavePoseToYaml, and LoadPoseStampedFromYaml), so the Behavior Hub links to them resolve.
  • moveit_pro CLI commands now load a .env file from the user workspace root, making per-deployment environment variables (for example, per-station camera serials) available to Docker Compose. Variables already set in the environment take precedence, so the file cannot override MoveIt Pro's configured values.
  • Added optimization_params, seed, and joint_range_constraint input ports to SetupMTCPlanToPose, matching the other ProRRT planning Behaviors, so free-space pose motions can use multi-seed planning and path refinement without hand-assembling the Connect and IK building blocks.
  • Run-mode Behavior Tree pane now renders commented-out nodes and dims skipif/disabled branches, matching the Edit and View panes.
  • The camera_topics port on RecordEpisode offers a multi-select of live camera topics in the Objective editor.
  • The zero_fts service of the velocity force and joint trajectory admittance controllers can now average multiple force/torque samples before applying the sensor offset, preventing a single noisy reading from causing drift in compliant motions. The number of samples is set with the new zero_fts_num_samples controller parameter (default 10). The sensor can now also be zeroed while the controller is idle, not only while a motion is executing.
  • The ~/zero_fts force/torque sensor zeroing service now replies only after the averaged tare has been applied, so a Behavior that zeroes the sensor and then commands motion waits for the tare instead of racing it. The sensor is only zeroed while the controller is idle: a trigger received during active force control is rejected with a failure response instead of being acknowledged immediately.
  • Camera encoding now runs only while a pane is open, and one encode is shared by every viewer of the same topic.
  • Camera panes now show a connecting indicator while a stream starts, instead of a black pane; streams start faster and switching between cameras within 30 seconds reuses the running encoder instantly.
  • The Velocity Force Controller and Joint Trajectory Admittance Controller can now publish the filtered force/torque wrench they act on (tare offset, low-pass filter, and deadband applied). Enable the new publish_wrench controller parameter to stop motions on a force threshold with ForceExceedsThreshold using the same wrench values the controller uses.
  • Removed the opt-in legacy rosbridge endpoint and its CLI flags; external clients must migrate to native ROS 2 or a supported web-bridge integration.
  • Added --with-inference-server to moveit_pro run to start a workspace-defined model inference server together with the stack, including automatic GPU serving on NVIDIA machines. The first run builds the server image before the stack starts, and reports that it is doing so.
  • Added --only-inference-server to moveit_pro run to run the model inference server on its own, so the loaded model survives stack restarts; the terminal reports the server's loading and ready status.
  • Simplified the config.yaml hardware section: additional_driver_launch_file and additional_agent_launch_file (both always included) replace simulated, robot_driver_persist_launch_file, simulated_robot_driver_persist_launch_file, and simulated_hardware_launch_file. A robot configuration package still using a removed key now fails to load with a message naming its replacement. See the config.yaml reference and the 10.0 migration guide for migration steps.
  • User-facing guidance in the Desktop App now uses Desktop App and Runtime terminology instead of browser, frontend, and backend, and points at Desktop App actions rather than refreshing the page.
  • Clarified the wording of CYCLONEDDS_URI errors reported by the launcher script.
  • Added Ubuntu 26.04 to the validated host operating systems and removed Ubuntu 22.04. Ubuntu 24.04 remains the recommended host.
  • Ubuntu source packages can now be retrieved from inside the MoveIt Pro container image with apt-get update && apt-get source <package>.
  • The MoveIt Pro Desktop App installs a moveit_pro_desktop command, matching the moveit_pro command that runs the Runtime.
  • moveit_pro run now prints the command that opens the MoveIt Pro Desktop App once the Runtime is up.
  • MoveIt Pro Desktop App installers now carry the release version in their filename and are published to a single download folder, for example https://download.picknik.ai/desktop/moveit-pro-desktop-10.0.0-ubuntu-24.04-amd64.deb.
  • Added MoveIt Pro Desktop App download links for Ubuntu and Fedora to the installation guide, the quick start tutorial, and the Desktop App guide.
  • moveit_pro run now prints the MoveIt Pro banner before any startup check, prompt, or warning, so every line of a launch appears under it.
  • Added the moveit-pro-license command-line tool, packaged for Debian-based (.deb) and Red Hat-based (.rpm) distributions, for provisioning licenses and performing offline activation.
  • The moveit-pro-license package is built and verified for Ubuntu 24.04 and 26.04, Debian Trixie, and Fedora 43 and 44. Debian Bookworm and Fedora 42 are not supported targets.

MoveIt Pro Core​

The changes below ship to every MoveIt Pro customer. They are collected here because they also reach MoveIt Pro Core customers, who install the standalone Core archive rather than the full Application Platform, and so are the subset of this release that a Core-only deployment receives.

  • SetupMTCBatchPoseIK now exposes a spawn_top_k port to propagate only the K IK (inverse kinematics) solutions closest to the seed (in joint-space) into the MTC pipeline, so an Objective can search the IK candidate space broadly without paying downstream planning time on far-from-seed branches.
  • The ProRRT planning Behaviors gain a pad_self_collisions option in their C++ and Python APIs, so robot link padding can stay enabled for environment collisions while being disabled for self-collision checks.
  • The Third-party Notices document shipped with MoveIt Pro now includes the complete license texts and a source-code availability statement for all bundled open-source components.
  • Objective start and cancel requests can now declare a caller identity (client type, name, and instance ID), and MoveIt Pro logs which caller started, preempted, or canceled each Objective.
  • String-keyed containers across the C++ API now share a single transparent hasher, moveit_pro_types::StringHash, replacing eleven near-identical per-package copies. Custom code that named a removed hasher (hash_utils::StringHash and its header control_common/hash_utils.hpp, moveit_studio_plugins::StringHash, or moveit_studio::waypoint_manager::StringHash) should switch to the shared one. Rebuild your user workspace against 10.0 rather than reusing a previous install space: a Behavior library built against 9.x that used the publisher-cache container will otherwise fail to load with an undefined symbol.
  • Added PlanningScene::applyAttachedCollisionObjectMsg, which reports why an attach or detach cannot be applied. The bool-returning processAttachedCollisionObjectMsg is deprecated and will be removed in the next major release; migrate to the new method. In Python, PlanningScene.process_attached_collision_object is replaced by apply_attached_collision_object_msg, which raises ValueError with the reason when the operation cannot be applied.
  • Removed the deprecated moveit_studio_common compatibility package; migrate dependencies, includes, namespaces, and CMake helpers to moveit_pro_common and moveit_pro_package.
  • Removed the legacy MoveIt trajectory execution manager and the MoveIt controller-manager plugin layer from move_group. Trajectory execution and controller switching now go through ros2_control controllers driven from the Behavior Tree. Robot configurations that referenced the MoveIt controller-manager plugin layer must migrate per the 10.0 user workspace migration guide.
  • Renamed the cartesian_planning package to path_ik and moved it next to pose_ik, since it implements path inverse kinematics rather than motion planning. Custom Behaviors and Python scripts need a matching update: package.xml and find_package()/link targets from cartesian_planning to path_ik, includes from <cartesian_planning/...> to <path_ik/...>, the C++ namespace from cartesian_planning:: to path_ik::, and Python imports from moveit_pro.kinematics.cartesian to moveit_pro.kinematics.path_ik.
  • Removed the unused STOMP (Stochastic Trajectory Optimization for Motion Planning) motion planner package. It had not been loadable since the planner-manager pipeline was removed; declaring a stomp_planning pipeline in config.yaml will now be an unknown key.
  • Removed unused legacy components, including the moveit_pro_ros_robot_interaction package and several internal moveit_pro_base sub-libraries that no longer had any consumers.
  • All C++ class members are now public or private: extension points (Behavior base class hooks, MoveIt Task Constructor stages, kinematics/collision plugin interfaces) are public, and internal members are private. See the migration guide for workspace impact.
  • Public C++ class members no longer use a trailing-underscore suffix. Members that were public with a trailing _ are renamed to drop it, or made private behind a public accessor (for example getRobotModel()). Custom kinematics plugins, joint models, or collision code that referenced these members by name need a mechanical rename; see the 10.0 workspace migration guide.
  • Motion-planning Behaviors now use the standard moveit_msgs/RobotState message type in place of the custom RobotJointState type. This is a breaking change for 10.0.0: the RobotJointState message and the RetrieveJointState service are removed. Migration: custom Behaviors, Objectives, or scripts that reference moveit_studio_agent_msgs/RobotJointState must switch to moveit_msgs/RobotState, and callers of the RetrieveJointState service must use RetrieveRobotState (response field robot_state). Previously saved joint-state YAML files continue to load. Behavior and port names are unchanged.

Bug Fixes​

  • Core Fixed license activation on machines whose primary network interface is not named eth0, and in containers that do not use host networking. The license fingerprint now uses the machine's Trusted Platform Module (TPM) when available and its permanent hardware network address otherwise.
  • Fixed a flaky test_joint_jog command-forwarding test by synchronizing command receipt between the ROS executor and test thread.
  • Fixed the "Point Cloud Not Visible" and "Octomap Warning" notifications repeating on every Objective run; each now appears at most once per session.
  • Fixed the Alert Sidebar so it slides open and closed smoothly in step with the view panes, matching the left sidebar, instead of an empty gap appearing before the panel and the panel disappearing without animating on close.
  • Fixed an issue where pressing Stop while GetMasks2DFromTextQuery was in CPU inference had no effect until the inference completed.
  • Fixed an issue where pressing Stop while GetMasks2DAutomask was in CPU inference had no effect until the inference completed.
  • Fixed a crash that prevented the MoveIt Pro Runtime from starting when the default Objective library was an installed, read-only package.
  • Fixed misleading guidance in the constant-speed Cartesian trapezoidal timing error from PlanCartesianPath: when the motion is too fast for the robot's joint acceleration limits while moving at constant speed through a curve, it now advises lowering the Cartesian velocity or increasing blending_radius rather than lowering the acceleration limits.
  • Fixed a Tutorial 2 step that wrongly described reordering MyBehavior to the top of the Sequence as optional. The demo Objective fails on the first tick unless MyBehavior runs before the Move to Waypoint Subtrees that read its output.
  • Fixed CYCLONEDDS_URI handling so valid file://, comma-separated local file lists, inline XML, and remote HTTPS URI forms are no longer rejected or misinterpreted as Docker bind-mount paths.
  • Fixed a memory leak where viewing the 3D point cloud caused unbounded memory growth in the main robot process; point-cloud processing now runs in a separate, memory-bounded container.
  • Fixed the streaming point cloud holding on to its raw data subscription when no client was watching it, wasting memory.
  • Fixed the robot visibly lurching and recentering in the 3D view when the selected fixed frame is one of the robot's own frames.
  • Fixed CropPointsInSphere to keep only the points inside the spherical region of interest. It previously ignored the sphere centroid pose and ran a slow nearest-neighbor filter over the whole point cloud. The Behavior now also fails with a descriptive error when crop_sphere_radius is not a positive finite number.
  • Fixed the Third-party Notices dialog rendering too narrow (wrapping the notice text) and too short on large screens.
  • Fixed poses provided through UI prompts resolving against the robot's position at execution time instead of at the moment the user placed them, when the pose is expressed in a moving frame.
  • Fixed AMD GPU device access in containers on hosts where the render or video group ID differs between the host and the container image.
  • Fixed the interactive-marker teleoperation approval prompt flickering and the trajectory preview disappearing after toggling Require Approval off then on and dragging the marker.
  • Fixed streaming camera point clouds and the streaming octomap rendering in the wrong place after changing the 3D view's fixed frame (for example from world to base_link).
  • Fixed the SAM2 clicked-points tutorial to explain how to prevent a live point cloud from obscuring the segmented result.
  • Fixed inconsistent font size on the Behavior Tree editor toolbar buttons (Run, Edit, Done) so they match the rest of the app's buttons.
  • Fixed the Add/Edit Custom View Panes modal so its Name and URL inputs no longer overflow horizontally.
  • Fixed the 3D camera orbit target so it centers on the robot immediately after upgrading, without requiring a camera reset.
  • Fixed the teleop sidebar showing a small loading spinner cropped against the top of the panel when entering teleop; it now shows a single centered loading indicator.
  • Fixed the admittance control axis on/off toggles so they no longer produce invalid nested-button HTML, improving accessibility.
  • Fixed the port-type tooltip in the Behavior Tree editor so it no longer flickers while hovering the type or its copy button.
  • Fixed ExecuteTrajectory silently ignoring a force/torque threshold when no admittance parameters were set; it now returns an error instead of running with no force limit.
  • Fixed AveragePoseStamped silently averaging pose samples given in different frames; it now fails with an error that suggests setting the reference_frame port.
  • Fixed the orthographic overhead (top-down) 3D view rendering rotated instead of axis-aligned.
  • Fixed inconsistent input sizing and focus rings in modal forms and the Training sidebar, and kept training configs saveable when the optional dataset namespace is empty.
  • Fixed direct navigation to /teleoperation not starting teleoperation.
  • Fixed the Add menu to show actions for the current workspace even when teleoperation remains active.
  • Fixed Teleoperation leaving its workspace without explaining why or offering a direct restart after its backing Objective stops.
  • Fixed the Clear All toast control remaining visible after all toasts were dismissed.
  • Fixed a rare issue where a controller could get stuck after stopping a fast motion, blocking trajectory cancellation and controller switching until a restart.
  • Fixed OpenGL framebuffer configuration and shader cleanup in perception depth filtering.
  • Fixed the view-pane controls hiding while a pane menu was open over the pane; they now stay visible for as long as the menu is open.
  • Fixed a view-pane toolbar dropdown flickering open and shut when opened while another pane menu was already open.
  • Fixed the missing divider between the left sidebar and the editor area; it is now shown consistently across the Behavior Tree editor, the view panes, and the bottom terminal, and lines up with the navbar divider above it.
  • Fixed the Planning Scene Editor opening without a 3D visualization pane, which made adding a Keep-Out Zone appear to do nothing.
  • Fixed inconsistent capitalization in the UI: Objective, Behavior, Behavior Tree, and Subtree are now capitalized in search fields, tooltips, dialogs, and notifications.
  • Fixed MPC (Model Predictive Control) initialization for robot models containing free joints and joints whose MuJoCo position and velocity addresses differ.
  • Fixed the Objective search box clearing itself when an Objective started running, which discarded the filtered list on every run.
  • Fixed intermittent MuJoCo point-cloud timeouts by reducing the default cost of offscreen sensor-camera rendering and avoiding redundant point-cloud reconstruction.
  • Fixed the moveit_pro_reset free-disk check passing on hosts with far too little space, where the build then failed partway through with an unrelated-looking "no space left on device" error.
  • Fixed the error screen icon color and spacing.
  • Fixed a segmentation fault when shutting down MoveIt Pro with Ctrl-C.
  • Fixed the teleoperation bridge exiting with an error during shutdown, which made the launch system report a clean shutdown as a crash.
  • Fixed the web server having to be force-killed at shutdown when browser connections were still open.
  • Fixed the "Clear All" alert button lingering over the Alert History sidebar when it is open, with no toasts to clear.
  • Fixed long Objective category names word-wrapping onto multiple lines in the left sidebar; they now truncate with an ellipsis on a single line.
  • Fixed the navbar mode switcher truncating the active mode name to an unreadable stub when the toolbar is narrow; it now tightens its layout first and then shows just "MODE" once too small to fit the name.
  • Fixed a crash while loading Behaviors caused by CreateJointState declaring vector defaults on its ports.
  • Fixed a single broken or missing collision mesh blanking the entire 3D robot view; collision-mesh load failures are now non-fatal.
  • Fixed the 3D camera orbiting around the scene origin instead of the robot when the selected fixed frame places the robot away from it, and restored the on-canvas reset control.
  • Fixed misaligned value inputs on ports carrying the pencil edit icon (quaternion, orientation, and typed-editor ports) in the Behavior Tree view.
  • Fixed the pane options menu covering pane-specific controls; it now sits directly below the expand button.
  • Fixed the orientation gizmo overlapping the pane controls in the 3D view.
  • Fixed Joint Monitor and Controller Monitor content colliding with the overlaid pane selector and expand controls.
  • Fixed info tooltips not appearing when opened inside a dialog.
  • Fixed Fit to View leaving the runtime Behavior Tree pane in manual zoom, so later pane resizes keep the tree framed.
  • Fixed hover feedback on auto-hiding pane controls and Objective actions, and closed Objective hover cards when a dialog opens.
  • Fixed danger-outline buttons showing a blue hover background instead of a red tint.
  • Fixed teleoperation showing a Run action while it was still starting, and fixed an expected teleoperation stop being reported as an error.
  • Fixed unsafe filename handling for planning-scene save/load and generated Behavior packages, and removed a vulnerable runtime dependency from the release container.
  • Core Fixed attached collision objects intermittently flashing or staying the default red color instead of keeping their assigned color.
  • Core Fixed a linker error when building a user-workspace package against the licensing library from the installed MoveIt Pro Core Debian packages.
  • Core Fixed a memory leak where each MoveIt Task Constructor task permanently retained a full planning scene, a major contributor to Objective server out-of-memory crashes on robots with large collision meshes.
  • Core Fixed exception handling and synchronization in legacy visualization job processing while preserving queue and callback semantics.
  • Core Fixed invalid collision and distance-field results for null geometry, non-finite inputs, and degenerate sampling conditions.
  • Core Fixed waiting for a complete robot state incorrectly reporting success when the requested joint group was undefined or when joints in that group had never been received. The wait now fails and logs which joints are missing.
  • Core Fixed GenerateRandomPose samplers sharing distribution parameters. Previously a single distribution object was shared by every GenerateRandomPose in the process, so the first registered sampler's range or standard deviation was silently reused by all later samplers of the same distribution type. Configurations using more than one sampler of a given type will now sample the ranges they actually requested.
  • Core Fixed interactive-marker teleoperation executing motions without the approve/deny prompt when the web UI predates the approval field; the approval gate now stays on (fails closed) for any client that omits it.
  • Core Fixed RobotState transform lookups silently returning stale or default poses when forward kinematics had not been refreshed; reads now return an up-to-date value or fail with a clear error instead of quietly using outdated data. This is transparent to standard Objectives and Behaviors, but customers reading transforms from a const RobotState in custom C++ Behaviors, or against MoveIt Pro Core C++ APIs, should refresh forward kinematics on the state (or use a non-const RobotState) before those reads.
  • Core Fixed an off-by-one limit that rejected robots configured with exactly four admittance tip links, the supported maximum; configurations beyond the capacity limits now stop the motion with a clear error.
  • Core Fixed navigation failing on mobile platforms in simulation and hardware, caused by nav2's navigator crashing at startup on a library conflict with MoveIt Pro's Behavior Tree runtime. The two now ship as separate libraries and navigation Objectives such as Navigate to Clicked Point work on ROS 2 Jazzy.
  • Core Fixed PoseIK inverse kinematics occasionally reporting success for a joint configuration whose pose error exceeded the requested target_tolerance; this could occur when the seed-distance optimization was weighted heavily (large optimization_distance_gain).
  • Core Fixed MTC attach and detach Behaviors (SetupMTCAttachObjectByID, SetupMTCDetachObjectByID) reporting success when the operation could not be applied. Planning now fails when the object is missing from the scene, attached to a different link, or has an empty id, and succeeds without changes when the requested state already holds.
  • Core Fixed distance-field gradients and occupied-octree sampling at fractional resolutions.
  • Core Fixed invisible distance-field visualization markers, and invalid colors when their normalization distance is zero.
  • Fixed missing robot links in the 3D Visualizer when URDF joint axes contain extra whitespace.
  • Fixed the Teleoperation mode being unavailable while an Objective is running. Selecting it now stops the running Objective and hands control to the operator, as it did in 9.4.
  • Fixed simulated sensor frames inheriting localization error on mobile robots, which made point clouds land away from the robot. Sensor frames declared as MuJoCo sites are now published relative to the robot link that carries them, so resolving one requires the robot's transforms to be available.
  • Fixed Send Point Cloud To UI reporting NaN removal as the cause when the point cloud it received was already empty.
  • Fixed silent motion corruption when an Objective started a second MPC Behavior while one was already running. The second Behavior now fails with a message explaining that only one can run at a time.
  • Fixed the canvas layout presets and the teleoperation gripper buttons having no accessible name, so screen readers can identify them and hovering shows what each control does.
  • Core Fixed the third-party notices shown in the About dialog, which incorrectly stated that the AprilTag detection method is patented.
  • Fixed intermittent left-sidebar animation stalls, canvas resizing jumps, viewport gaps, and top-bar boundary lag during Objective execution and warning activity.
  • Fixed apt remove moveit-pro and package upgrades silently leaving MoveIt Pro Docker images on disk. Removing or upgrading the package now stops and deletes the previous version's containers so their images are reclaimed rather than only untagged, and an upgrade re-pulls the images for the new version.
  • Fixed the crash report from moveit_pro run showing another service's logs instead of the one that failed. It now names the failed service, says whether it was terminated by a signal or killed by the kernel's out-of-memory killer, gives the time of death, and shows that service's own log output.
  • Core Fixed planning-scene stages silently continuing after a rejected world-object, attach, or detach operation, while preserving absent-object removal as a no-op.
  • Core Fixed multi-degree-of-freedom (multi-DOF) trajectory messages emitting unavailable or joint-misaligned derivative data.
  • Fixed the documented commands for scaffolding a new Behavior or robot configuration package, which used a cookiecutter executable that is not installed in MoveIt Pro containers. Use python3 -m cookiecutter instead.
  • Fixed duplicated Objectives not appearing in the Objectives sidebar immediately after creation.
  • Fixed simulated cameras becoming unavailable when the MuJoCo interactive viewer is enabled in a scene that contains cameras.
  • Fixed MuJoCo camera rendering giving up when the first graphics device it tried failed partway through setup. It now tries the machine's other graphics devices, preferring a GPU over software rendering, and reports which one it used.
  • Fixed repeated moveit_pro run failures after a service container exited. Containers are now replaced only for services that are not running, leaving other running services untouched.
  • Core Fixed MoveIt Pro C++ packages to consistently exclude Eigen's optional LGPL-licensed modules, and propagated that restriction to packages that link MoveIt Pro C++ targets. With Eigen 3.4 this excludes only Eigen::constrained_cg and Eigen::IterationController from unsupported/Eigen/IterativeSolvers.
  • Fixed teleoperation joint sliders, Interactive Marker moves, and waypoint buttons failing to execute until the teleoperation mode was changed.
  • Fixed the collision-checking toggle being ignored during Pose Jog.
  • Fixed teleoperation and other publishing staying silently dead after a lost connection to the MoveIt Pro Runtime, until the app was reloaded.
  • Fixed a spurious MOVEIT_LICENSE_KEY is not set error printed on startup before MoveIt Pro prompts for the license key.
  • Core Fixed full (non-diff) planning scene updates needing to be applied twice to take effect while planning scene publishing is active, and link padding changes being silently reverted by the scene publisher.
  • Fixed upgrades on Red Hat-based distributions leaving Docker images from the previously installed MoveIt Pro version on disk.
  • Fixed Behavior boxes in the Behavior Tree view clipping their contents when more ports were shown.
  • Fixed MoveIt Pro re-running its startup checks, and re-showing the prompts attached to them, several times during a single command.
  • Core Fixed the MoveIt Pro Runtime reporting a successful start when its license could not be activated. moveit_pro run now fails with the license error and the container exits non-zero, instead of leaving a Runtime that cannot plan or execute.
  • Fixed Joint Jog's controls doing nothing after the Teleoperate Objective was stopped. Jogging now starts it again, and releasing a control no longer restarts it.
  • Fixed joint-slider motions after the first command stopping before the robot moved, because an earlier command's completion event was replayed and consumed as though it belonged to the new command.
  • Fixed release candidate packages sorting above the release they precede, which made installing a release over a release candidate of the same version fail as a downgrade.
  • Core Fixed the MoveIt Pro Core archive failing to install because ros-jazzy-scenario-logging required a package the archive did not contain.
  • Core Fixed the public MoveIt Pro SDK package metadata to consistently declare its BSD-3-Clause license.
  • Fixed invalid material colors in the 3D Visualizer when URDF rgba values contain extra whitespace.
  • Fixed the Segment Image from Point Objective returning a mask of the wrong object. Point prompts are now positioned correctly for any camera resolution.
  • Fixed navigation costmaps showing stale occupancy data after returning to the 3D Visualizer pane.
  • Fixed simulated mobile bases not reaching their configured maximum velocity during navigation.
  • Fixed unintended dragging of the 3D Visualizer view selector and orientation gizmo, while preserving camera rotation and axis selection on the gizmo.
  • Fixed compiler and CMake deprecation warnings about the tl_expected package when building custom Behavior packages against MoveIt Pro. Custom Behavior packages that include tl_expected/expected.hpp themselves can switch to tl/expected.hpp to silence the same notes in their own code.
  • Fixed copying text out of the built-in terminal. Text selected with the mouse can be copied with Cmd+C (Ctrl+C on Linux and Windows), and a coding agent's own copy now reaches the system clipboard. While an agent is using the mouse, hold Option on macOS (Shift on Linux and Windows) before starting to drag to select by hand.
  • Fixed moveit_pro run --config-package <name> being ignored during first-run setup, which made the command prompt for a robot configuration on a freshly installed system.

Breaking Changes​

  • Removed the deprecated ExecuteMTCTask Behavior. Use the Execute MTC Solution Subtree (or the ExecuteMTCSolution Behavior) to execute MoveIt Task Constructor solutions directly through the robot controllers. See the 10.0 user workspace migration guide for how to update existing Objectives.
  • Removed the legacy GraspableObject-based collision Behaviors that were deprecated in MoveIt Pro 9.4: ModifyObjectInPlanningScene, AddVirtualObjectToPlanningScene, CreateCollisionObjectFromSolidPrimitive, CreateSolidPrimitiveBox, RemoveCollisionObjectFromPlanningScene, SetupMTCUpdateObjectCollisionRule, SetupMTCUpdateGroupCollisionRule, SetupMTCIgnoreCollisionsBetweenObjects, SetupMTCAttachObject, and SetupMTCDetachObject. Objectives that still use them will fail to load; the migration guide covers the replacements.
  • Removed the deprecated controller_names and trajectory_monitoring ports from the InitializeMTCTask Behavior, and removed the legacy /execute_task_solution move_group execution capability they fed. Migration: delete any controller_names or trajectory_monitoring attributes from InitializeMTCTask in your MTC Objectives; an Objective still wiring them will fail to load. Controllers are activated with an explicit SwitchController step, ExecuteMTCSolution selects its controller via its own controller_action_name port, and to collision-check a planned trajectory against an updated planning scene use the ValidateTrajectory Behavior.
  • Removed the superseded CLIPSeg text-query segmentation Behavior and model implementation; use SAM3 text-prompt segmentation instead.
  • Removed the deprecated ExecuteFollowJointTrajectory and ExecuteTrajectoryWithAdmittance Behaviors. Use ExecuteTrajectory with execution_pipeline="jtc" or "jtac" instead.
  • SetAdmittanceParameters no longer supports the deprecated ros2_control layered admittance controller and now only produces admittance parameters for use with ExecuteTrajectory. The controller_name and base_frame configuration fields have been removed.
  • Removed the deprecated CreateStampedPose, CreateStampedTwist, and CreateStampedWrench Behaviors. Use CreatePoseStamped, CreateTwistStamped, and CreateWrenchStamped instead; the 9.x to 10.0 migration guide shows the port mapping.
  • Renamed seven joint-state planning Behaviors so each name states the robot-state type it carries: GetRobotJointState→GetJointState, CreateJointState→CreateRobotState, GetTrajectoryStateAtTime→GetRobotStateFromTrajectory, RetrieveJointStateParameter→RetrieveRobotStateParameter, and the SetupMTC…ToJointState planning setups to SetupMTC…ToRobotState. The old names still work as deprecation aliases and will be removed in a future major release.
  • Removed the DiffusionPolicy Behavior and its end-to-end training guide. Use ExecutePolicy to run a learned policy, including a diffusion policy, by serving it behind the GetActionChunk service.
  • Removed the deprecated legacy ONNX types and the model-loading path they belonged to. Custom Behaviors that still construct ONNXImage, PointPrompt, BoxXYWH, or BoxCXCYWH, or that load models directly, must move to the typed tensor family and the shared model pool; see the pooled pipeline examples under src/ml.
  • Renamed MoveIt Pro Docker image repositories from moveit-studio to moveit-pro for the 10.0 release.
  • Renamed the agent_bridge Docker Compose service (and its moveit-pro-agent-bridge image) to runtime / moveit-pro-runtime to match the product terminology. User workspaces must rename the service, their config's agent_bridge.launch.xml to runtime.launch.xml, and rebuild the renamed image. See the 10.0 user-workspace migration guide.
  • Renamed the browser-facing endpoint credential from MOVEIT_API_KEY to MOVEIT_FRONTEND_KEY and labeled it as the frontend key.
  • Removed the GetGraspPoseFromPointCloud L2G (Learning to Grasp) Behavior and its ONNX inference integration. There is no equivalent learned point-cloud-to-grasp replacement.
  • cartesian_constraint and position_only are mutually exclusive: an Objective that sets both will now fail. Remove position_only and use cartesian_constraint (POSITION_ONLY reproduces the old position_only: true; POSITION_AND_ORIENTATION reproduces position_only: false). Objectives that set neither are unaffected.
  • Camera streaming now uses the VP8 codec, removing all H.264 encoding from MoveIt Pro. Custom WebRTC-HTTP Egress Protocol (WHEP) clients that assumed H.264 should be checked before upgrading.
  • The MoveIt Pro Runtime image ships no FFmpeg, no OpenH264, no High Efficiency Video Coding (HEVC) decoder, and no usb_cam driver, and OpenCV video I/O now uses its GStreamer backend. Workspaces that compiled against FFmpeg headers or launched a usb_cam node must declare those dependencies themselves; installing FFmpeg's development packages replaces MoveIt Pro's placeholder package automatically. See the 10.0 user workspace migration guide for migration steps.

For step-by-step upgrade instructions, see the 10.0 user workspace migration guide.

8.10.8

· 2 min read

Enhancements​

New Behaviors and Libraries​

  • SaveMTCTaskInspection exports all MoveIt Task Constructor (MTC) task introspection data (stage tree, statistics, every solution and failure, interface states, and per-stage failure explanations) to a timestamped JSON file for offline triage of planning failures.

Reference Application Changes​

These changes come from the v8.10 branch of moveit_pro_example_ws.

  • Fixed the Franka end effector in dual_arm_sim and kitchen_sim rendering with a 45-degree twist between the 3D Visualizer and MuJoCo, which put grasps 45 degrees off.
  • Fixed the Sort Blocks Objective in dual_arm_sim re-grasping blocks that had already been removed and failing once the table was cleared; it now completes successfully.

Bug Fixes​

  • Fixed the PoseIK inverse kinematics (IK) solver adding an unnecessary full-revolution wraparound for joints whose range is wider than one full turn, so solutions now stay near the requested angle.
  • Fixed toast error messages displaying literal <code> tags instead of formatting file paths as inline code.
  • Fixed changes to a Behavior's port values (such as the waypoint in RetrieveWaypoint) not being saved when clicking Done in the Behavior Tree editor.
  • Fixed the upgrade flow so existing user workspaces are checked and upgraded before MoveIt Pro builds them.
  • Fixed unavailable action server errors so they include the missing action server name.
  • Fixed first-run setup on NVIDIA hosts without the NVIDIA Container Toolkit so the default user workspace is created before MoveIt Pro stops with a targeted toolkit setup message.
  • Fixed the first-install configuration flow so MoveIt Pro no longer prints a missing license-key error before prompting the user for their license key.
  • Fixed moveit_pro configure repeatedly prompting users to add system-managed environment variables such as STUDIO_DOCKER_TAG to their configuration.
  • Fixed a false crash message when stopping MoveIt Pro with Ctrl-C during normal shutdown.
  • Fixed the AddURDF Behavior silently reporting success when a URDF had a syntax error that dropped geometry; the tool is still added, but MoveIt Pro now warns that geometry was dropped and reports the specific reason.

9.4.2

· 6 min read

Enhancements​

Behavior and Library Improvements​

  • The zero_fts service for the velocity force and joint trajectory admittance controllers can now average multiple force/torque samples before applying the sensor offset, preventing a single noisy reading from causing drift in compliant motions. The number of samples is set with the new zero_fts_num_samples controller parameter, which defaults to 10. The sensor can now also be zeroed while the controller is idle.
  • Core Added a pad_self_collisions option to the ProRRT planner through RRTParams.pad_self_collisions and ProRRTPlanner.set_pad_self_collisions. Disable it to stop link_padding from applying to self-collision checks.
  • Added complete /do_objective Software Development Kit (SDK) request payloads, including inline Behavior Tree XML and parameter overrides, to the agent logs.

Reference Application Changes​

  • Fixed the hangar_sim robot configuration package to select Navigation 2 parameters for its ROS distribution, allowing navigation to start on Jazzy while preserving Humble support.
  • Fixed competing transform publishers in the hangar_sim robot configuration package by making robot_state_publisher the sole owner of the ridgeback_base_link transform.
  • Fixed the example workspace installation on Ubuntu 24.04 hosts where the requested user ID was already assigned.

Other Improvements​

  • Added a configurable MoveIt Pro web bridge port so legacy rosbridge integrations can continue using port 3201.
  • moveit_pro run --only-drivers and --no-drivers are now a paired flag; if both are passed, the last one wins instead of exiting with an error.
  • moveit_pro run now rejects --rosbridge-port unless --enable-rosbridge is also passed, instead of silently ignoring the port.
  • Core The license fingerprint now prefers a Trusted Platform Module (TPM) 2.0 endorsement key when one is available and falls back to a permanent hardware network interface. Each computer registers a new activation the first time it starts after upgrading; users of offline activation must request a new activation before MoveIt Pro will start.
  • Added an optional base_link_name hardware parameter to the MuJoCo simulation interface so mobile robots can name the base link explicitly, keeping simulated sensor transforms from conflicting with the robot's transform tree.
  • The moveit_pro_license command-line tool is now available as amd64 and arm64 Debian packages for provisioning licenses and performing offline activation.
  • The MoveIt Pro Runtime image no longer installs the usb_cam driver. A workspace that launches a usb_cam node should declare usb_cam in its robot configuration package's package.xml, allowing rosdep to install it into the workspace image.
  • The MoveIt Pro Runtime image no longer ships FFmpeg or GNU General Public License (GPL) codec libraries. Workspaces that need them can install them in their overlay Dockerfile, subject to the licenses' source-provision obligations for redistributed images.
  • Overlay images that compile against FFmpeg headers must now install them explicitly. See Installation Troubleshooting for the one-command fix.
  • The camera stream server no longer offers the vp8, vp9, and h264 stream types, which required FFmpeg and were not requested by the MoveIt Pro Desktop App. Camera panes are unchanged.
  • OpenCV video input and output now use the GStreamer backend instead of FFmpeg. Reading and writing image files is unaffected; workspaces that open video files or Real-Time Streaming Protocol streams through cv::VideoCapture may see different format support.
  • High Efficiency Image Container decoding is no longer available in Humble images because its decoder is GPL-licensed. AV1 Image File Format and AOMedia Video 1 decoding are unaffected. Jazzy images retain High Efficiency Image Container decoding but no longer include its development headers.

Bug Fixes​

  • Fixed a stale Approve Trajectory prompt that could reappear after stopping teleoperation and reloading the MoveIt Pro Desktop App.
  • Core Fixed a memory leak where each MoveIt Task Constructor (MTC) task permanently retained a full planning scene, which could cause the Objective Server to run out of memory on robots with large collision meshes.
  • Fixed direct execution of Objectives whose Subtree variables have blackboard-variable defaults such as {grasp_pose}; these now report a clear missing-input error instead of passing the literal text to Behaviors.
  • Fixed the blackboard variable dropdown inside a Subtree suggesting the parent-side default binding instead of the Subtree's own variable names.
  • Fixed a turn-rate-dependent odometry lag on mobile bases that degraded lidar localization during turns.
  • Fixed missing Alert History records for Objectives started externally through /do_objective.
  • Fixed Objective names intermittently not appearing for short Objectives started externally through /do_objective.
  • Fixed external version checks and related error notifications when running in playback mode.
  • Core Fixed MTC attach and detach Behaviors reporting success when the operation could not be applied. Planning now fails when the object is missing from the scene, attached to a different link, or has an empty ID, and succeeds without changes when the requested state already holds.
  • Fixed coverage path generation on Arm 64-bit targets such as Jetson, where plain char is unsigned, so zig-zag coverage paths alternate row direction correctly.
  • Fixed waypoint descriptions remaining on screen after the pointer moved away.
  • Fixed Debian package removals and upgrades leaving old MoveIt Pro Docker images and containers on disk.
  • Core Fixed the RViz Motion Planning Tasks panel showing zeroed statistics and missing tasks when RViz starts after an Objective with multiple MTC tasks has already run.
  • Fixed repeated moveit_pro run failures after a service container exited by replacing only containers for services that are not running.
  • Core Fixed closing the RViz window launched by moveit_pro rviz crashing or hanging during shutdown.
  • Core Fixed license activation on computers whose primary network interface is not named eth0, which previously caused machines of the same hardware model to present an identical license fingerprint.
  • Fixed license files with trailing whitespace being rejected by moveit_pro_license.
  • Fixed heap corruption in moveit_pro_license when requesting license activation responses.
  • Fixed moveit_pro_license requests failing with a Transport Layer Security certificate error on hosts installed without recommended packages.
  • Fixed moveit_pro_license --offline failing to write the activation response it had just retrieved.
  • Fixed moveit_pro_license failing to parse offline activation responses returned by the license service.
  • Core Fixed teleoperation being unavailable on robot configuration packages whose planning group includes a linear rail.
  • Fixed MoveIt Pro startup crashes on Jazzy when Navigation 2 and MoveIt Pro require incompatible BehaviorTree.CPP versions.
  • Core Fixed full planning scene updates needing to be applied twice to take effect while planning scene publishing is active, and fixed link-padding changes being silently reverted by the scene publisher.
  • Core Fixed the stage interface-flow arrows rendering incorrectly in the RViz Motion Planning Tasks panel.
  • Fixed Fedora package upgrades leaving Docker images from the previously installed MoveIt Pro version on disk.
  • Core Fixed the MoveIt Pro Core archive failing to install because ros-jazzy-scenario-logging required a package the archive did not contain.
  • Fixed the interactive-marker teleoperation approval prompt flickering and the trajectory preview disappearing after toggling Require Approval off and on and dragging the marker.
  • Fixed Jetson images losing NVIDIA's accelerated OpenCV when FFmpeg was removed from the MoveIt Pro Runtime image.

9.4.1

· 4 min read

Enhancements​

Reference Application Changes​

  • Fixed bin picking in factory_sim to sample grasp yaws and skip unpickable brackets.
  • Fixed the text-prompt segmentation example in hangar_sim to move to the View Boxes waypoint before segmenting.
  • Fixed the Sort Blocks Objective in dual_arm_sim to complete gracefully.

Bug Fixes​

  • Fixed the 3D Visualizer dropping namespace-scoped marker DELETEALL clears when Auto-Clear on Run is disabled, which left stale markers visible.
  • Fixed the example workspace auto-download progress timer so it keeps updating during long Git clone phases.
  • Fixed first-run setup so moveit_pro run downloads the default user workspace when a preserved config file points at a workspace path that no longer exists.
  • Fixed missing color in ROS backend logs from processes launched outside an interactive shell.
  • Fixed the mesh decimation utility to use Trimesh instead of MeshLib, which is no longer installed with MoveIt Pro.
  • Fixed intermittent core Behavior loading failures caused by unresolved stopwatch clock symbols.
  • Fixed Docker image builds so memory-constrained hosts can cap both per-package compiler jobs and colcon package-level parallelism.
  • Fixed moveit_pro configure repeatedly prompting users to add system-managed environment variables such as MOVEIT_DOCKER_TAG to their configuration.
  • Fixed a false crash message when stopping MoveIt Pro with Ctrl-C during normal shutdown.
  • Fixed the first-install configuration flow so MoveIt Pro no longer prints a missing license-key error before prompting the user for their license key.
  • Fixed a hang where running two GetPointsFromUser prompts back-to-back left the second prompt unresponsive; consecutive point prompts now each render and accept their own selection.
  • Fixed unavailable action server errors so they include the missing action server name.
  • Fixed first-run setup on NVIDIA hosts without the NVIDIA Container Toolkit so the default user workspace is created before MoveIt Pro stops with a targeted toolkit setup message.
  • Fixed URDF generation failing for planning groups whose links span disconnected branches of the kinematic tree, such as some gripper groups.
  • Fixed the upgrade flow so existing user workspaces are checked and upgraded before MoveIt Pro builds them.
  • Fixed AddURDF silently reporting success when a URDF had a syntax error that dropped geometry; the tool is still added, but MoveIt Pro now warns that geometry was dropped and reports the specific reason.
  • Fixed Ctrl/Cmd-click multi-select in the Behavior Tree editor; holding Ctrl (or Cmd on macOS) and clicking now adds nodes to the selection instead of replacing it.
  • Fixed JSON blackboard values rendering as truncated, unexpandable text; JSON objects now display compactly and can be expanded to view the full value.
  • Fixed AttributeError when setting path_constraints on the MTC (MoveIt Task Constructor) Connect stage from the Python API.
  • Fixed false crash detection when restarting MoveIt Pro after Ctrl-C stops Docker Compose containers.
  • Fixed unbounded Objective Server memory growth when an Objective plans many MTC tasks. The InitializeMTCTask Behavior gains an enable_introspection port (default on); set it to false to free each task's planning data after it plans, trading that task's MTC inspector visibility and detailed failure alerts for bounded memory.
  • Fixed the plan_cartesian_space.py Python example to use the correct PathCollisionInfo attributes (path_index, collision_check_result) and documented how to request collision contact information via collision_check_request.contacts.
  • Fixed several controller crashes triggered by oversized planning groups and malformed or oversized commands and parameters. Planning groups of up to 64 joints (previously 32) now load, and inputs that exceed the supported size are rejected with a clear error instead of crashing the controller.
  • Fixed the streaming point cloud holding on to its raw data subscription when no client was watching it, wasting memory.
  • Fixed a memory leak where viewing the 3D point cloud caused unbounded memory growth in the main robot process; point-cloud processing now runs in a separate, memory-bounded container.
  • Fixed a phantom new_port error that could block building an Objective when a Subtree had an unconfigured placeholder port — the port appeared nowhere on disk or in the Ports panel yet failed verification as an unremapped mandatory port.
  • Fixed the runtime Behavior Tree viewer not showing a Subtree's name when it had a comment; it now shows both the Subtree name and its comment, matching the editor.
  • Fixed the Behavior Tree editor's Name / Comment field dropping spaces, so multi-word comments can now be typed.
  • Fixed a Behavior Tree node overlapping the node below it when a comment grew it to a second line in the editor; the tree now re-spaces immediately instead of only after leaving edit mode.
  • Fixed the Interactive Marker snapping back to the robot's pose when grabbing it for another move during teleoperation, and trajectory previews targeting the previous pose when the marker was moved again before planning finished.
  • Fixed the semi-transparent preview gripper in Interactive Marker teleoperation rendering with opaque white collision geometry.

9.4.0

· 27 min read

Major Features​

Joint Range Constraints for Motion Planning​

Joint range constraint editor opened from the joint_range_constraint port on a PlanToJointGoal Behavior

MoveIt Pro's motion planners can now tighten a robot's joint limits for a single plan, without editing the robot model. Constrain just the joints you care about to a narrower range and leave the rest free — handy for keeping a gantry or 7th axis inside a known-safe span, fencing off a singular configuration, or carving out a workspace region. The constraint is a new input on planning Behaviors such as PlanToJointGoal.

Set it up visually with a new in-Editor tool that opens right from the planning Behavior: pick a joint, drag a dual-knob slider against its full range, and optionally show a live marker that tracks the joint's current position. Objectives can still be edited by hand for those who prefer it.

Smoother and More Optimal Motion Plans​

A robot&#39;s joint-space path before and after optimization: the unoptimized path in red versus the shorter, smoother path produced by Informed RRT* in green

PlanToJointGoal now accepts an optimization_params port that enables optimize_path support: Informed RRT* (Rapidly-exploring Random Tree) path optimization for joint-space planning. After finding an initial path with RRT-Connect, the planner refines it into shorter, smoother joint-space trajectories.

Obstacle-Aware Cartesian Motion​

Cartesian motions — the straight-line tool moves used for tasks like insertion, dispensing, scanning, and surface following — normally track a fixed end-effector path with no freedom to dodge obstacles, so a cluttered cell often means hand-tuning waypoints or aborting on collision. PathIK can now steer the rest of the arm clear of obstacles automatically while still holding the tool exactly on its commanded Cartesian path, by adding an SDF (Signed Distance Field)-driven repulsion task to its nullspace. Pass an SdfControlPoint describing a sphere proxy on the arm and a distance field built by ComputeSignedDistanceField, and the solver pushes that sphere away from nearby obstacles as it tracks the path — fewer collisions and less manual waypoint tuning in tight workspaces. For now this is available only through the C++ Kinematics API; it is not yet exposed through a Behavior or the Objective editor.

Collision Object Improvements​

A robot arm planning collision-free motions around obstacles in the planning scene

MoveIt Pro makes collision objects easier to add, inspect, and maintain in the planning scene: new Behaviors add primitives and full collision objects directly, planner failures now name the bodies in collision, and attaching a URDF preserves the collision rules set on it. A new guide covers adding, moving, removing, attaching, and setting collision rules on the live planning scene and during MoveIt Task Constructor planning — see Interacting with the Planning Scene.

Live Point Cloud Streaming​

Live point clouds from the robot&#39;s cameras streaming in the 3D Visualizer

The 3D Visualizer can now stream live point clouds from the robot's cameras. With the Point Clouds layer enabled in the View menu, every detected sensor cloud streams in real time at full density, and each camera gets its own visibility toggle in the per-source list.

Improved Visualization Graphics​

lab_sim rendered in the 3D Visualizer alongside its simulated scene and wrist cameras, showing the improved scene render quality and standardized camera resolution

Several changes make scenes look better across MoveIt Pro. The 3D Visualizer now renders with hemisphere lighting and soft ground shadows for clearer depth perception, scene render quality in lab_sim has been improved, and simulated camera resolution has been doubled to 1280x720 across all example robot configurations (lab_sim, hangar_sim, and the others) for sharper, more detailed camera views.

Visualize the Robot's Collision Geometry​

The robot&#39;s collision geometry overlaid in the 3D Visualizer

The 3D Visualizer can now show each robot link's collision geometry, not just its visual mesh. A new Robot - Collision toggle in the Visualization View menu (next to the Robot - Visual toggle) overlays the colliders — translucent over the visual mesh when both are shown, or as a wireframe when you hide the visual mesh to inspect colliders on their own. The setting defaults to off and persists per browser. It helps debug robot models whose collision and visual shapes diverge, and reveals collision-only links like sensor housings, doors, and environment containers.

TF Transforms​

Live TF coordinate frames displayed in the 3D Visualizer

The 3D Visualizer can now display TF (Transform) coordinate frames live, RViz-style. Enable TF Transforms from the View menu to toggle frames individually, filter by name, adjust axis size, and show frame-name labels — making it easy to see how links, sensors, and tools relate in space while building or debugging an Objective. See Visualize TF Frames.

For publishing transforms from a Behavior Tree, the new PublishTF Behavior publishes a dynamic transform on /tf at a configured rate for as long as it runs. PublishStaticFrame is now deprecated and forwards to PublishTF — despite its name, it never published on /tf_static; a future PublishStaticTF Behavior will cover the truly-static-transform case.

Joint Monitor View Pane​

The Joint Monitor view pane showing live joint values against their limits

A new Joint Monitor view pane shows each joint's live value against its URDF (Unified Robot Description Format) and joint_limits.yaml limits, so you can watch in real time how close the robot is to a limit. An in-pane dropdown switches between position, velocity, and acceleration. See About the User Interface.

New MoveIt Pro Settings Window​

The new MoveIt Pro Settings window

A new Settings modal, opened from the gear menu, gathers UI preferences into one place, all persisted in browser local storage. It exposes a Behavior Tree Connection Style radio group (Snap to box or Classic line draw between nodes) — replacing the previous "Snap to Box (beta)" checkbox in the gear menu — and a new Objective Left Sidebar radio group (Auto close/open with Objective start/end or Manual control). The previous navbar pin button is removed; to keep the sidebar in place during execution, select Manual control. A Subtree Edit Warning toggle re-enables the "Subtree is used in other Objectives" popup after it has been dismissed via its Do not show this warning again checkbox. The modal closes on Escape.

UPDATE: This window has been removed in 10.0 and consolidated in the new settings sidebar.

Major Performance Improvements for Web UI​

Performance gauge pointing toward &quot;good&quot;

MoveIt Pro's web UI now talks to the backend over a new, faster WebSocket bridge. Under typical UI load it roughly halves publish latency and uses far less memory and CPU than before, so the interface stays responsive even with many live streams open.

This changes the default WebSocket protocol, so external tools built on rosbridge (roslibpy, roslibjs, and similar) need a small migration: either move to the native ROS 2 Client Library API, or opt back into a rosbridge-compatible endpoint by launching with moveit_pro run --enable-rosbridge. The MoveIt Pro UI and any tools already using native ROS 2 clients need no changes.

Agentic AI Coding Harnesses (beta)​

Claude Code running in the MoveIt Pro Host Machine Shell to create an Objective

MoveIt Pro now works with agentic AI coding harnesses — Claude Code, Codex, and other CLI coding agents — letting you build Behaviors, Objectives, and robot configurations with AI assistance directly against your workspace.

A new built-in Terminal brings shell access into the UI to run these agents. It is available as a Terminal view pane (from the view dropdown) and as a dockable, full-width, resizable terminal at the bottom of the workspace — opened from a terminal button in the top bar in both run and edit views, or by pinning a terminal pane. A Container/Host selector chooses the target: Container opens a shell inside the running MoveIt Pro container (always available), and Host opens a shell on the host machine (enabled by launching with moveit_pro run --allow-host-shell). A Reset sessions control recovers the terminal when the concurrent-session limit is reached. See About the User Interface.

The install also ships MoveIt Pro's CLI agent skills, and workspace setup copies them into ~/moveit_pro so those agents pick up MoveIt Pro and ROS 2 guidance automatically with no manual setup. This replaces the experimental LLM-powered Behavior Tree Builder (the in-editor AI Assistant), which has been removed along with its API key settings.

Enhancements​

New Behaviors and Libraries​

  • Added the SuppressChildErrors decorator, which drops the log messages produced while ticking its child Behavior at the severities you choose (suppress_error, suppress_warn, suppress_info). Use it in Fallback patterns where the first branch is expected to fail as part of normal decision logic, so operators no longer see alarming red ERROR toasts for those expected failures. Suppressed messages are removed entirely rather than downgraded. The child's BT::NodeStatus is passed through unchanged; compose with ForceSuccess to also swallow the failure status.
  • Added the SaveMTCTaskInspection Behavior, which captures the full state of an MTC Task — stage tree, statistics, every solution and failure, interface states, and per-stage failure explanations — to a JSON file on disk. Drop it under a Fallback below PlanMTCTask to log only failed plans, or place it between Plan and Execute to log every plan. The output directory accepts absolute paths, paths relative to the configured Objectives directory, and ~/$HOME expansion. Customers can attach the resulting file to a support ticket so failures can be triaged offline rather than over a live RViz session at the moment of failure.
  • Added a joint-space path interpolation helper that densifies a path by linear interpolation, bounded by a maximum per-joint step — useful for finer collision checking or visualization of sparse RRT-style paths. Available as interpolate_joint_path in the MoveIt Pro Python planning API.
  • Python collision-checking results now expose readable contact entries — colliding body names, body types, contact position, penetration depth, and interpolation percentage — making collision results inspectable from the Python API.

Behavior and Library Improvements​

  • The user-interaction prompt Behaviors (GetTextFromUser, GetPoseFromUser, GetPointsFromUser, AdjustPoseWithIMarker, and WaitForUserPathApproval) now communicate with the UI over a shared topic-based request/response protocol on /moveit_pro_ui/<prompt>/{request,response,cancel} instead of per-Behavior ROS services. Existing Objectives continue to work unchanged. The new protocol routes each prompt to the focused browser session via a heartbeat-tracked session lease, rejects concurrent prompts with a clear error, and is observable from external tooling that subscribes to the topics.
  • The DoTeleoperateAction Behavior now drives teleop through a backend bridge node and a topic-based protocol on /moveit_pro_ui/do_teleoperate/{goal,feedback,result,cancel} instead of an action server hosted in the browser. Existing Objectives continue to work unchanged. The bridge periodically re-broadcasts the active goal, so opening teleop in a second browser window now mirrors the active session, and refreshing a teleop tab now re-attaches to the in-flight teleop instead of orphaning it.
  • PublishVelocityForceCommand now accepts unstamped twist and wrench input ports, matching the wire message it sends to the velocity force controller. The previous twist_stamped / wrench_stamped ports remain accepted for backwards compatibility but are deprecated and log a one-time warning naming the dropped header.frame_id; the controller has always interpreted the command in its configured ee_frame and ignored the stamped frame. Migrate by inserting UnpackTwistStampedMessage / UnpackWrenchStampedMessage between your stamped source and PublishVelocityForceCommand. Note: the deprecated stamped ports no longer carry the implicit {desired_twist} / {desired_wrench} blackboard defaults; Objectives that relied on the implicit wiring must spell out the remap explicitly (twist_stamped="{desired_twist}") or migrate to the new ports.
  • The existing task_id port on InitializeMTCTask now sets the display name shown for the MTC Task in the MTC inspector and on the TaskDescription topic. Useful for Objectives that build several MTC tasks (e.g., upright / flipped place attempts) and need to tell them apart; when left empty, the existing default (task pipeline) is used.
  • The Velocity Force Controller can now interpret velocity and force references in any robot-model frame — for example the world or base link — via the new control_frame_id field on the PublishVelocityForceCommand Behavior, instead of only the end-effector frame. See Streaming Velocities & Force.
  • Deprecated the AddPoseStampedToVector and AddPointCloudToVector Behaviors and the AddToVector Objective in favor of PushBackVector.
  • Deprecated the legacy GraspableObject-based collision and planning-scene Behaviors (ModifyObjectInPlanningScene, AddVirtualObjectToPlanningScene, CreateCollisionObjectFromSolidPrimitive, RemoveCollisionObjectFromPlanningScene, SetupMTCAttachObject, and related stages) in favor of the new moveit_msgs-based collision Behaviors (AddCollisionBox, AddCollisionObject, MoveCollisionObject, RemoveCollisionObject, AttachObject, DetachObject, SetCollisionRule, and their SetupMTC equivalents). The deprecated Behaviors still work but will be removed in a future major version; see the collision objects migration guide.
  • Added an optimization_params port to the SetupMTCPlanToJointState and SetupMTCConnectWithProRRT Behaviors, so MTC freespace plans can use multiple RRT-Connect seed attempts and Informed RRT* refinement.
  • Live point cloud streams in the 3D Visualizer now update at up to 30 Hz (previously 10 Hz), so the cloud tracks robot motion more closely.
  • Improved Cartesian trajectory construction performance for long waypoint paths by caching time-optimal trajectory path-segment lookups during sampling.

Misc User Interface Improvements​

  • Breakpoint popups now play a short audible beep when they appear so users running long Objectives in the background aren't likely to miss them.
  • The default number of ports shown on each Behavior Tree node (in both view and edit modes) is now 2 instead of 5, producing more compact trees by default. Users can still change the setting to No ports, 1–5 ports, or All ports via the existing port-visibility dropdown, and the choice persists in browser local storage.
  • The "unconnected nodes will be discarded" warning shown when leaving the Behavior Tree editor now lists each orphan node by name (up to 5, with a …and N more summary for any additional nodes), so operators can see exactly which work will be discarded before confirming.
  • The navbar's Objective dropdown now shows the robot configuration package inheritance chain as a breadcrumb (e.g., moveit_pro_base_config › ur_base_config › my_robot_config) so operators can see at a glance which base packages the loaded robot configuration package extends from. The chain wraps to additional lines for long hierarchies; a robot configuration package with no based_on_package ancestor renders as a single name without separators.
  • Added an Override entry to the Objective dropdown menu for built-in (read-only) Objectives. Selecting it creates an editable copy of the Objective in the user workspace with the same ID, shadowing the built-in version via the existing symlink chain. Removing the override restores the built-in Objective.
  • Disable Node in the Behavior Tree editor now restores the original _skipIf expression on Re-enable, even after saving and reopening the Objective.
  • The Behavior Tree editor's right sidebar now shows the source file path for a selected Objective or Subtree node, with a copy-to-clipboard button. This makes it easy to tell whether a Behavior comes from a core MoveIt Pro package or from a custom robot configuration package.
  • Pose Jog can now command motion in the planning group's base frame as well as the end-effector frame, via a Control Frame selector in the Pose teleop tab. See UI-Based Teleoperation.
  • Duplicating a Sequence (or any control/decorator node) in the Behavior Tree editor now also duplicates its children.
  • The Follow active node toggle in the runtime Behavior Tree view is now on by default; users who previously set it keep their stored preference.
  • New installs now open with a four-pane layout (3D Visualization, Behavior Tree, Joint Monitor, and the first camera feed), a 3D view from a raised side angle with brighter lighting and a ground grid that fades into the background, point cloud sources hidden by default, and a narrower left sidebar.
  • The 3D Visualizer View menu now has separate Point Cloud Snapshot and Point Cloud Streaming toggles, so captured clouds and live camera streams can be shown independently, with live stream sources listed individually under Point Cloud Streaming. The TF Transforms Show all and Hide all controls now show a brief confirmation checkmark when clicked.
  • Collision objects without an explicit color now render in MoveIt 2's planning-scene green in the 3D Visualizer instead of red, and objects attached to the robot render orange to distinguish them from free-standing world objects. An explicit ObjectColor still takes precedence.
  • Removed a stray horizontal scrollbar that appeared in the view-pane selector menus when a row contained a very long label.

Reference Application Changes​

  • Added a Pick 1 Pill Bottle with SAM3 Objective to lab_sim and removed the deprecated CLIPSeg pick Objective.
  • Migrated lab_sim and hangar_sim Objectives off the deprecated AddToVector and collision Behaviors to PushBackVector and the current collision Behaviors.
  • Added fuselage surface-coverage Objectives to hangar_sim.
  • Enabled velocity_decay in hangar_sim to stop base drift after Nav2 stops, and fixed slam_toolbox map generation.

Documentation Improvements​

  • Added guidance on waiting for the Objective server to be ready before running an Objective from an external client, so clients can wait for /do_objective or /execute_objective and call immediately instead of using a fixed delay. See Run an Objective.
  • Added a concept page describing how MoveIt Pro uses ros2_control and the runtime safety semantics of its controllers. See ros2_control in MoveIt Pro.
  • Added a Technical Specifications page covering computer, software, and robot hardware requirements and a summary of available features.
  • Added a MoveIt Pro Core download links page with download links for the MoveIt Pro Core archives.
  • Added a collision objects migration guide for moving from the legacy GraspableObject-based collision Behaviors to the new moveit_msgs-based ones.
  • Added a CI/CD guide covering validating Objectives in CI and deploying MoveIt Pro to fleet hardware.

Other Improvements​

  • The iframeViewports array in frontend_settings.yaml now accepts optional enable_web_bridge (default false) and web_bridge_url fields, so a YAML-declared Custom View Pane can fully describe a pane that talks to ROS without manual modal edits per machine. When enable_web_bridge is true and web_bridge_url is omitted, the pane falls back to MoveIt Pro's own WebSocket bridge (the same endpoint the rest of the frontend connects to). Migration impact: the previous key names enable_ros_bridge / rosbridge_url are no longer recognized — existing frontend_settings.yaml files using the old keys must be updated. The Custom View Panes list (YAML-declared and manually-added entries alike) is now stored per robot configuration package: switching robot configuration packages swaps to that package's own pane list, and switching back restores it. Clicking Done in the Custom View Panes modal also persists the current pane list (including bridge fields) back to ~/.config/moveit_pro/<active_config>/frontend_settings.yaml, so manually-added panes survive relaunches without hand-editing YAML. See Configure Frontend Settings.
  • rosapi_node, the move-joint and move-end-effector resamplers, and the ros2 control controller spawner now log to both the terminal and the ROS log file. These processes were previously routed to only one or the other, making their messages easy to miss when troubleshooting.
  • Tolerance violation errors from the joint_trajectory_admittance_controller now name the offending joint(s) and include both the measured deviation and the configured tolerance — e.g., Path tolerance violated on shoulder_lift_joint (deviation 0.1574 > tolerance 0.1000). When multiple joints violate simultaneously, all are listed comma-separated. Previously these errors said only Path tolerance violated. and required reading the controller log to identify which joint failed and by how much. Applies to path tolerance, goal tolerance, and trajectory-start tolerance checks.
  • The MuJoCo simulator now reports its overrun rate periodically instead of warning on every overrun event. Every 60 seconds (after a 10-second warm-up) the backend log shows what percent of sim iterations missed their timestep budget over the run so far, with guidance on whether the rate is normal (below 1% is expected on a non-realtime system) or means the model timestep should be raised (consistently above 1%).
  • Shortened the backend console log format for easier reading and grepping. Each line now reads [<node>-<N>] [SEVERITY] [<timestamp>] message — the redundant logger-name field is dropped (it duplicates the <node> token already prefixed by the launch system), and severity labels are uppercase consistently across all backend nodes.
  • MoveIt Pro motion controllers now reject non-finite (NaN/Inf) values from commands, force/torque sensor readings, and generated setpoints instead of forwarding them to the hardware interface. On detection the controller stops the robot and reports a diagnostic identifying the offending value.
  • Added the CYCLONEDDS_MAX_AUTO_PARTICIPANT_INDEX environment variable to set the maximum number of DDS (Data Distribution Service) participants discovered on a host, defaulting to 120, so external clients on a busy host can reliably discover a running MoveIt Pro Runtime.
  • moveit_pro configure now detects NVIDIA, AMD, and Intel GPUs and prints a color-coded GPU Docker Validation checklist reporting the detected model, container toolkit status, and whether the GPU is accessible from inside a Docker container. Pass --skip-gpu-check (or set MOVEIT_PRO_SKIP_GPU_CHECK=1) to skip the Docker access test on offline hosts.
  • Backend console logs now show a human-readable timestamp (YYYY-MM-DD HH:MM:SS.mmm) instead of a raw Unix epoch.
  • Added a /health readiness endpoint and container healthchecks so deployments can sequence and monitor MoveIt Pro's containers. The drivers and agent containers now exit on failure instead of staying up while non-functional, so a supervisor can detect and restart them.
  • The /behavior_tree_status topic now publishes a full tree once and then compact per-node status diffs — re-baselining periodically and skipping publishes when nothing changed — greatly reducing bridge and UI traffic for large running Objectives. The re-baseline interval is configurable via the behavior_status_full_baseline_period parameter.
  • The web bridge now advertises hidden ROS topics and services, letting web and SDK clients drive ROS 2 action servers — such as Objective execution — over the bridge.
  • MuJoCo simulations now broadcast every free-floating scene object as a TF frame (named after its body, under mj_world) so tools and tests can read ground-truth object poses; disable with the new publish_object_tf hardware parameter.

Bug Fixes​

  • Fixed the camera view showing the browser's default broken-image icon when a stream fails to load (backend down, topic missing, web_video_server not yet up); it now shows the existing "Stream unavailable" placeholder with the topic name instead.
  • Fixed UI slowdowns and connection errors caused by continuously publishing large blackboard contents when no blackboard viewer was subscribed, and prevented large blackboards from delaying Objective heartbeat updates.
  • Fixed SaveImageToFile throwing on single-channel and non-8-bit image streams (e.g., ZED X confidence maps, depth images, and other grayscale or float topics). Mono, 16-bit, and float images are now normalized and written as 8-bit PNGs instead of being rejected at conversion. rgb16 and rgba16 color sources are also now byte-swapped to BGR/BGRA before writing so they no longer save with red and blue channels reversed.
  • Fixed the SaveImageToFile Behavior triggering a multi-terabyte allocation request on images with corrupted metadata (empty or unknown encoding, inconsistent row stride, mismatched data buffer size); it now rejects them before handing them to OpenCV and returns a clear failure. Failure messages now include the image's width, height, step, encoding, and data buffer size to make stuck camera streams diagnosable from logs.
  • Fixed the Custom View Pane showing the browser's chromeless "refused to connect" page when its URL is unreachable (host down, wrong port, DNS failure); it now shows an in-app error screen with the URL and a Retry button.
  • Fixed a race where calling /execute_objective right after it became available could fail with No objective action server running. The service is now advertised only once the Objective server is ready, so an external client can wait for it and call immediately without a fixed delay.
  • Fixed a crash in ros2_control_node when publish_odom was set to false in a robot configuration package.
  • Fixed a data race in the planning scene monitor's joint-state callback list that could corrupt the callback vector when Behaviors registered or cleared callbacks while joint states were being dispatched.
  • Fixed a crash when cancelling and immediately restarting the Teleoperate Objective with the JogPose or JogJoints Behaviors, where the planning scene callback could outlive its monitor and abort objective_server_node.
  • Fixed a segmentation fault when cancelling the Teleoperate Objective with the JogPose or JogJoints Behaviors while a planning-scene update was in flight, where the subscription callback could dereference a destroyed planning scene monitor.
  • Fixed the web bridge flooding the console with per-topic subscribe/unsubscribe INFO messages on every client reconnect; routine subscription activity is now quiet while warnings and errors still appear.
  • Fixed an issue where MuJoCo camera streams and point clouds intermittently failed to publish on first read because the simulator skipped rendering until a subscriber latched, leaving downstream Behaviors with empty data.
  • Fixed point clouds not displaying in the UI after the switch to the MoveIt Pro web bridge.
  • Fixed off-center play, edit, and menu icons on hovered rows in the Behaviors and Objectives sidebar.
  • Fixed the UI hard-landing on an error screen during backend startup when the planning groups service was not yet available.
  • Fixed a crash and hang in MuJoCo simulation when repeatedly resetting to a keyframe (for example, a keyframe reset inside a looping Objective) while controllers were running.
  • Fixed the Pose IK (Inverse Kinematics) solver adding an unnecessary full-revolution wraparound for joints whose range is wider than one full turn, so solutions now stay near the requested angle.
  • Fixed ONNX (Open Neural Network Exchange) inference silently falling back to CPU on GPU container images (CUDA and ROCm), restoring hardware acceleration for ML Behaviors.
  • Fixed teleoperation and UI slowdowns caused by live point cloud streams being subscribed by default; point cloud sources in the 3D Visualizer now start hidden and can be enabled per source from the View settings.
  • Fixed parameter_overrides rejecting a vector port (e.g., a vector of poses) whose only consumer is a ForEach loop. The override now resolves against the Objective's declared <input_port type> and is written so both ForEach and typed consumers can read it.
  • Fixed a crash in the joint trajectory admittance controller that aborted the realtime control node when a path or goal tolerance violation triggered the error-message formatter.
  • Fixed the out-of-box Fast DDS configuration communicating over network multicast. MoveIt Pro no longer ships a default Fast DDS configuration — see the Breaking Changes entry below for the migration.
  • Fixed a race in the JointJog and PoseJog Behaviors where a runtime change to the controller name or planning group could be ignored for an unbounded number of ticks before the Behavior reported failure.
  • Fixed an intermittent crash in the planning scene monitor when its initial full-scene publish raced concurrent scene updates.
  • Fixed the URDF load-error screen showing the same "reduce mesh size" advice for missing mesh files; a missing file is now reported as missing with a rebuild recommendation, while oversize or invalid meshes keep the decimation guidance.
  • Fixed web-bridge-enabled Custom View Panes silently dropping all ROS messages when served from a different origin than the MoveIt Pro frontend (for example, a sidecar HTTP server on a different port).
  • Fixed Collada (.dae) meshes rendering without their materials in the 3D Visualizer.
  • Fixed objects attached to the robot sometimes rendering invisible in the 3D Visualizer after the web app connected.
  • Fixed the 3D Visualizer robot model staying stale after switching robot configuration packages without refreshing the browser.
  • Fixed point clouds disappearing from the 3D Visualizer when a browser window was refreshed; a reloaded window now re-fetches and renders the current point cloud.
  • Fixed a memory leak that could crash the 3D Visualizer after extended point-cloud capture loops.
  • Fixed Reset MuJoCo Sim driving the robot back toward its previous pose before settling instead of holding the reset keyframe.
  • Fixed all-black simulation camera feeds in MuJoCo on Parallels VMs running on Apple Silicon.
  • Fixed UI prompt Behaviors (such as the one behind Navigate to Clicked Point) failing on the first run after loading an Objective, and prompts being lost when the browser reconnected.
  • Fixed the trajectory approval prompt (WaitForMTCSolutionApproval) intermittently rendering an empty overlay and hanging the Objective, and the trajectory preview line disappearing after a page reload; the prompt and preview now reliably appear and survive a reload.
  • Fixed the Behavior Tree status pane re-rendering unnecessarily during Objective execution and briefly blanking when one Objective hands off to the next.
  • Fixed Subtree ports displaying as input/output in the Behavior Tree editor; Subtree ports are always bidirectional, so they now always show as in/out regardless of how the Objective XML was authored.
  • Fixed Behavior Tree editor port fields dropping characters or clearing while being edited, and the port dropdown arrow overlapping the input field border in the editor sidebar.
  • Fixed the missing add (+) button on an Objective's root node, so a node can be added after the top-level Sequence is deleted.
  • Fixed direct Objective execution so default values declared on runnable Subtree input ports are used when no runtime override is provided.
  • Fixed the pane-layout selector icon changing in other open browser windows when the layout was changed in one window, leaving the icon out of sync with the panes actually shown.
  • Fixed root-relative Custom View Pane URLs (for example, /api/packages/<package>/<path>) being silently dropped from frontend_settings.yaml on reload, and stopped a single invalid viewport entry from discarding the entire pane list.
  • Fixed toast error messages displaying literal <code> tags instead of formatting file paths as inline code.
  • Fixed warning toasts with embedded links so they use the standard bold-title layout and keep the link readable in both unvisited and visited states.
  • Fixed BlendJointTrajectories so a blending_radius of 0 concatenates trajectories that already meet with matching position, velocity, and acceleration instead of always inserting a blend that could fail validation.
  • Fixed offline licensing intermittently invalidating after a container purge; offline activation now derives a reproducible hardware fingerprint from stable host information, so it survives container recreation. It also now succeeds when the container username differs from the host login user.
  • Fixed repeated startup warnings from the web bridge when /tf advertises a larger QoS history depth.
  • Fixed log noise from time-optimal trajectory generation: the message about a single path_tolerance applied to groups with mixed revolute and prismatic joints is now logged at debug level instead of warning.
  • Fixed MoveIt Pro Core Debian package metadata so packages built against geometric_shapes require the exact upstream Debian version they were built with.

Breaking Changes​

Default Fast DDS Configuration Removed​

MoveIt Pro no longer ships a default Fast DDS configuration, which previously caused out-of-box discovery to communicate over network multicast. Deployments that relied on the bundled profile now fall back to ROS 2 defaults. To keep using Fast DDS, set RMW_IMPLEMENTATION=rmw_fastrtps_cpp and supply your own profile via FASTRTPS_DEFAULT_PROFILES_FILE, with MoveIt Pro not managing DDS. See Configure ROS 2 DDS.

Dockerfile Build Arg CUDA_SUFFIX Renamed to GPU_SUFFIX​

The Dockerfile build argument that selects the GPU stack is now GPU_SUFFIX, generalized to cover AMD GPUs alongside NVIDIA. Valid values are "" (CPU-only), -cuda12.6-cudnn9 (NVIDIA/Jetson), and the new -rocm7.2.2 (AMD ROCm on amd64, Mesa VA-API on arm64). The bundled docker-compose.yaml is updated automatically; out-of-tree build scripts or compose overrides that pass --build-arg CUDA_SUFFIX=... must be renamed to --build-arg GPU_SUFFIX=.... The accepted values for the NVIDIA path are unchanged.

Jazzy GPU Images Now Use CUDA 13.2​

Ubuntu 24.04 / ROS 2 Jazzy GPU containers now use CUDA 13.2.1, cuDNN 9.20.0, and TensorRT 10.16. From 9.4.0 onward, Ubuntu 24.04 / ROS 2 Jazzy GPU images are published only with the -cuda13.2-cudnn9 suffix; the -cuda12.6-cudnn9 Jazzy image is no longer built. Pin Jazzy deployments to -cuda13.2-cudnn9 (Ubuntu 22.04 / Humble images continue to use -cuda12.6-cudnn9).