

ROS TeleOp
I built a small four-wheeled differential drive robot controlled via ROS teleoperation, designed to explore the integration of computer vision (OpenCV) into mobile robotics. The bot combined a Raspberry Pi as the onboard computer with an Arduino Uno for low-level motor control.
System Overview:
The control pipeline consisted of a ROS master running on the Raspberry Pi, where teleoperation nodes published velocity commands (/cmd_vel). These were intended to be sent over serial to the Arduino Uno, which interfaced with the L298N motor driver to actuate the DC motors. Simultaneously, the Raspberry Pi Camera provided a video feed into ROS topics for OpenCV-based processing. The power system was managed by a 3S 2200 mAh LiPo battery with a power distribution board, supplying regulated power to both the Pi and Arduino.
Key Features & Implementation:
Mechanical Platform: Four-wheel drive base with DC motors driven via an L298N motor driver shield.
Electronics & Power:
Arduino Uno for motor actuation.
Raspberry Pi 4 running Ubuntu as the ROS host.
Powered by a 3S 2200 mAh LiPo battery with a dedicated power distribution board and voltage regulators.
Control Architecture:
Arduino Uno controlled motors via L298N.
Serial communication intended between Raspberry Pi (ROS Master) and Arduino.
Teleop using ROS keyboard teleop node publishing to /cmd_vel.
Perception: Raspberry Pi Camera for computer vision tasks, intended for OpenCV-based object tracking and later integration into ROS topics.
Challenges & Issues Faced:
Camera–ROS Compatibility:
Pi Camera support was limited in ROS1, incompatible with standard drivers (cv_camera, usb_cam).
Switching to ROS2 (Foxy) enabled camera streaming and OpenCV integration.
Motor Control in ROS2:
ROS2 lacked rosserial_arduino, preventing direct Arduino motor control.
This forced a choice: ROS1 for motor actuation but no camera, or ROS2 for camera but no Arduino serial.
Possible Fixes That I Couldn't Implement:
Use the rosserial_python fork for ROS2 or migrate to micro-ROS for embedded ROS2 integration.
Replace Pi Camera with a USB webcam for ROS1 compatibility.
Bypass rosserial entirely: write a custom Python-serial ROS node on the Pi to interface with Arduino.
Use ros1_bridge to connect ROS1 (Arduino) with ROS2 (Camera/Vision).
Why This Project Matters:
This project introduced me to the complexities of ROS-based ground robotics, teaching me about teleop control, hardware/software integration, and the trade-offs between ROS1 and ROS2 ecosystems. It emphasized the importance of designing modular systems where perception, control, and actuation can evolve independently.
Next Steps Would Be To:
Transition to micro-ROS on Arduino for ROS2 compatibility and reliable motor control.
Add wheel encoders + odometry publishing for localization and SLAM.
Integrate with the ROS2 Navigation Stack (Nav2) using LiDAR or depth sensors.
Expand vision capabilities (object following, line detection) with OpenCV and the Pi Camera.
Evolve toward a fully autonomous differential drive robot capable of indoor exploration and mapping.
© 2025. All rights reserved.
All company logos, images, and trademarks are the property of their respective owners. Images sourced from public press releases are used here for informational and educational purposes only, with proper attribution. All other images, including photographs and project visuals, are original and owned by the site author. The inclusion of company images does not imply endorsement, sponsorship, or affiliation.