A ROS2-based Autonomous Mobile Robot (AMR) platform supporting LiDAR-based SLAM, sensor fusion (EKF), autonomous navigation, teleoperation, camera/gas sensing, and multi-robot formation control.
The workspace is developed and tested using ROS2 Humble on Ubuntu 22.04.
bumpy_ws is a modular ROS2 workspace built for a differential-drive autonomous mobile robot (bumpy7) and multi-robot experimentation.
The system uses a YDLidar 2D LiDAR for environment perception, an EKF-based sensor fusion pipeline, and supports SLAM, autonomous navigation, and multi-robot formation control.
The workspace contains:
- Robot bringup
- Robot description (URDF/xacro) + EKF sensor fusion
- Low-level firmware (motor control, teleop, tick publishing)
- Sensor drivers (camera, IMU, gas sensor, OLED, web dashboard, leader election)
- SLAM (slam_toolbox + Cartographer)
- Autonomous navigation (Nav2)
- Multi-robot formation control
- YDLidar ROS2 driver + SDK
The architecture is designed to be extendable for multi-robot coordination, swarm robotics, warehouse automation, and autonomous indoor navigation.
- ROS2-based robot control (
bumpy_bringup) - Differential-drive URDF/xacro description (
bumpy_description) - EKF-based sensor fusion (
ekf.yaml) - TF management
- Velocity control via
diff_tf.py/motor_control.py
- Dual SLAM support: slam_toolbox and Google Cartographer (
bumpy_slam) - Real-time 2D map generation
- Map saving (
save_map.launch.py) - Multiple saved maps (
amr_map,maze,room_map,SREC_COE_NEW) - Saved waypoints per map (JSON)
- Nav2-based autonomous navigation (
bumpy_navigation) - Configurable params (
nav2_params.yaml)
- Camera + camera TF publisher
- IMU node
- Gas sensor node
- OLED status display
- Robot status monitor
- Web server dashboard (Flask-based)
- Leader election node (multi-robot)
- Differential-drive tick publisher + motor control
- Xbox controller teleop config
- Keyboard teleoperation
The formation_control package contains:
- 2-robot formation control
- 3-robot formation control (two implementations)
- Obstacle handling for multi-robot formations
| Component | Technology |
|---|---|
| Operating System | Ubuntu 22.04 |
| Middleware | ROS2 Humble |
| Programming | Python / C++ |
| SLAM | slam_toolbox, Google Cartographer |
| Navigation | ROS2 Navigation Stack (Nav2) |
| Sensor Fusion | robot_localization (EKF) |
| Visualization | RViz2 |
| Environment Perception | YDLidar 2D LiDAR |
| Build System | Colcon |
| Multi-Robot Control | Python |
| Robot Communication | ROS2 Topics / TF |
bumpy_ws/
โ
โโโ Bumpy Rviz/ # Saved RViz2 configs for mapping/navigation
โ โโโ bumpy7.rviz
โ โโโ ...
โ
โโโ src/
โ โ
โ โโโ bumpy_bringup/ # Top-level robot bringup
โ โ โโโ bumpy_bringup/
โ โ โโโ launch/
โ โ โ โโโ bringup.launch.py
โ โ โ โโโ minimal.launch.py
โ โ โโโ package.xml
โ โ โโโ setup.py
โ โ โโโ test/
โ โ
โ โโโ bumpy_description/ # URDF/xacro + EKF config
โ โ โโโ bumpy_description/
โ โ โโโ config/
โ โ โ โโโ ekf.yaml
โ โ โโโ launch/
โ โ โ โโโ robot.launch.py
โ โ โโโ urdf/
โ โ โ โโโ bumpy.xacro
โ โ โ โโโ bumpy7.xacro
โ โ โ โโโ robot.xacro
โ โ โโโ test/
โ โ
โ โโโ bumpy_firmware/ # Low-level motor control & teleop
โ โ โโโ bumpy_firmware/
โ โ โ โโโ diff_tf.py
โ โ โ โโโ motor_control.py
โ โ โ โโโ teleop.py
โ โ โ โโโ tick_pub.py
โ โ โโโ launch/
โ โ โ โโโ motor_control.launch.py
โ โ โโโ test/
โ โ
โ โโโ bumpy_navigation/ # Nav2 autonomous navigation
โ โ โโโ bumpy_navigation/
โ โ โโโ launch/
โ โ โ โโโ navigation.launch.py
โ โ โโโ params/
โ โ โ โโโ nav2_params.yaml
โ โ โโโ test/
โ โ
โ โโโ bumpy_sensors/ # Sensor drivers & dashboard
โ โ โโโ bumpy_sensors/
โ โ โ โโโ camera.py
โ โ โ โโโ camera_tf_pub.py
โ โ โ โโโ gas_sensor_node.py
โ โ โ โโโ imu.py
โ โ โ โโโ leader_ele.py
โ โ โ โโโ oled.py
โ โ โ โโโ robot_status.py
โ โ โ โโโ web_server_node.py
โ โ โโโ test/
โ โ
โ โโโ bumpy_slam/ # SLAM (slam_toolbox + Cartographer) + maps
โ โ โโโ bumpy_slam/
โ โ โโโ config/
โ โ โ โโโ slam.lua
โ โ โ โโโ slam_params.yaml
โ โ โโโ launch/
โ โ โ โโโ slam.launch.py # slam_toolbox
โ โ โ โโโ cartographer.launch.py # Cartographer
โ โ โ โโโ save_map.launch.py
โ โ โโโ maps/
โ โ โ โโโ amr_map.pgm / .yaml
โ โ โ โโโ maze.pgm / .yaml
โ โ โ โโโ room_map.pgm / .yaml
โ โ โ โโโ SREC_COE_NEW.pgm / .yaml
โ โ โโโ waypoints/
โ โ โ โโโ bumpy_map_waypoints.json
โ โ โ โโโ room_map_waypoints.json
โ โ โ โโโ SREC_COE_NEW_waypoints.json
โ โ โโโ test/
โ โ
โ โโโ formation_control/ # Multi-robot formation control
โ โ โโโ config/
โ โ โ โโโ formation_config.yaml
โ โ โโโ formation_control/
โ โ โ โโโ 2robot.py
โ โ โ โโโ 3robot.py
โ โ โ โโโ 3robot2.py
โ โ โ โโโ obstacle.py
โ โ โโโ launch/
โ โ โ โโโ formation.launch.py
โ โ โโโ test/
โ โ
โ โโโ ydlidar_ros2_driver/ # YDLidar ROS2 driver (C++)
โ โ โโโ config/
โ โ โ โโโ ydlidar.rviz
โ โ โโโ launch/
โ โ โ โโโ ydlidar_launch.py
โ โ โ โโโ ydlidar_launch_view.py
โ โ โโโ params/
โ โ โ โโโ *.yaml (per LiDAR model)
โ โ โโโ src/
โ โ โโโ ydlidar_ros2_driver_client.cpp
โ โ โโโ ydlidar_ros2_driver_node.cpp
โ โ
โ โโโ YDLidar-SDK/ # Vendored LiDAR SDK
โ โโโ core/
โ โโโ src/
โ โโโ python/
โ โโโ doc/
โ
โโโ build/ # Ignored
โโโ install/ # Ignored
โโโ log/ # Ignored
__pycache__/,.pyc, and.bak/.backupfiles should be excluded from Git via.gitignore.
- Ubuntu 22.04
- ROS2 Humble
- Python 3
- Colcon
- RViz2
- slam_toolbox
- Cartographer
- Navigation2
- robot_localization (EKF)
Install required ROS2 packages:
sudo apt update
sudo apt install \
ros-humble-slam-toolbox \
ros-humble-cartographer \
ros-humble-cartographer-ros \
ros-humble-navigation2 \
ros-humble-nav2-bringup \
ros-humble-robot-localization \
ros-humble-teleop-twist-keyboard \
ros-humble-rviz2git clone https://github.com/rajagopal95/bumpy_ws.git
cd bumpy_wscolcon build
source install/setup.bashFor every new terminal:
source ~/bumpy_ws/install/setup.bashros2 launch bumpy_bringup bringup.launch.pyBringup starts:
- Robot description (URDF/TF)
- EKF sensor fusion
- Motor control / firmware nodes
- Sensor nodes
For a lightweight bringup (development/testing):
ros2 launch bumpy_bringup minimal.launch.pyOdometry and IMU data are fused using robot_localization, configured at:
src/bumpy_description/config/ekf.yaml
This publishes a filtered odom โ base_link transform used by SLAM and Nav2.
The project supports two SLAM backends: slam_toolbox and Google Cartographer.
ros2 launch bumpy_slam slam.launch.pyParameters:
src/bumpy_slam/config/slam_params.yaml
ros2 launch bumpy_slam cartographer.launch.pyParameters:
src/bumpy_slam/config/slam.lua
Keyboard:
ros2 run teleop_twist_keyboard teleop_twist_keyboard --ros-args -r cmd_vel:=/cmd_vel i
j k l
,
| Key | Function |
|---|---|
i |
Forward |
, |
Backward |
j |
Rotate Left |
l |
Rotate Right |
k |
Stop |
ros2 launch bumpy_slam save_map.launch.pySaved maps are stored in:
src/bumpy_slam/maps/
Each map includes a .yaml (metadata) and .pgm (occupancy grid image).
Saved waypoints for each map live in:
src/bumpy_slam/waypoints/
ros2 launch bumpy_navigation navigation.launch.pyNavigation pipeline:
Saved Map
โ
โผ
Localization
โ
โผ
Global Planner
โ
โผ
Local Planner
โ
โผ
Controller
โ
โผ
/cmd_vel
โ
โผ
Robot
Nav2 parameters:
src/bumpy_navigation/params/nav2_params.yaml
You can view LiDAR scans, TF frames, maps, and navigation data in RViz2 on your own computer.
An RViz config is included with the LiDAR driver:
src/ydlidar_ros2_driver/config/ydlidar.rviz
rviz2 -d src/ydlidar_ros2_driver/config/ydlidar.rvizWhile running slam_toolbox or Cartographer, open RViz2 and set the Fixed Frame to map, then add Map, LaserScan, and TF displays. Load your saved mapping config from the Bumpy Rviz folder:
rviz2 -d "Bumpy Rviz/bumpy7.rviz"While bumpy_navigation is running, open RViz2 and add displays for Map, Costmap (global/local), Path, LaserScan, and TF. Load your saved navigation config from the Bumpy Rviz folder:
rviz2 -d "Bumpy Rviz/bumpy7.rviz"Nav2's bundled default config also works if installed:
rviz2 -d /opt/ros/humble/share/nav2_bringup/rviz/nav2_default_view.rvizThe bumpy_sensors package provides:
camera.py/camera_tf_pub.pyโ camera driver + TF publishingimu.pyโ IMU data publishinggas_sensor_node.pyโ gas sensor readingsoled.pyโ OLED status displayrobot_status.pyโ robot health/status monitoringleader_ele.pyโ leader election for multi-robot setupsweb_server_node.pyโ Flask-based web dashboard for monitoring
src/formation_control/
Implementations:
formation_control/
โโโ 2robot.py # Two-robot formation
โโโ 3robot.py # Three-robot formation (v1)
โโโ 3robot2.py # Three-robot formation (v2)
โโโ obstacle.py # Obstacle handling for formations
Robot 1
โ
โผ
Formation Logic
โ
โผ
Robot 2
Robot 1
โฒ
/ \
/ \
/ \
Robot 2 โโโ Robot 3
Obstacle
โโโ
โโโ
โ
โผ
Robot 1
\
\
Robot 2 -----> Formation Motion
/
/
Robot 3
Environment
โ
โผ
LiDAR / Sensors
โ
โผ
Robot Perception
โ
โผ
Formation Controller
โ
โโโโโโโโโโโโโผโโโโโโโโโโโโ
โ โ โ
โผ โผ โผ
Robot 1 Robot 2 Robot 3
โ โ โ
โโโโโโโโโโโโโผโโโโโโโโโโโโ
โ
โผ
Coordinated Motion
START
โ
โผ
Robot Bringup
โ
โผ
Sensor + EKF Startup
โ
โผ
YDLidar 2D LiDAR
โ
โผ
slam_toolbox /
Cartographer
โ
โผ
Real-Time SLAM
โ
โผ
Save Map
โ
โผ
Nav2 Localization
โ
โผ
Autonomous Navigation
โ
โผ
Multi-Robot Control
โ
โผ
Formation + Obstacle
Handling
โ
โผ
END
Important interfaces include:
/cmd_vel
/scan
/odom
odom โ base_link (EKF-fused)
To inspect available topics:
ros2 topic listTo inspect the TF tree:
ros2 run tf2_tools view_framesThe ydlidar_ros2_driver package (C++) wraps the vendored YDLidar-SDK to provide ROS2 LaserScan output.
Build the SDK (if not already built):
cd src/YDLidar-SDK
mkdir -p build && cd build
cmake ..
make
sudo make installThen build the ROS2 driver as part of the workspace via colcon build.
# ROS2
build/
install/
log/
# Python
__pycache__/
*.pyc
# Backups
*.bak
*.bak2
*.backup
*.backup.*
# YDLidar-SDK build artifacts
src/YDLidar-SDK/build/
# IDE
.vscode/
.idea/
# OS
.DS_StoreThe system is designed to demonstrate:
- โ EKF-based sensor fusion
- โ Real-time LiDAR mapping
- โ Dual SLAM support (slam_toolbox + Cartographer)
- โ Saved occupancy-grid maps + waypoints
- โ Nav2 autonomous navigation
- โ Manual keyboard robot control
- โ Sensor dashboard (camera, IMU, gas, OLED, web)
- โ Multi-robot formation control
- โ Obstacle-aware multi-robot development
Add project screenshots here:
docs/
โโโ mapping.png
โโโ navigation.png
โโโ rviz.png
โโโ formation_control.png
Example:
- Dynamic obstacle avoidance
- Improved local planning
- Adaptive planner selection
- Improved localization
- LiDAR + IMU fusion refinement
- LiDAR + Camera fusion
- AI-based object detection (YOLOv8)
- Dynamic obstacle tracking
- Dynamic formation switching
- Leader-follower control
- Decentralized coordination
- Collision avoidance
- Multi-robot task allocation
- Swarm intelligence
- Web-based robot monitoring
- Multi-robot dashboard
- Remote teleoperation
- Real-time status monitoring
- ๐ญ Warehouse automation
- ๐ฆ Material transportation
- ๐ฅ Hospital logistics
- ๐ข Indoor service robots
- ๐จ Surveillance
- ๐ Inspection
- ๐ค Multi-robot exploration
- ๐ Swarm robotics research
N N Rajagopal
Venket Ramana R S
Harishwaran T
ROS2 | Autonomous Mobile Robots | SLAM | Navigation | Multi-Robot Systems
Portfolio: rajagopal95.github.io/Portfolio
This project is developed for educational, development, and research purposes.