Dual Joystick
FREETwo-stick control for driving and steering
When to reach for it
Use Dual Joystick when translation and rotation need separate sticks: Differential for skid-steer, Omni for holonomic strafe, Drone M1 and Drone M2 for quadcopter throttle plus attitude. For one axis, Single Joystick does the job at half the footprint.
Both sticks publish only while you are touching them. Idle, the widget sends nothing at all, so it never competes with the robot's own navigation for the topic.
Worked example: differential drive on /cmd_vel
Topic /cmd_vel, Robot Type Differential: left stick drives, right stick turns. Set Max Linear Speed and Max Angular Speed to the robot's real m/s and rad/s max, not the normalized 1.0 default, so a stick push can't outrun the base. Publish Rate (Hz) (Pro) defaults to 10 Hz: raise it toward 50-100 Hz for a tight control loop, or lower it to about 5 Hz on a slow link. Release the stick and it doesn't wait for the next tick: a zero Twist flushes immediately, so a stalled JS thread can't leave it coasting on stale velocity.
Watch out for
- Twist carries six axes; most robots listen on two or three. The wrong Robot Type silently publishes components the robot ignores: it looks like nothing happened.
- Compact Mode Stick decides which stick survives below two-sticks-wide. Pick Left (Move) and rotation freezes at its last value, not zero, on collapse.
- On Release defaults to Send stop once, a single zero then silence; Repeat stop briefly is for a base that latches its last command, resending for Repeat For (s), default 1 second, bounded to 5.
- The publish cycle is keyed by topic, not by widget. Two joysticks on
/cmd_velshare one cycle, so either one being driven keeps the topic live, and if the two disagree on On Release the longer window wins. - Publish Rate (Hz), Velocity Curve, Dead Zone, and Haptic Feedback are Pro-only: free tier is stuck at 10 Hz regardless of link or loop.
Configuration fields
The topic this widget publishes to. While connected, tap to pick one the robot advertises.
Your robot's top linear speed in m/s, e.g. 0.22 for TurtleBot3. Default 1.0 sends normalized -1 to 1.
Your robot's top angular speed in rad/s, e.g. 2.84 for TurtleBot3. Default 1.0 sends normalized -1 to 1.
Remap which Twist field this axis controls (inversion + axis-off included here)
Remap which Twist field this axis controls (inversion + axis-off included here)
Remap which Twist field this axis controls (inversion + axis-off included here)
Remap which Twist field this axis controls (inversion + axis-off included here)
What to send when you let go. Pick "Repeat stop briefly" if your robot keeps moving on its last command.
How long to keep sending the stop after you let go, in seconds.
0.5 to 5, step 0.5Pro unlocks a Custom robot type that maps any stick direction to any Twist field.
How fast the joystick streams Twist messages.
WITH PRODefault 10 Hz. Raise it for tight control loops, lower to 5 Hz on slow links.
Response curve for stick-to-speed mapping.
WITH PROFiner control near zero for precise teleop with Quadratic or Cubic. Linear stays direct.
Stick moves inside this radius publish zero, not nothing. Shown as a ring in the preview.
0 to 0.3, step 0.01WITH PROCompensates for stick drift and prevents accidental nudges from a thumb resting on the touchscreen.
Vibration intensity on center snap.
WITH PROFeel the stick recenter without taking your eyes off the robot.
Which stick stays when the widget is too narrow for both. The hidden stick keeps publishing its last value.