Skip to main content

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

Major Performance Improvements for Web UI

Performance gauge pointing toward "good"

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.

9.2.0

· 7 min read

Major Features

Trajectory Stitching via Smooth Blending

Blending radius diagram

The new BlendJointTrajectories Behavior allows combining a sequence of pre-planned joint trajectories into a single, smooth trajectory — eliminating full stops between consecutive motions and significantly reducing cycle time. At each connection point, a jerk-limited transition segment is generated that respects the robot's velocity, acceleration, and jerk limits. A configurable blending radius controls how much of the original path is replaced by the smooth transition. See the Stitch Trajectories guide for details.

Mobile Base Navigation Live Path Visualization

Live navigation path updating during Nav2 replanning

The MoveIt Pro 3D visualization now displays the live navigation path during Nav2 replanning. When running NavigateToPoseAction with a replanning Behavior Tree, the UI subscribes to the /plan topic and continuously updates the rendered path as Nav2 replans around obstacles.

Improved AI Segmentation with Morphological Mask Operations

Before and after morphological mask operations removing segmentation noise

The new Behaviors ErodeMask2D and DilateMask2D apply morphological erosion and dilation to 2D masks using a configurable square kernel and iteration count. These operations are useful for removing noise, filling holes, and refining mask boundaries.

New Camera Field of View Visualizations

Camera frustum visualization markers in the 3D Visualizer

The new Behavior VisualizeCameraFrustum publishes LINE_LIST markers showing a camera's viewing frustum (near plane, far plane, and connecting edges) given a camera pose and field-of-view parameters. This is useful for debugging camera placement and coverage in 3D scenes.

More Compact, Optional Behavior Tree Display

Port display dropdown in the Behavior Tree editor

The "show all ports" toggle in the Behavior Tree editor has been replaced with a dropdown menu that lets users choose how many ports to display: No ports, All ports, or 1–5 ports.

Other Enhancements

Misc User Interface Improvements

  • The Behavior Tree editor is now faster and more responsive, especially on large trees with many nodes.
  • Non-runnable Objectives are now hidden by default in the sidebar. Users can toggle visibility with the existing filter, and the choice is preserved across mode switches.
  • Changed the default keepout zone shape from a cube (0.3 m) to a thin wall (0.5 m × 0.5 m × 0.05 m), which better represents a typical keepout barrier.
  • Reduced vertical spacing between sibling nodes in the Behavior Tree editor for a more compact layout.
  • The sidebar pin button now remains clickable while an Objective is running, allowing users to pin or unpin the sidebar at any time.
  • Camera feeds in the view-select dropdown are now grouped into hierarchical submenus based on ROS topic namespaces, making it easier to navigate setups with many cameras.
  • After adding a new Custom View Pane from a view pane's dropdown menu, that pane automatically switches to display the newly-created Custom View Pane. Previously users had to reopen the dropdown and select it manually.
  • In editor mode, the Behavior sidebar search can now optionally match port names when the Include Ports toggle is enabled in the filter dropdown. Matching ports are displayed below the Behavior name with a direction label and highlighted match text.

Behavior Improvements

  • SendPointCloudToUI has a new optional use_latest_transform boolean port (default false). When set to true, the Behavior uses the latest available Transform Frame (TF) instead of the point cloud's timestamp. This is useful for static cameras in simulation where the simulation clock can diverge from the TF buffer, causing timestamp-based lookups to fail.
  • LoadImageFromFile now supports an optional package_name input port for loading images using package-relative paths, consistent with LoadPointCloudFromFile.
  • Trajectory execution error messages now include the controller's detailed error_string (both via the Joint Trajectory Controller (JTC) and the Joint Trajectory with Admittance Controller (JTAC)), showing details on controller errors. For instance, on trajectory tracking errors, the message will show which joint violated which tolerance and by how much.

Reference Application Changes

  • Added dual SICK TIM571 lidars and Nav2 obstacle avoidance to hangar_sim.
  • Switched hangar_sim to wheel-driven mecanum locomotion with fuse-based Inertial Measurement Unit (IMU) odometry.
  • Deduplicated SAM2 and SAM3 models in lab_sim so both use the shared package models rather than per-config copies.
  • Added lab desk objects and updated associated Objectives for lab_sim.
  • Started multi_arm_sim reference config with gripper controllers activated by default.
  • Removed ros2_control overrides from space_satellite_sim.

Other Improvements

  • The moveit_pro CLI now displays a colored ASCII art banner with a bold "MoveIt Pro" header when running commands like moveit_pro configure.
  • Reduced LLM context consumption by compacting stale Behavior tool results in message history, trimming redundant response fields, and caching Behavior XML fetches.
  • The MuJoCo odom publisher now supports an odom_publish_tf hardware parameter to optionally disable TF broadcasting while still publishing odometry messages. This is useful when another node (e.g., a localization stack) is responsible for the odom TF.

Bug Fixes

  • Improved the DoTeleoperateAction error message when the web UI is disconnected. The message now explains that the /do_teleoperate action server is provided by the browser and suggests a hard refresh.
  • LoadPointCloudFromFile and AddUrdf now guard against an empty objective_library_directories parameter instead of crashing on an unchecked [0] access.
  • Fixed CYLINDER and SPHERE markers in visualization_msgs/MarkerArray rendering at twice their intended diameter in the 3D web visualization. The markers now match the size shown in rviz.
  • When the /get_agent_info service times out (e.g., when the backend is not running), the web UI now displays a friendly "Connection Error" screen with troubleshooting steps instead of the generic "Something went wrong" error.
  • Fixed a use-after-free crash in RclcppSubscriberInterface that could occur when a subscriber was destroyed while a message callback was in-flight.
  • Fixed the Lock keepout zones toggle losing its state across page refreshes. The lock is now preserved in localStorage and is no longer overwritten on Supervisor mount.
  • Fixed the Behavior Tree pane occasionally displaying a previously-selected Objective's tree instead of the one currently running when switching between Objectives.
  • Fixed the Behavior Tree editor not auto-layouting after a node was deleted while Snap to Box was enabled. The remaining nodes now re-flow to fill the blank space, the same way they do when Snap to Box is first toggled on.
  • Fixed the Behavior Tree editor blocking drops at the bottom of a sequence when another sequence followed it. The drop zone below the last child is now reachable.
  • Fixed Decorator nodes (such as ForEach) with collapsed children showing no expand button in the Behavior Tree editor, making their children unreachable.
  • Fixed misleading error messages when a Behavior Tree node has an unrecognized port. The error now shows the actual Behavior name and correct line number instead of the generic XML tag name and an incorrect line.
  • Fixed error toast messages not appearing in the Alert Sidebar. Previously, many call sites raised error toasts via toast.error directly from react-hot-toast, which bypassed the toast history. They now go through the useToast wrapper so the Alert Sidebar stays in sync with toasts raised anywhere in the UI.
  • Fixed the AdjustPoseWithIMarker interactive marker snapping back to its initial orientation when rotating the gripper.
  • The 3D Visualizer now persists camera position, target, and zoom to localStorage so the view angle is restored on page refresh instead of resetting to the default.
  • Fixed GetPoseFromPixelCoords silently broadcasting dynamic transforms on /tf for each detected point, which could overwrite existing static frames (such as camera optical frames) and cause subsequent TF lookups to fail with tf2::ExtrapolationException. The Behavior's documented contract (writing poses to output_poses) is unchanged.

Documentation Improvements

  • Added Mobile Navigation (Nav2) guide covering lidar sensing, costmaps, localization with Fuse, and replanning Objectives on the Clearpath Ridgeback in hangar_sim.
  • Added Navigation with Replanning guide explaining how the Navigate to Clicked Point with Replanning Objective delegates continuous replanning to Nav2.

8.10.5

· One min read

Other Enhancements

Bug Fixes

  • Fixed a bug where deleting a direct child of the root BehaviorTree node in the editor left the tree permanently empty — new Behaviors dragged onto the root are now correctly persisted when saving.
  • Fixed SPHERE markers in visualization_msgs/MarkerArray rendering at twice their intended diameter in the 3D web visualization. The markers now match the size shown in rviz.
  • Fixed a bug where Objective Metadata (such as Subtree ports and category) is lost when undoing or redoing changes in the editor.
  • The 3D Visualizer now persists camera position, target, and zoom to localStorage so the view angle is restored on page refresh instead of resetting to the default.

8.10.4

· One min read

Improvements

  • The performance of the UI and associated systems such as rosbridge was improved.
  • Numeric values now preserved their type information in our backend instead of being converted to strings, preventing type-mismatch errors.
  • Tolerances in RRT were relaxed for better planning.
  • Parameter overrides properly accepted ROS types.

Bug Fixes

  • The orientation converter glitching issue was fixed.
  • The JTAC no longer allowed goals that violated the path tolerance.

9.1.1

· One min read

Other Enhancements

Other Improvements

  • Exposed set_jacobian_inverse_damping in the Python PathIKOptions API, allowing users to tune the Jacobian inverse damping factor for Path IK solving.

Bug Fixes

  • Fixed project3dToPixel segfaulting or returning incorrect coordinates on Jetson ARM64 due to an OpenCV ABI mismatch between the pre-built ros-humble-image-geometry package and NVIDIA's JetPack OpenCV. All Objectives using GetMasks3DFromMasks2D or FindMaskedObjects now work correctly on both amd64 and ARM64.
  • Fixed Enter/Space behavior when selecting favorited behaviors.
  • Automatically populate port values when a Subtree is added.
  • Updated the moveit_pro_acm_updater tool to handle the case where the output SRDF already exists by adding an -f/--force flag and merging new ACM entries into an existing SRDF instead of failing or requiring manual cleanup.