Skip to main content

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 signed 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'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'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'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'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: GetRobotJointStateGetJointState, CreateJointStateCreateRobotState, GetTrajectoryStateAtTimeGetRobotStateFromTrajectory, RetrieveJointStateParameterRetrieveRobotStateParameter, 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).

8.10.7

· One min read

Bug Fixes

  • Fixed Joint Trajectory Admittance Controller rejecting fresh trajectory goals with "The new trajectory does not contain any points after the last update time of the currently executing trajectory." after a Behavior such as ExecuteTrajectoryWithAdmittance, ExecuteTrajectoryWithAdmittanceExample, or ExecuteMTCSolution had just executed a trivial / no-motion trajectory.

9.3.1

· 2 min read

Enhancements

Misc User Interface Improvements

  • Camera topics are now collected over a backend topic instead of being polled through the API, making the UI more responsive and reflecting cameras as they start or stop.

Bug Fixes

  • Fixed port value edits in the Behavior Tree editor not updating live between the node textbox and the sidebar — both views now stay in sync per keystroke instead of waiting for the input to lose focus.
  • Fixed Runtime View nodes still showing spinning "running" icons after an Objective finished, was cancelled, or failed. Running animations now stop as soon as the run reaches a terminal state.
  • Fixed an issue where the web UI could get stuck on a Connection Error: Timeout on /get_agent_info screen at startup and only recover after restarting the backend, caused by a race in the bundled rosbridge_suite (now pinned to a fixed version).
  • Fixed MoveIt Pro failing to start after a temporary loss of network connectivity even though the license had already been activated on the machine. On startup the license now falls back to the locally cached license when the license server is briefly unreachable, instead of failing immediately.
  • Fixed a stray row divider that extended across the full-height left pane on hover in the 5-pane Custom View layout.
  • Fixed a bug seen on constrained machines where slow Objective serialization could trigger a race condition and save an empty Behavior Tree while editing an Objective.
  • Fixed annotated image streams in the Web UI sometimes appearing blank when a pane opened after a one-shot image was published, such as the AprilTag detections view in the bottle-picking Objective.
  • Fixed the interactive marker spawning under the robot instead of on the end-effector when the 3D Visualizer opened in a side pane (e.g., the default Behavior Tree + Visualization layout). The reset now forces the scene graph to recompute world transforms before reading the end-effector pose, so the marker lands on the manipulator regardless of pane size at startup.

9.3.0

· 36 min read

This is a big release of improvements, cleanup, and bug fixes!

Major Features

VLM Integration - Gemini Robotics ER

MoveIt Pro now integrates with Google Gemini, bringing high-level visual reasoning into Behavior Trees through Google DeepMind's new Gemini Robotics-ER 1.6 embodied-reasoning model (gemini-robotics-er-1.6-preview). The new GetPoints2DFromGeminiQuery Behavior sends a text prompt and an optional image to Gemini's multimodal API and returns 2D image points plus per-point labels — handy for open-vocabulary localization tasks like "find every loose bolt on the panel" that are too open-ended for classical perception. Users can also build their own Gemini-backed Behaviors on top of the new moveit_pro::behaviors::gemini C++ utilities. See the Integrate with Gemini VLM how-to guide for setup and prompt-writing tips.

Gemini detected points example

Mobile-Base Navigation with Continuous Replanning

The hangar_sim robot configuration now ships with a Navigate to Clicked Point with Replanning Objective and a dual-LiDAR Nav2 integration, demonstrating multi-sensor costmap observation buffers and continuous goal replanning during mobile-base navigation. The Objective serves as a working template for arm-on-mobile-base applications where the navigation goal can shift mid-traverse and the robot needs to react without restarting the run.

Mobile-base navigation with continuous replanning

Simulation Improvements

Shelf stocking application streaming multiple simulated camera views

Better Performance. MoveIt Pro's underlying MuJoCo hardware interface now uses a smarter threading model. The result: Mujoco model timestep not running in realtime warnings are dramatically reduced and most users should be able to stream 1080p simulated cameras at full rate. See the new Adjusting the Simulated Camera Resolution how-to guide.

Hardware-matching sensor topics. The simulator now supports per-sensor ROS topic overrides for both cameras and LiDARs. Perception pipelines built against real cameras — for example, the image_pipeline layout produced by RealSense and Astra drivers — drop into simulation without rewiring topic names. Multi-LiDAR scenes can give each LiDAR its own topic (e.g. /scan_front, /scan_rear), which is required for Nav2 costmaps with multiple observation buffers. See the Simulated Depth Camera Sensor and Simulated Lidar Sensor sections of the MuJoCo guide for configuration.

MuJoCo 3.6.0 performance upgrade. Updated the bundled MuJoCo physics engine from 3.2.7 to 3.6.0 for better speedups. See the Breaking Changes section below for model-tuning implications.

Follow Active Node in the Runtime Behavior Tree

A new Follow active node toggle in the runtime Behavior Tree view pans the viewport to keep the currently ticking node visible as execution moves through the tree, switching to a tighter Fit to View framing so the active region stays prominent. When a run finishes successfully (or the toggle is turned off) the view restores to the full tree; when a run ends in failure the camera stays on the failed node so the operator can see what went wrong.

Follow active node in the runtime Behavior Tree

Gamepad Control in Interactive Marker Mode

Gamepad controllers now work in Interactive Marker mode, letting operators position the iMarker with analog sticks and triggers instead of mouse dragging. The same gamepad mapping used elsewhere in the teleop UI applies here, so muscle memory carries over between joint jogging, Cartesian jogging, and iMarker positioning. An in-UI button mapping also makes understanding usage easier.

Gamepad control in Interactive Marker mode

Per-Mode Teleop Speed Slider

Each teleop mode (Jog, Waypoints, IMarker) now has its own speed slider, replacing the previous Jog-only slider. Each mode keeps its own value, so an operator can pre-set a careful IMarker approach at low speed while keeping joint jogs at full speed. The Request Teleoperation Objective passes the active mode's velocity_scale_factor through to the Move to Pose (IMarker) and Move to Joint State (Waypoint) Subtrees, so the slider value is honored without switching tabs.

Per-mode teleop speed slider

Operator-Facing Breakpoint Messages

The BreakpointSubscriber Behavior now accepts an optional message input port. When set, the message is rendered in the UI under a bold Breakpoint title, giving the operator a human-readable hint about why the Objective is paused — for example, "Confirm part orientation before pick" or "Waiting for human inspection of weld seam". Existing Behavior Trees that only set breakpoint_topic continue to work unchanged. See the Breaking Changes section for the related wire-format change on /breakpoint_encountered and /breakpoint_resumed.

Operator-facing breakpoint message

Expanded Trajectory Approval

Operators can now pause an Objective to preview and approve any joint trajectory before it executes, not just MTC solutions. The new WaitForJointTrajectoryApproval Behavior renders the trajectory in the 3D Visualizer and waits for approval; a companion Wait for Joint Trajectory Approval Subtree fetches the planning scene first so joints outside the trajectory (mobile bases, secondary arms) keep their current values in the preview. For MTC plans, the existing flow is replaced by the new WaitForMTCSolutionApproval Behavior — see the deprecation of WaitForUserTrajectoryApproval below.

Expanded trajectory approval preview

Runtime Parameter Overrides for Objectives

External callers — Python scripts, REST clients, fleet managers — can now inject runtime values directly into a Behavior Tree's blackboard when starting an Objective via DoObjectiveSequence or ExecuteObjective, without editing the Objective XML. Built-in support covers primitives, common geometry types (poses, points, transforms, twists, wrenches), joint states, and trajectories. Each override is parsed as YAML before the tree runs; unknown ports, unregistered types, and malformed values abort the Objective with a clear, parameter-specific error message instead of silently storing a string. Custom message types can be registered in one line from a Behavior loader plugin. See Passing Parameters to Objectives at Runtime.

Python example sending a PoseStamped parameter override via DoObjectiveSequence

Graceful Backend Reconnection

The web UI now stays calm and recovers cleanly when the MoveIt Pro backend restarts mid-session. The runtime Behavior Tree view refits its viewport once rosbridge comes back, so framing returns on its own without a browser refresh. When the backend is genuinely offline — or when /robot_description never publishes — the UI shows a quiet, branded placeholder ("MoveIt Pro Backend Not Running" or "Robot Description Not Received") with concrete troubleshooting steps, instead of a generic red "Something went wrong" error screen. Operators on flaky networks and developers cycling agent_robot.app no longer have to refresh the browser to recover.

Robot connected toast confirming reconnection

Windows Support via WSL

MoveIt Pro now runs on Windows via Windows Subsystem for Linux (WSL). After installing WSL with wsl --install, follow the standard Ubuntu installation steps inside the WSL Ubuntu shell. See the Quick Start Install page for details.

MoveIt Pro on Windows via WSL

Other Enhancements

Misc User Interface Improvements

  • Clicking the current Objective's name in the top navbar now opens an expanded dropdown showing the Objective's name, active robot configuration, category, description, XML file path, and quick actions (favorite, details, duplicate, delete). A new deselect button (X) to the right of the title clears the current Objective selection.

    Expanded navbar dropdown with Objective details and quick actions

  • Added a pin toggle to the alerts drawer header: when pinned, the drawer stays open through outside clicks and Escape presses, and pin state persists across browser sessions.

    Pinning the alerts drawer keeps it open across outside clicks

  • Added a Planning Scene toggle to the View menu in the 3D Visualizer, allowing users to hide planning scene collision objects similar to existing toggles for URDF, point clouds, and grid. Preference persists in browser local storage.

    Planning Scene toggle in the 3D Visualizer View menu

  • The trajectory preview controls are now a single compact row (play/pause, current time, scrubber, total duration) with per-stage tick marks on the scrubber and a footer line showing point count and the current Stage N/M plus stage comment. Replaces the previous four-button layout (jump-to-start, play, pause, jump-to-end).

    Compact trajectory preview controls row

  • The "Subtree is used in other Objectives" warning popup that appears when editing a shared Subtree's ports now has a Do not show this warning again checkbox; the preference persists in browser local storage and skips the popup on subsequent edits.

    Shared-Subtree edit warning with dismiss checkbox

  • Added a last-Objective completion indicator to the main navigation: after an Objective finishes, the area next to the Run and Edit buttons shows "Objective Succeeded" or "Objective Failed" until the next run starts or the user deselects the Objective.

  • Subtree port types (std::string, geometry_msgs::msg::PoseStamped, etc.) are now visible in the edit panel when a Subtree is used as a child node, matching the type-label experience for regular Behaviors. All ports across the built-in Subtrees in core_objectives (Move to Waypoint, Move to Pose, Execute MTC Solution, and others) have been annotated with their C++ data types.

  • The Behavior Tree status viewer now highlights failed nodes with a thicker red border, pulses the leafmost failing node, and raises failed nodes and their edges above the rest of the tree so the highlight is not occluded.

  • The 3D Visualizer's View menu now opens as a two-column panel: display, navigation, and marker toggles sit on the right while view selection stays on the left, so the menu fits more controls without growing taller. Marker labels were also refreshed for clarity.

  • The alerts drawer can now be resized by dragging its left edge.

  • The Planning Scene Editor's Delete Object button moved to the top of the selected-object panel and is now a filled red button so it's discoverable without scrolling past the size, position, and rotation controls.

  • Tightened View Pane overlay margins so the View selector and the expand button sit at matching 8 px offsets, freeing up room inside custom view panes.

  • The runtime Behavior Tree view now has a port visibility toggle, matching the editor view. Click the eye icon to choose how many input/output ports each node displays (hide all ports, show the first 1 through 5, or show all ports). The selection persists across browser sessions.

  • The Behavior sidebar hover popover now shows the source file path of the Behavior with a copy-to-clipboard button, making it easier to locate the underlying XML or C++ source.

  • The Auto Layout toolbar button in the Behavior Tree editor is now hidden when Snap to box connection mode is active. Snap to box already relayouts after every edit, so the manual button is only useful in Classic line draw mode and clutters the toolbar otherwise.

  • All on/off toggle switches in the web UI now share a single design — the Quaternion-input radian/degree toggle, Admittance Control axis enables, Require Approval, Jog Collision Checking, and the View Settings auto-clear toggle previously used two different visual styles. Switches also have accessible labels (via aria-label or associated labels) so screen readers announce each control's purpose.

  • The Request Teleoperation and Breakpoint popups now share the same prompt-row layout as the existing Approve Trajectory popup — title plus optional body, with a red destructive button (Abort / Stop) on the left and a primary action (Continue / Resume) on the right.

  • Added a startup warning when the browser is rendering with a software WebGL fallback (e.g. SwiftShader, llvmpipe, Microsoft Basic Render Driver) instead of a real GPU. The warning links to Performance Troubleshooting and can be dismissed permanently per browser.

  • The runtime Behavior Tree view now shows a pencil edit icon on Subtree nodes, matching the editor view. Clicking the pencil navigates to the Subtree's source Objective. Subtrees that cannot be edited (inline content, missing Objective ID, or built-in read-only Objectives) render the icon as greyed-out with a tooltip explaining why.

New Behaviors (Skills)

  • GetConvexHullPointCloud computes a 3D convex hull around a point cloud and densely resamples the surface to fill holes and gaps.
  • RotateTwistToFrame rotates a geometry_msgs::msg::TwistStamped into a target frame's orientation. Both the linear and angular components are rotated; any translation between the two frames is ignored, so no omega-cross-r reference-point shift is applied. Useful when a velocity controller interprets commanded twists in its own end-effector frame and the operator wants to issue world-frame commands.
  • SetRos2Parameter sets any ROS2 parameter on any node at runtime. Accepts node_name, parameter_name, parameter_value, and parameter_type ports. Useful for tuning Nav2 costmap parameters (e.g. robot_radius), controller gains, or any other parameter exposed via the standard ROS2 parameter service.
  • AddOverageToPath extends a coverage path past its endpoints by a configurable overage distance, useful for ensuring full edge coverage when sanding, painting, or sealing surfaces.
  • AvoidPointsInCoveragePath removes coverage-path waypoints that fall within a configurable distance of an obstacle point cloud, so a generated path can be pruned around obstructions without regenerating it from scratch.
  • FindSlicePlanesAlongEdge finds a sequence of slice planes oriented along an edge feature in a point cloud, useful for generating Cartesian via-points along a part contour.
  • TrimPointcloudSurface crops a point cloud to a region around a target surface so downstream perception or planning Behaviors operate only on the relevant points.
  • RepeatUnlessFailureEachTick is a new decorator that ticks its child up to num_cycles times, advancing one iteration per parent tick. It replaces both Repeat and KeepRunningUntilFailure, and unlike Repeat, it cannot deadlock the tree on num_cycles="-1" (the default) with a synchronous always-successful child. An explicit RepeatUnlessFailureWithinTick alias is also registered for users who intentionally need the legacy within-tick loop semantics. See Behavior Tree Troubleshooting.
  • BlockUntilParameterIsTrue returns RUNNING until a named blackboard entry evaluates as true, then returns SUCCESS. Accepted forms of true: native bool true, non-zero ints, and bool-parseable strings ("true"/"1", as written by XML <SetBlackboard value="true"/>). A missing entry keeps the Behavior in RUNNING (the writer may not have run yet); an entry that exists but cannot be interpreted as bool returns FAILURE so configuration mistakes surface immediately. Designed for use under a Parallel control to gate one branch on a flag set by another branch.
  • GetPoints2DFromGeminiQuery queries Google Gemini's multimodal API with a text prompt and a ROS image to locate 2D image points corresponding to features described in the prompt. The Behavior returns a narrative answer, a vector of geometry_msgs::msg::PointStamped with normalized image coordinates, and a parallel vector of short labels Gemini attached to each point so prompts can plumb metadata such as object IDs or colors through to downstream Behaviors. Requires the GOOGLE_GEMINI_API_KEY environment variable to be set.
  • New WaitForJointTrajectoryApproval Behavior that takes a trajectory_msgs/JointTrajectory input, previews it in the UI, and waits for the user to approve or deny. Accepts an optional planning_scene port so joints outside the trajectory (mobile bases, extra arms) keep their current values in the preview.
  • New Wait for Joint Trajectory Approval Subtree that fetches the current planning scene before previewing the trajectory, so authors don't need to chain the fetch themselves.
  • New WaitForMTCSolutionApproval Behavior that replaces WaitForUserTrajectoryApproval (now deprecated) for previewing MTC Solution objects.

Behavior Improvements

  • Reduced UI log noise from SavePoseStampedToYaml and related SaveToYaml Behaviors: the "optional input port was not set" messages are now debug-level rclcpp logs instead of UI info messages.
  • WaitForUserTrajectoryApproval has been deprecated in favor of the new WaitForMTCSolutionApproval Behavior, and will be removed in a future release.
  • The Repeat, RetryUntilSuccessful, and KeepRunningUntilFailure decorators are deprecated. The Behavior palette flags them as deprecated and the Objective Server logs a one-shot deprecation warning at startup. They still execute their legacy semantics so existing Objectives continue to work, but will be removed in MoveIt Pro 10.0. Migrate to RepeatUnlessFailureEachTick (or RepeatUnlessFailureWithinTick if the within-tick loop is intentional).
  • The CreateStampedPose, CreateStampedTwist, and CreateStampedWrench Behaviors have been deprecated in favor of CreatePoseStamped, CreateTwistStamped, and CreateWrenchStamped, whose names match the underlying geometry_msgs message types. The Behavior palette flags the old names as deprecated and they emit a deprecation warning when used. Existing Objectives continue to work unchanged, but the deprecated Behaviors will be removed in a future release — migrate to the new names. When migrating Objective XML, also update the output port attribute names from stamped_pose to pose_stamped, stamped_twist to twist_stamped, and stamped_wrench to wrench_stamped; the blackboard variable names they write to can stay the same if desired.
  • TF lookup error messages from Behaviors now include a subtype-specific hint (different advice for "extrapolation into the past", "extrapolation into the future", and "extrapolation at time") and a link to the new Transforms Troubleshooting docs page. Replaces an earlier monolithic "check CPU and memory" hint that did not differentiate between the three distinct failure modes. GetMasks3DFromMasks2D has been migrated to the shared helper and is the first Behavior to benefit.
  • The LoadFromYaml and LoadMultipleFromYaml family of Behaviors (LoadPoseFromYaml, LoadPoseStampedFromYaml, LoadPoseVectorFromYaml, and the other type-specific registered names) now accept an optional package_name input port. When set, the YAML file_path is resolved relative to that ROS package's share directory, matching the resolution pattern used by AddURDF.

Reference Application Changes

  • Added publish_mj_world_tf hardware parameter to picknik_mujoco_ros to suppress MuJoCo's mj_world → odom TF when a nav stack owns that edge.
  • Set memory="64M" on the lab_sim MuJoCo scene so the constraint-solver arena does not overflow under contact-dense Objectives after the MuJoCo 3.6.0 upgrade. See the Breaking Changes section.
  • Clarified the operator pose-prompt copy in the Navigate to Clicked Point Objective so the expected pick action is unambiguous.
  • Fixed an incorrect VisualizePose port wiring in the lab_sim MPC pose-tracking Objectives.
  • Renamed bundled uses of CreateStampedX to CreateXStamped and WaitForUserTrajectoryApproval to WaitForMTCSolutionApproval, matching the Behavior renames in this release.

Documentation Improvements

  • Added a new Motion Planning Best Practices guide covering joint-limit and waypoint best practices for raising motion-planning success rate.
  • Added a new Transforms Troubleshooting page covering the three TF2 extrapolation error messages ("into the past", "into the future", "at time"), missing-frame and disconnected-tree cases, per-subtype root causes, and design patterns to avoid (one-shot dynamic TF publications that corrupt a frame otherwise intended to be static).
  • Rewrote Tutorial 3 (Perception & Machine Learning) around the new lab_sim medicine-bottle scenario, replacing the legacy stack-blocks running example. The tutorial now walks through three end-to-end picking workflows — AprilTag → Pick from Pose → Move to Waypoint, SAM3 + ICP with Cartesian via-points, and a pointer to the Pick All Pill Bottles capstone Objective — plus a reusable Fit Bottle to Cloud via ICP Subtree walkthrough, a Planning Scene Editor keep-out-zone teleop-recovery example, and a SAM3-vs-SAM2 technical reference appendix.
  • Added a new how-to guide, Adjusting the Simulated Camera Resolution, covering the <camera resolution> attribute and the <global offwidth/offheight> offscreen framebuffer that must be raised in tandem when sharper MuJoCo camera images are needed.
  • Added a new how-to guide, Visualize 3D Markers, documenting which parts of the visualization_msgs/Marker spec the MoveIt Pro 3D Visualizer supports and showing a minimal Python publisher example.
  • Added a new how-to guide, Configure Frontend Settings, describing the new sparse YAML override file (frontend_settings.yaml) for deployment-specific frontend values (reference frame, Nav2 plan topic).

Other Improvements

  • The MoveIt Pro license-validation banner now writes to stderr instead of stdout. The banner is emitted before the ROS spdlog sink is installed in the Objective Server, so previously it polluted stdout in any tooling that captured stdout-only.
  • Surface MoveIt Pro license activation errors in the terminal when running moveit_pro run without --verbose, so connectivity issues are visible without digging through the log file.
  • Renamed the moveit_studio_common package to moveit_pro_common, which is now the canonical home for the shared utility headers and the precompiled-header helper. The old moveit_studio_common package remains as a backwards-compatibility shim that forwards to moveit_pro_common (and to moveit_pro_package for CMake macros) and emits deprecation warnings on every header include, namespace use, and macro call. The MOVEIT_PRO_PACKAGE() macro inside moveit_pro_common itself is also now a thin deprecation wrapper around the canonical moveit_pro_package macro. All deprecated APIs will be removed in MoveIt Pro 10.0 — update existing packages to depend on moveit_pro_common for the utilities and on moveit_pro_package for the MOVEIT_PRO_PACKAGE() macro before then.
  • Added POST /v2/objectives/verify REST endpoint that validates an in-memory BehaviorTree JSON payload against BehaviorTree.CPP without persisting to disk. Used by the LLM proposed-changes flow so the agent can verify candidate trees before the user accepts them, replacing the round-trip through the v1 XML verify path. The shared verify_xml_text helper now also surfaces 504 timeouts as real HTTP errors instead of masking them as "could not verify" (only the 500 service-unavailable case continues to soft-fail).
  • moveit_pro run no longer rebuilds the user Docker images (and re-pulls the multi-GB upstream base image) when only the colcon install/ directory is missing — for example, after a previous build failure.
  • If the three locally-tagged user images (moveit-studio-base, moveit-studio-agent-bridge, moveit-studio-drivers) already exist, run now skips the image build and only re-runs colcon build.
  • moveit_pro build still rebuilds unconditionally, so it remains the escape hatch when an explicit image rebuild is desired.
  • The No kinematics plugin defined for group 'X' startup warning is now suppressed for planning groups with at most one active joint, which covers typical vacuum (0-DOF) and parallel-jaw (1-DOF) grippers where Cartesian IK isn't applicable. Manipulator groups with two or more active joints still surface the warning when their kinematics plugin is missing.
  • Extended moveit_pro shell to accept a command to run non-interactively (e.g. moveit_pro shell colcon build --packages-select my_pkg), a --service/-s flag to explicitly target a docker compose service, and an ephemeral agent_bridge container fallback when no MoveIt Pro instance is running.
  • The AI chat's proposed-change preview now renders the actual Behavior Tree the agent proposes, instead of showing an empty tree. The LLM service emits v2 JSON directly and the frontend consumes it without an XML round-trip.
  • Added optional Behavior Tree file logging. Set the enable_bt_file_logging ROS parameter to true on the Objective Server node at startup to enable. When enabled, each Objective run writes a Groot2-compatible .btlog file to ~/.ros/log/bt_logs/. This parameter is only configurable at node startup and requires a restart to change.
  • parameter_overrides on DoObjectiveSequence and ExecuteObjective is now fully wired end-to-end, so external callers (Python scripts, REST clients, fleet managers) can inject runtime values directly into a Behavior Tree's blackboard without editing the Objective XML. Built-in support covers primitives plus geometry_msgs/PoseStamped, PointStamped, TransformStamped, TwistStamped, WrenchStamped, sensor_msgs/JointState, trajectory_msgs/JointTrajectory, and the std::vector forms of geometry_msgs/PoseStamped and geometry_msgs/PointStamped. Each override is parsed as YAML into the port's declared C++ type before the tree runs; unknown ports, unregistered types, and malformed YAML abort the Objective with a clear, parameter-specific error message instead of silently storing a string. Custom message types register their parser in one line — moveit_pro::behavior::registerParameterType<your_msgs::msg::YourType>() — from the Behavior loader plugin's registerBehaviors(). See Passing Parameters to Objectives at Runtime.
  • Reduced terminal log spam from the rosbridge_websocket node: its log level is now set to warn at launch, so per-subscription INFO messages (which flooded the terminal when clients rapidly toggled topic subscriptions, e.g. costmap layers) are suppressed while warnings and errors remain visible.
  • Added a user-configurable frontend settings file. Deployment-specific values previously hardcoded in the frontend — the 3D Visualizer reference frame (world) and the Nav2 plan topic (/plan) — can now be overridden per deployment via a sparse YAML file (with comments), with iframeViewports reserved for future use. Supply the file with moveit_pro run --frontend-settings <path>, or commit it to your robot configuration package as <config_package>/config/frontend_settings.yaml. Unknown keys are logged in the browser console and ignored so typos are easy to spot without breaking the rest of the file. Per-field validation is tolerant in the same way: a single bad value falls back to its default while every other override still applies. See Configure Frontend Settings.

Bug Fixes

  • Fixed offline licensing inconsistently invalidating when it shouldn't, usually caused by a container purge. Offline activation now derives a reproducible hardware fingerprint from stable host information, so it survives container recreation.
  • Fixed MuJoCo hardware interface reporting qfrc_applied (external user force) instead of qfrc_actuator (actuator-produced force) for joint effort state interfaces.
  • The web UI now shows a targeted Missing Objective screen (or Objective Load Failed with the HTTP status code for other errors) when an Objective can't be loaded — for example after switching robot configurations — instead of the generic Something went wrong message. Objective IDs containing special characters such as / or ? are also now fetched correctly.
  • Fixed MuJoCo lidar site transforms being published relative to mj_world instead of the body the lidar is attached to.
  • Cleaned up INFO logging for the URDF planning scene services; AttachURDF and DetachURDF no longer log at INFO for internal scene transitions that are indistinguishable from user-invoked AddURDF/RemoveURDF, and those transitions are now logged at DEBUG with their reason.
  • Fixed the MuJoCo hardware interface publishing mj_world → base_link at 60 Hz, which overwrote any odom → base_link transform produced by the odometry stack (wheel odometry, fuse, slam_toolbox). When the new optional odom_frame hardware parameter is set (e.g., <param name="odom_frame">odom</param>), MuJoCo instead publishes mj_world → odom as an identity anchor, leaving the odom → base_link edge entirely to the odometry stack.
  • Fixed gamepad button highlights in the teleoperation panel showing the opposite direction from the actual robot motion (e.g., pushing the stick up highlighted -Y instead of +Y).
  • Fixed compressed camera streams from publishers using best-effort QoS (e.g. RealSense */compressed topics) silently dropping frames in the web UI. The video stream subscriber now uses the sensor-data QoS profile that camera publishers use by default.
  • Fixed an apparent hang where pressing Approve immediately after a trajectory preview popup appeared could leave the robot paused for many seconds (and on slow links indefinitely) before motion started. Most visible on long Cartesian plans previewed via WaitForMTCSolutionApproval or WaitForUserTrajectoryApproval (for example, the multi-thousand-point spray and grind paths in hangar_sim and grinding_sim). Approve and Deny clicks are now processed promptly regardless of preview size.
  • When the MoveIt Pro backend is not running, the Behavior Tree editor now shows a calm "MoveIt Pro Backend Not Running" placeholder matching the camera-feed unavailable style, instead of the generic red "Something went wrong" error screen.
  • Fixed the expand/collapse toggle on Behavior Tree control nodes (Sequence, Fallback, Parallel) and Subtrees being disabled outside editor mode, so users can now drill into collapsed nodes from non-editor views like the Supervisor.
  • Fixed PlanMTCTask aborting the Objective when the non-critical store_uid_map debug telemetry service is unavailable or times out. The Behavior now publishes a UI warning and proceeds with planning.
  • Fixed Subtree blackboard port editing silently breaking when the user typed a name with spaces or other characters that are not valid XML attribute keys. The port-name input now validates against an XML-attribute-safe rule (must start with a letter or underscore; only letters, digits, _, ., -), normalizes spaces to underscores as the user types, and rejects invalid names on blur with an inline error and toast instead of saving a broken tree. New ports added via the + Port button now default to a new_port placeholder so autosave doesn't fail before the user types a name.
  • Fixed GetTrajectoryStateAtTime failing on single-point JointTrajectory inputs with the opaque error Sampler failed to initialize.. When the trajectory has exactly one point and time_from_reference is 0.0, the Behavior now returns that point directly (regardless of from_start) without invoking TrajectorySampler::init, which requires at least two points.
  • Fixed the Behavior Tree editor leaving a node visually disabled after editing its _skipIf port from a literal "true" to a runtime expression (e.g. "{condition}"). The editor now re-resolves the expression on every port change, so the node's dashed border reflects the current expression instead of latching on the saved value until reload. The hovered-waypoint joint-preview also no longer fails when the same joint limit is registered from multiple URDF sources.
  • ExecuteTrajectory now demotes Joint Trajectory Admittance Controller (JTAC) absolute force/torque-threshold aborts from ERROR to WARN, so contact-detection Subtrees that wrap it in ForceSuccess (where the abort is the success criterion) no longer flood the UI with red toasts.
  • Fixed the Behavior Tree editor silently dropping non-boolean _skipIf expressions on save. Runtime gating like _skipIf="pick_alignment != 'side'" was parsed as a boolean and stripped when saving any unrelated edit, quietly turning conditional branches into always-on branches with no user-visible signal. The editor now round-trips the expression verbatim. Disable Node on an expression-bearing node opens a confirm dialog before overwriting; the original expression is stashed and restored when the node is re-enabled.
  • DetachURDF now returns a failure response if the tool cannot be re-added to the planning scene after detach, surfacing what was previously a silent log-only error.
  • Fixed the Behavior Tree pane staying stuck on its error screen after a render failure. Starting a new Objective run or switching Objectives now clears the previous error and renders the new tree.
  • Duplicating a Behavior Tree node now places the new node next to the original instead of jumping 100 px above and to the right, so the duplicate remains visually adjacent to the node the user clicked.
  • Fixed BlendJointTrajectories intermittently failing on time-optimally-retimed input trajectories that cruise at the joint velocity limit.
  • Fixed a spurious Objective Failed toast appearing roughly 5 seconds after starting any Objective on Jazzy installs. The rosbridge service-call timeout upstream default changed from 0 (wait forever) on Humble to 5 s on Jazzy, which made every long-running Objective look like it had failed even though it kept running and completed normally. The agent bridge now pins default_call_service_timeout to 0 to match Humble's wait-forever default across distros.
  • Disabled Behavior Tree nodes (_skipIf="true") now render with a dashed border in both the Edit view and the read-only Behavior Tree view, matching the runtime view, so operators can see at a glance which nodes are being skipped. The View pane also now returns to the saved tree state after editing, instead of staying frozen on the last run's status until another run starts.
  • Fixed the Behavior Tree zoom-out button (and scroll-wheel zoom-out) shrinking the tree past the point where nodes were too small to see, making the tree appear to vanish. The minimum zoom level now stops at a node size of ~19 px wide, so the tree always stays findable on screen.
  • The Stop Objective and Stop Motion buttons now switch to a disabled "Stopping..." state with a spinner the moment they are clicked, instead of waiting for the next status heartbeat before reflecting that the request was received. Repeat clicks while stopping are ignored, so the second click no longer disappears into a silent no-op on the agent.
  • Fixed Cmd('git') failed due to: exit code(1) with fatal: cannot chdir to ... aborting the moveit_pro run example-workspace upgrade prompt when the workspace contained nested submodules (e.g. phoebe_ws) whose worktrees were stale or missing on disk. The upgrade now deinitializes all submodules before fetching, so the fetch step no longer trips over missing nested submodule directories.
  • Fixed moveit_pro configure --config-package <invalid_name> listing robot configuration packages marked with MOVEIT_PRO_IGNORE in its error message. The failure message now matches the list shown by moveit_pro run --list. Explicitly passing the name of an ignored config is still accepted.
  • Fixed SaveImageToFile aborting the Behavior Tree on Jetson hardware when received images had corrupted dimension metadata. The Behavior now sanity-bounds the image dimensions (rejecting anything over 16K per side) and returns a clean FAILURE with a descriptive error string instead of crashing OpenCV with a multi-terabyte allocation.
  • Fixed ResetMujocoKeyframe causing the MuJoCo backend to hang or the service to time out (Timed out waiting for service response at /mujoco_system/reset_keyframe) when the Behavior was called repeatedly — for example from inside a Repeat decorator looping forever during a long-running demo. The MuJoCo hardware interface no longer races with the reset service on the underlying simulation control data.
  • Fixed Move to Waypoint intermittently failing partway through long Objectives with Timed out waiting for service response. RetrieveWaypoint's service-response handler shared the Behavior Tree process's default callback queue, so an unrelated long callback elsewhere in the running Objective could delay it past the 3 second client timeout. The handler now runs on a dedicated reentrant group and is no longer affected by other Behavior Tree traffic.
  • Fixed cartesian_planning::transformTwist mixing frames in its lever-arm term, which produced incorrect linear velocities for offset frames whenever both rotation and translation were non-trivial. The function now implements the standard SE(3) body-twist adjoint and its second argument is renamed a_pose_b (the pose of the destination frame in the source frame's coordinates), matching the natural composition direction. The single in-tree caller, ComputeVelocityToAlignWithTarget, has been updated.
  • Fixed PublishMask2D crashing with an opaque OpenCV arithm_op size-mismatch error when the masks were computed against a different image than the one passed to the image port. The Behavior now returns a clean FAILURE naming the offending mask index and both sets of dimensions instead of throwing.
  • Fixed ComputeLinkPoseForwardKinematics emitting a spurious warning toast on every tick when the input joint_state listed fewer joints than the planning scene but the missing joints had no effect on the requested link's pose. The Behavior now warns only when a joint in the kinematic chain to link_name is actually missing from the input.
  • Fixed the masked image disappearing from the view pane shortly after running ML Objectives like ML Find Objects on Table, ML Segment Image, or Segment Image from Text Prompt. Low-frequency image topics (such as /masks_visualization) now stay rendered until the user switches the view pane to a different topic, instead of vanishing after a brief idle period.
  • The Objective deselect button (X) in the navbar is now hidden while editing an Objective, and the Run button is now disabled with an explanatory tooltip when the current Objective is marked as Non-Runnable.
  • Fixed the Manage Planning Group modal opening off-center and rendering an internal scrollbar with light-theme colors against the dark application background. The modal is now centered and its scrollbar matches the rest of the dark theme.
  • Default planning-scene object color for AddURDF and AddVirtualObjectToPlanningScene is now MoveIt 2's "Scene Color" — (50, 230, 50) at alpha 0.9 — instead of the previous saturated transparent red, so out-of-the-box scene objects render in the same green RViz already uses. Existing Objectives that explicitly set urdf_color are unchanged.
  • Fixed the 3D Visualizer ignoring marker.ns on DELETEALL actions — it cleared every marker on the topic regardless of namespace. Per the visualization_msgs/msg/Marker spec, a namespaced DELETEALL now removes only markers in that namespace; an empty ns still clears everything.
  • Fixed the runtime Behavior Tree view failing to refit its viewport after a rosbridge close + reconnect. The view now re-runs its "fit to viewport" framing on reconnect, so operators no longer need to toggle Follow active node to force a refit after the backend restarts.
  • WARN-level log messages published to /failure_reason_collector (e.g. from LoggerBase::publishWarnMessage) now render as yellow toasts in the web UI as intended, instead of falling through to the default blue styling that made them visually indistinguishable from INFO toasts.
  • Reduced peak GPU memory used by SAM3 on a 640×480 input by roughly 3 GiB, so it now fits comfortably alongside other GPU users on 8 GiB cards where it previously caused out-of-memory crashes when combined with voice services or other ML models.
  • The LLM server now logs ROS connection errors as a single line instead of a ~30-line WebSocket dump.
  • Action buttons (run, edit, kebab menu) in the Objective list sidebar now appear only when hovering a row, giving the full Objective name room to display without truncation.
  • Fixed the waypoint hover preview retaining stale joint positions from the previously-hovered waypoint when switching between waypoints in different planning groups. Joints outside the new waypoint's planning group now reset to the live robot state instead of staying frozen at the previous waypoint's values.
  • Unified active-state styling across the navbar's toggle buttons (Planning Scene Editor, Lock Keepout Zones, Settings, Alert History, Alert Settings, Teleoperate): the filled background is gone and the active state is now indicated by an icon color change only. The Lock/Unlock Keepout Zones tooltip is now Title Case to match the Open/Close Planning Scene Editor tooltip.
  • Collapsed Control nodes in the Behavior Tree viewer are now visually distinct from empty ones — the expand/collapse button uses a brighter background while collapsed, and the inline add-child button and source handle are hidden until the node is expanded.
  • Quieted rosbridge log spam coming from a rosapi shutdown race amplified by frequent image-topic discovery polling, and from a React Strict-Mode advertise/unadvertise race in roslib service clients.
  • Fixed the iMarker end-effector visualization showing the gripper stuck in its URDF default state (typically open) regardless of the real gripper position. The gripper mesh attached to the iMarker handle now tracks live /joint_states, so closing the gripper updates both the robot and the iMarker preview.
  • Fixed moveit_pro run --only-drivers failing with a spurious port-in-use error when agent_bridge was already running in another terminal (e.g. started by moveit_pro run --no-drivers). The drivers service does not use the ports 3200-3203 that were being checked, so the check is now skipped when --only-drivers is set.
  • Fixed moveit_pro run --only-drivers (and any scoped moveit_pro run) tearing down the entire docker compose project on exit, killing sibling services that were started by a separate terminal (for example moveit_pro run --no-drivers). The CLI now stops only the services it started instead of running docker compose down against the whole project. Note that stopped containers remain visible in docker ps -a (in Exited state) and named volumes are preserved across runs; use moveit_pro down for a full cleanup.
  • GetMasks2DFromExemplar now publishes a UI warning when the text prompt is longer than the SAM3 text encoder's 32-token budget. Previously the prompt was silently truncated and the user had no indication that part of it had been dropped.
  • GetMasks2DFromExemplar now responds to Stop within tens of milliseconds instead of running the full SAM3 inference to completion. Previously, clicking Stop mid-inference had no effect until the prediction finished — particularly painful in CPU mode on macOS where a single inference can take many seconds.
  • Fixed the toast notification container and Clear All button overlapping with the right-side view pane in the web UI.
  • Fixed text selection in the Behavior Tree pane so users can now select and copy text from Behavior Tree node labels and from error messages on the Behavior Tree error fallback screen.
  • When the UI's version check fails (network error, invalid server response, or non-semver version values), the error now shows the endpoint URL, local and remote version values with their sources, and a remediation hint — instead of a generic toast message.
  • When the /robot_description topic times out, the web UI now displays a "Robot Description Not Received" screen with troubleshooting steps (check backend, ROSBridge, and try restarting the frontend) instead of the generic "Something went wrong" error.
  • Fixed SystemConfigParser swallowing the underlying cause of unexpected errors during config load, which caused ros2 launch to print an empty SystemConfigException: line instead of the real failure (e.g. a missing xacro include).
  • Fixed Objectives aborting on Plan To Joint State and similar Behaviors when the requested joint goal was effectively identical to the current robot state. The RRT planner's zero-motion threshold is now ~1e-5 rad per joint (previously it required bit-exact equality), so trivial near-zero-motion plans return a clean single-waypoint trajectory instead of producing a degenerate near-zero-length path that downstream trajectory timing and controllers rejected.

Breaking Changes

MuJoCo 3.6.0 - Joint armature Sensitivity

The MuJoCo 3.2.7 → 3.6.0 upgrade corrected the implicit integrator's derivatives for clamped actuator forces, changing how joint armature contributes to the mass matrix when PD actuators saturate.

Audit custom armature values in MuJoCo models: per-joint <joint armature="..."/> values on the order of 1e-6 can now produce an ill-conditioned mass matrix — symptom: distal wrist joints drifting from their targets. Either delete the armature attribute (MuJoCo's 0 default is safe) or raise it to a real reflected-rotor inertia (0.010.1 is typical for arm joints). Re-run your Objectives in simulation to confirm every joint reaches its commanded setpoint.

MuJoCo 3.6.0 - Arena Memory No Longer Grows Dynamically

The same upgrade made the constraint-solver arena statically sized at model compile time. Scenes that don't set <size memory="..."/> fall back to ~15 MB; exceeding that triggers mjWARN_CNSTRFULL and MuJoCo silently drops constraint rows, producing unstable grasps and flaky trajectory execution.

Set memory on contact-heavy MuJoCo scenes: if grasping or pushing turns flaky after the upgrade, check MUJOCO_LOG.TXT or ros2_control_node logs for mjWARN_CNSTRFULL. Fix by adding <size memory="64M" /> to the top of your scene.xml (raise further if the warning persists). The bundled lab_sim scene has been updated for this reason.

Breakpoint Topics Now Use BreakpointStatus Instead of String

The /breakpoint_encountered and /breakpoint_resumed topics now publish moveit_studio_agent_msgs/msg/BreakpointStatus (fields: string topic, string message) instead of std_msgs/msg/String. Built-in Behavior Trees, the UI, and BreakpointSubscriber are updated automatically — no action required for normal use. Custom tooling subscribing to these topics directly must switch to the new message type and read the topic field instead of data. The Bool-resume protocol on the user-named breakpoint_topic is unchanged.

8.10.6

· One min read

Improvements

  • Reduced memory pressure from the Blackboard publishing large messages, increasing overall performance and preventing OOM on lower spec machines

Bug Fixes

  • Fixed createTrajectoryFromWaypoints producing single-point trajectories with empty velocity and acceleration arrays, which were rejected by the Joint Trajectory Admittance Controller and aborted execution when planning to a waypoint the robot was already at.
  • Fixed GetTrajectoryStateAtTime failing with an opaque "Sampler failed to initialize." error on single-point trajectories. A single-point trajectory queried at time_from_reference == 0.0 now returns that point directly; any non-zero query reports a clear error.
  • Fixed an error with the frontend failing to render the native browser scroll bar on some browsers

9.2.1

· One min read

Other Enhancements

Bug Fixes

  • New Objective XML files added to a watched library directory after backend startup now appear in the sidebar without a backend restart, and Subtrees referenced by these files gain their edit pencil immediately.
  • Fixed an execution failure when planning to a waypoint the robot was already at. The resulting single-point trajectory now passes downstream controller validation instead of aborting with a "Positions, velocities and accelerations must not be empty" error.
  • Fixed the trajectory preview ghost robot disappearing in the 3D Visualizer when it passed through transparent objects such as keep-out zones.
  • Fixed new ports added to a Subtree not appearing on the parent's SubTree node until a browser refresh.
  • Fixed attached collision objects failing to render in the 3D Visualizer. The TF subscription client requested the wrong action interface name, so every TF subscribe raised InvalidModuleException at rosbridge and timed out.