4WD Robot Teleoperation Guide | Raspberry Pi + ROS Noetic

Ultimate 4WD Robot Teleoperation Guide

This guide takes you from zero to a fully working 4WD robot using Raspberry Pi + ROS Noetic, controlled via keyboard or Xbox Controller with speed modes and auto-start capability.


Day 1: Raspberry Pi Setup

  • Install Ubuntu 20.04 on Raspberry Pi using Raspberry Pi Imager.
  • Enable SSH:
    sudo systemctl enable ssh
    sudo systemctl start ssh
  • Update packages:
    sudo apt update
    sudo apt upgrade -y
  • Install Python and essential tools:
    sudo apt install python3-pip python3-venv git -y
Day 1 Raspberry Pi setup screenshot

Day 2: Installing ROS Noetic

  • Add ROS repository:
    sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu focal main" > /etc/apt/sources.list.d/ros-latest.list'
    sudo apt install curl -y
    curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
  • Install ROS Noetic Desktop Full:
    sudo apt update
    sudo apt install ros-noetic-desktop-full -y
  • Initialize rosdep:
    sudo rosdep init
    rosdep update
  • Add ROS setup to bash:
    echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
    source ~/.bashrc
Day 2 ROS installation screenshot

Day 3: Motor Driver Node

  • Create workspace:
    mkdir -p ~/catkin_ws/src
    cd ~/catkin_ws
    catkin_make
    source devel/setup.bash
  • Create motor driver node:
    cd ~/catkin_ws/src
    mkdir my_4wd_robot
    cd my_4wd_robot
    mkdir scripts
    nano scripts/motor_driver_node.py
    Paste the code:
    #!/usr/bin/env python3
    import rospy
    from geometry_msgs.msg import Twist
    import RPi.GPIO as GPIO
    
    LEFT_FORWARD = 17
    LEFT_BACKWARD = 27
    RIGHT_FORWARD = 22
    RIGHT_BACKWARD = 23
    
    GPIO.setmode(GPIO.BCM)
    GPIO.setup([LEFT_FORWARD, LEFT_BACKWARD, RIGHT_FORWARD, RIGHT_BACKWARD], GPIO.OUT)
    
    def move(linear, angular):
        if linear > 0:
            GPIO.output(LEFT_FORWARD, True)
            GPIO.output(RIGHT_FORWARD, True)
        elif linear < 0:
            GPIO.output(LEFT_BACKWARD, True)
            GPIO.output(RIGHT_BACKWARD, True)
        else:
            GPIO.output([LEFT_FORWARD, LEFT_BACKWARD, RIGHT_FORWARD, RIGHT_BACKWARD], False)
    
    def callback(msg):
        linear = msg.linear.x
        angular = msg.angular.z
        move(linear, angular)
    
    rospy.init_node('motor_driver_node')
    sub = rospy.Subscriber('/cmd_vel', Twist, callback)
    rospy.spin()
  • Make executable:
    chmod +x scripts/motor_driver_node.py
  • Test node:
    roscore
    rosrun my_4wd_robot motor_driver_node.py
Motor driver node test

Day 4: Keyboard Teleoperation

  • Install keyboard teleop:
    cd ~/catkin_ws/src
    git clone https://github.com/ros-teleop/teleop_twist_keyboard.git
    cd teleop_twist_keyboard
    sudo python3 setup.py install
  • Run keyboard teleop:
    rosrun teleop_twist_keyboard teleop_twist_keyboard.py
    rostopic echo /cmd_vel
  • Robot moves with arrow keys. Forward/backward and left/right verified.
Keyboard teleop screenshot

Day 5: Xbox Controller Teleoperation

  • Pair Xbox controller via Bluetooth:
    bluetoothctl
    power on
    agent on
    default-agent
    scan on
    pair XX:XX:XX:XX:XX:XX
    trust XX:XX:XX:XX:XX:XX
    connect XX:XX:XX:XX:XX:XX
    quit
  • Install xpadneo driver:
    sudo apt install dkms
    sudo modprobe hid_xpadneo
  • Create xbox teleop node and paste full Day 5 code (headless-safe, speed modes, sensitivity):
    cd ~/catkin_ws/src/xbox_teleop/src
    nano xbox_teleop_node.py
    chmod +x xbox_teleop_node.py
  • Test launch:
    roslaunch my_4wd_robot robot_bringup.launch
    rosnode list
    rostopic echo /cmd_vel
Xbox controller teleop screenshot

Day 6: Auto-Connect & Production Hardening

  • Create launch file:
    nano ~/catkin_ws/src/my_4wd_robot/launch/robot_bringup.launch
    Paste:
    <launch>
      <node pkg="my_4wd_robot" type="motor_driver_node.py" name="motor_driver_node" output="screen" />
      <node pkg="xbox_teleop" type="xbox_teleop_node.py" name="xbox_teleop" output="screen" />
    </launch>
  • Rebuild workspace:
    cd ~/catkin_ws
    catkin_make
    source devel/setup.bash
  • Create systemd service for auto-start:
    sudo nano /etc/systemd/system/robot_bringup.service
    Paste:
    [Unit]
    Description=Robot Auto Bringup
    After=network.target bluetooth.target
    
    [Service]
    Type=simple
    User=ubuntu
    WorkingDirectory=/home/ubuntu/catkin_ws
    ExecStart=/opt/ros/noetic/bin/roslaunch my_4wd_robot robot_bringup.launch
    Restart=always
    Environment="DISPLAY=:0"
    
    [Install]
    WantedBy=multi-user.target
  • Enable & start:
    sudo systemctl daemon-reload
    sudo systemctl enable robot_bringup.service
    sudo systemctl start robot_bringup.service
  • Verify:
    rosnode list
    rostopic echo /cmd_vel
    Joystick forward/backward → moves Left/right → correct turns A/B/Y → speed modes More pressure → faster movement
Auto-start Xbox controller screenshot

Next Steps

  • Add deadman button (robot moves only while pressed)
  • Auto-stop on controller disconnect
  • Status LED or log
  • Tune speed modes and joystick sensitivity

Congratulations! You now have a fully working 4WD robot with:

  • Keyboard & Xbox controller control
  • Speed modes & sensitivity curves
  • Auto-start after power ON
  • Ready for production-level testing with safety improvements

Comments