The mobile dashboard for ROS2 robots.
Teleop joystick, live camera, 2D map, Nav2 goals, diagnostics, and gamepad support — all from your phone.
Connect over WiFi via rosbridge or Foxglove. No DDS, no VPN, no laptop required.
Sign up for the beta or build it yourself.
ROS-Mobile was the go-to for ROS1 (500+ stars, 13K+ downloads, 4.5+ rating) but is stuck on ROS1, which hit EOL in May 2025. ROS2 adoption is growing fast with no polished mobile equivalent. ROSDeck fills that gap — a native, cross-platform app purpose-built for ROS2.
- Teleop joystick — virtual thumbstick publishing
Twist/TwistStampedwith configurable axes and velocity scaling - Bluetooth gamepad support — connect an Xbox, PS5, or generic BT controller; auto-maps sticks to joystick widgets with configurable deadzone and layout
- Live camera — subscribe to
CompressedImagetopics or connect to an MJPEG stream - 2D map — render
OccupancyGrid, overlayLaserScanpoint clouds, show robot pose from TF - Nav2 integration — tap the map to publish goal poses
- Rosbridge & Foxglove — connect via
rosbridge_server(port 9090) orfoxglove_bridge(port 8765), no DDS configuration needed - Customizable layouts — tmux-style split panes, swap and resize widgets, save/load per robot
- Auto-layout — detects available topics on connect and suggests a matching layout
- Demo mode — try the full app without a robot
| Category | Widget | Message Type |
|---|---|---|
| Control | Joystick | geometry_msgs/Twist, TwistStamped |
| Sensor | Camera | sensor_msgs/CompressedImage, Image |
| Sensor | Battery | sensor_msgs/BatteryState |
| Sensor | IMU | sensor_msgs/Imu, MagneticField |
| Sensor | Line Chart | Any numeric topic field |
| Nav | Map | nav_msgs/OccupancyGrid + TF + LaserScan |
| Debug | Topic Viewer | Any topic (raw JSON) |
| Debug | Rosout | rcl_interfaces/Log |
| Debug | Diagnostics | diagnostic_msgs/DiagnosticArray |
| Debug | TF Tree | /tf, /tf_static |
The map widget supports Nav2 goal pose publishing, costmap overlays, and laser scan visualization.
- Node.js and npm
- Expo CLI
- A ROS2 robot running
rosbridge_serverorfoxglove_bridge
# Install rosbridge
sudo apt install ros-${ROS_DISTRO}-rosbridge-suite
# Launch it
ros2 launch rosbridge_server rosbridge_websocket_launch.xmlgit clone https://github.com/baunuri/rosdeck.git
cd rosdeck
cp app.json.example app.json
cp eas.json.example eas.json
npm install
npm startEdit app.json with your own slug, bundleIdentifier, package, and EAS projectId before building.
npm run build:android-debug # Debug APK
npm run build:android-preview # Release APK
npm run build:android-production # AAB for Play Store- TurtleBot4 (Gazebo simulation)
- SMUB (Super Mega Ultra Bot, a DIY rover robot)
- A generic smartphone Bluetooth gamepad controller
Works with any ROS2 robot that runs a WebSocket bridge (Humble, Jazzy, Rolling).
app/(tabs)/ # Three-tab UI: Connect, Control, Settings
widgets/ # Widget definitions and components
stores/ # Zustand state management
lib/ # Transport layers (rosbridge, foxglove, demo)
hooks/ # React hooks (cmd_vel publisher, gamepad input, orientation)
modules/expo-gamepad/ # Native Expo module for Bluetooth gamepad input (Kotlin + Swift)
components/ # Shared React Native components
types/ # TypeScript interfaces
- React Native (Expo SDK 55) — cross-platform native app
- TypeScript — type-safe codebase
- Zustand — lightweight state management
- roslibjs — rosbridge WebSocket protocol
- @foxglove packages — Foxglove WebSocket protocol with CDR serialization
- react-native-skia — high-performance canvas rendering for map and laser scan
- react-native-reanimated — smooth joystick and UI animations
GPLv3 — see LICENSE.
You can build and use this app freely. If you distribute a modified version, you must open-source your changes under the same license.
