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.