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, use Slider. 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; Message Type 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 listens to the derived
controller_statetopic and the feedback topic at once and takes whichever answers first. The controller gives its configured joint order; the feedback topic comes sorted alphabetically byjoint_state_broadcaster. It also fills each joint's limits from the robot description. A list that lands out of order usually means the feedback topic won; 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
JointTrajectory works with real arms (ros2_control). JointState skips the controller: hobby setups only.
The topic this widget publishes to. While connected, tap to pick one the robot advertises.
The ROS message type, like sensor_msgs/msg/Image. Fills in when you pick a topic.
Tap a joint to set its name, range, rest position, and unit. Reorder with the button beside this title. Auto-detect from robot (while connected) reads the joint names from the controller or feedback topic, and the joint limits from the robot description (robot_state_publisher or the /robot_description topic), including any narrower soft or controller limits in it. A range you set inside the limits is kept, a bound outside them is narrowed, and joints still at ±0.5 take the full limits. If no topic answers, your joint list stays and other joints in the description are offered to add. Nothing changes until you Save.
Sets time_from_start per point, default 1500 ms for real arms. Lower toward 100 ms only for streaming teleop.
Send one value when you release a slider, instead of streaming continuously while you drag.
Messages per second while active. Higher is smoother but uses more bandwidth.
Show the robot's actual joint positions as a ghost on each slider, separate from your command.
Messages per second this widget takes from the feedback topic. Lower saves data, higher tracks closer.
0.1 to 60, step 0.1If feedback has not caught up this long after release, the thumb jumps to the robot's reported position.
500 to 10000, step 500Widen a slider when feedback falls outside its range. Off pins that feedback at the edge in amber.
Ease the ghost and thumb toward reported positions instead of snapping. Your commanded value is unaffected.
How strongly to smooth the feedback. Heavy damps a noisy controller but adds lag.