Joint Sliders
PROMulti-joint arm control with live feedback
When to reach for it
Joint Sliders poses several joints together: manual posing and live streaming control against joint_trajectory_controller. For a single joint, plain Slider is lighter. For waypoint planning with progress and cancel, Action Client (Pro) against MoveIt or Nav2 is the right tool.
Worked example: SO-101 arm
Set Command Schema to JointTrajectory, Command Topic /arm_controller/joint_trajectory; Schema Name auto-fills to trajectory_msgs/msg/JointTrajectory. Tap Auto-detect from robot to pull the five arm joints (the gripper runs its own controller). Leave Publish on Release Only on, Move Duration at 1500 ms, and enable Track Robot State against /joint_states so the feedback ghost trails the thumb as the controller interpolates.
Watch out for
- Picking JointState as the Command Schema on a real
ros2_controlarm (SO-101, UR, MoveIt) is the classic “sliders move but the robot does not” trap; the Command Schema description below explains why it never reaches the controller. - Auto-detect from robot checks the derived
controller_statetopic first, in the controller's configured order; after a 2.5-second timeout it falls back to the feedback topic, sorted alphabetically byjoint_state_broadcaster. A list that lands out of order usually means the fallback fired; fix it in Joint Configuration. - Auto-fit Range to Feedbackoff plus an out-of-range reading pins the thumb amber at the edge. Widen the joint's min/max or turn auto-fit on.
Configuration fields
Which command schema to publish. JointTrajectory is the ROS 2 standard, what joint_trajectory_controller listens to, with proper interpolation and controller-side limits. JointState mode publishes the state schema directly on the command topic; it bypasses the controller entirely, so it will not work against real ros2_control arms (SO-101, UR, MoveIt). Use JointState only for hobby setups that subscribe to JointState as a Unity / Arduino bridge command path.
The topic this widget publishes to. While connected, tap to pick from the topics the robot advertises.
The ROS message type for this topic, e.g. sensor_msgs/msg/Image. Usually auto-filled when you choose a topic.
Set up each joint: name, range, rest position, and unit. Tap a joint to edit it; use the reorder button to the right of this title to change their order.
time_from_start horizon per trajectory point. Larger = smoother and safer on real hardware (stays under the controller velocity caps); smaller = more responsive but rides those caps. Default 1500 ms is biased for first-touch real-arm safety. Streaming-teleop setups (with "Publish on Release Only" off) typically lower this toward ~100 ms to match the publishRate tick.
0 to 3000, step 100Send one value when you release a slider, instead of streaming continuously while you drag.
How many times per second this widget publishes while active (Hz). Higher is smoother but uses more bandwidth.
Show the robot's actual joint positions as a ghost indicator on each slider. The slider thumb stays at your commanded value, so command and feedback are visible separately. Useful for watching motion catch up when JointTrajectory plans over a horizon.
After you release a slider, the thumb stays at your commanded value while feedback catches up. If feedback never settles within this window (slow controller, joint at a limit, no controller listening), the thumb auto-recouples to feedback anyway so it does not sit stranded.
500 to 10000, step 500When the robot reports a joint position outside the configured min/max, grow the slider scale to keep the thumb on the track instead of pinning it at the edge (off by default; out-of-range pins to the edge in amber). The configured min/max still bound what you can command.
Ease the ghost and thumb toward the robot's reported position instead of snapping to every sample. Softens a jumpy or noisy controller. Off by default; your commanded value and out-of-range detection are unaffected.
How strongly to ease the displayed feedback. Light barely softens; Heavy strongly damps a noisy controller at the cost of more lag.