Uber and Rivian strike $1.25bn robotaxi deal
Back to Tutorials
techTutorialintermediate

Uber and Rivian strike $1.25bn robotaxi deal

March 19, 202613 views5 min read

Learn to build a simplified autonomous vehicle control system using ROS 2 that mirrors the technology behind Uber and Rivian's robotaxi partnership.

Introduction

In the rapidly evolving world of autonomous vehicle technology, companies like Uber and Rivian are leading the charge toward robotaxi services. This tutorial will guide you through building a simplified autonomous vehicle control system using Python and ROS (Robot Operating System). We'll focus on creating a basic perception and navigation stack that mirrors the core technologies discussed in the Uber-Rivian partnership. This system will include object detection, path planning, and vehicle control modules.

Prerequisites

  • Basic understanding of Python programming
  • Intermediate knowledge of ROS 2 (Robot Operating System)
  • Python 3.8 or higher
  • ROS 2 Humble or Iron installed on your system
  • Basic understanding of autonomous vehicle concepts

Step-by-Step Instructions

Step 1: Setting Up the ROS 2 Workspace

First, we need to create a ROS 2 workspace for our autonomous vehicle project. This workspace will contain all our packages and dependencies.

1.1 Create the workspace directory

mkdir -p ~/autonomous_vehicle_ws/src

1.2 Initialize the workspace

cd ~/autonomous_vehicle_ws

1.3 Source the ROS 2 environment

source /opt/ros/humble/setup.bash

1.4 Build the workspace

colcon build

Why: Creating a dedicated workspace ensures clean package management and avoids conflicts with system packages. ROS 2 workspaces are essential for organizing complex robotic projects.

Step 2: Creating the Perception Package

The perception package will handle object detection, similar to what Rivian's in-house chip might do. We'll simulate this with a simple detection system.

2.1 Create the package

cd ~/autonomous_vehicle_ws/src
ros2 pkg create --build-type ament_python perception_pkg

2.2 Create the detection node

touch ~/autonomous_vehicle_ws/src/perception_pkg/perception_pkg/detection_node.py

2.3 Implement basic object detection logic

import rclpy
from rclpy.node import Node
from std_msgs.msg import String
from sensor_msgs.msg import Image
from geometry_msgs.msg import Point


class DetectionNode(Node):
    def __init__(self):
        super().__init__('detection_node')
        self.publisher_ = self.create_publisher(String, 'detected_objects', 10)
        self.timer = self.create_timer(0.5, self.detect_objects)

    def detect_objects(self):
        # Simulate object detection
        objects = ['car', 'pedestrian', 'traffic_light']
        msg = String()
        msg.data = str(objects)
        self.publisher_.publish(msg)
        self.get_logger().info(f'Detected objects: {objects}')


def main(args=None):
    rclpy.init(args=args)
    node = DetectionNode()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()


if __name__ == '__main__':
    main()

Why: This simulation represents how Rivian's autonomous stack would process sensor data to identify objects in the vehicle's environment. The node publishes detection results to a topic that other nodes can subscribe to.

Step 3: Creating the Navigation Package

The navigation package will handle path planning and vehicle control, similar to what Uber's robotaxi platform would implement.

3.1 Create the navigation package

cd ~/autonomous_vehicle_ws/src
ros2 pkg create --build-type ament_python navigation_pkg

3.2 Create the navigation node

touch ~/autonomous_vehicle_ws/src/navigation_pkg/navigation_pkg/navigation_node.py

3.3 Implement navigation logic

import rclpy
from rclpy.node import Node
from std_msgs.msg import String
from geometry_msgs.msg import Twist
from nav_msgs.msg import Odometry


class NavigationNode(Node):
    def __init__(self):
        super().__init__('navigation_node')
        self.subscription = self.create_subscription(
            String,
            'detected_objects',
            self.objects_callback,
            10)
        self.publisher_ = self.create_publisher(Twist, 'cmd_vel', 10)
        self.odom_subscription = self.create_subscription(
            Odometry,
            'odom',
            self.odom_callback,
            10)
        self.current_position = None
        self.current_velocity = None

    def objects_callback(self, msg):
        objects = eval(msg.data)
        self.get_logger().info(f'Processing objects: {objects}')
        self.plan_path(objects)

    def odom_callback(self, msg):
        self.current_position = msg.pose.pose.position
        self.current_velocity = msg.twist.twist.linear

    def plan_path(self, objects):
        # Simple path planning logic
        cmd = Twist()
        
        # Avoid obstacles
        if 'car' in objects or 'pedestrian' in objects:
            cmd.linear.x = 0.0  # Stop
            cmd.angular.z = 0.5  # Turn
            self.get_logger().info('Avoiding obstacle')
        else:
            cmd.linear.x = 1.0  # Move forward
            cmd.angular.z = 0.0  # Straight
            self.get_logger().info('Moving forward')
        
        self.publisher_.publish(cmd)


def main(args=None):
    rclpy.init(args=args)
    node = NavigationNode()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()


if __name__ == '__main__':
    main()

Why: This navigation node represents the core decision-making system that would control vehicle movement based on detected objects. It subscribes to detection results and publishes control commands to the vehicle's actuators.

Step 4: Creating the Main Launch File

Now we'll create a launch file to run all components together, simulating the integrated system that Uber and Rivian are building.

4.1 Create the launch directory

mkdir -p ~/autonomous_vehicle_ws/src/autonomous_vehicle_pkg/launch

4.2 Create the launch file

touch ~/autonomous_vehicle_ws/src/autonomous_vehicle_pkg/launch/autonomous_vehicle.launch.py

4.3 Implement the launch configuration

from launch import LaunchDescription
from launch_ros.actions import Node


def generate_launch_description():
    return LaunchDescription([
        Node(
            package='perception_pkg',
            executable='detection_node.py',
            name='detection_node'
        ),
        Node(
            package='navigation_pkg',
            executable='navigation_node.py',
            name='navigation_node'
        )
    ])

4.4 Create the main package

cd ~/autonomous_vehicle_ws/src
ros2 pkg create --build-type ament_python autonomous_vehicle_pkg

Why: A launch file ensures all components start in the correct order and with proper parameters. This simulates how Uber and Rivian would integrate their systems into a cohesive robotaxi platform.

Step 5: Building and Running the System

5.1 Build the workspace

cd ~/autonomous_vehicle_ws
colcon build

5.2 Source the workspace

source install/setup.bash

5.3 Launch the system

ros2 launch autonomous_vehicle_pkg autonomous_vehicle.launch.py

Why: This final step brings together all our components to simulate an integrated autonomous vehicle system. The system will detect objects and navigate accordingly, mimicking the technology in the Uber-Rivian partnership.

Summary

In this tutorial, we've built a simplified autonomous vehicle control system that demonstrates the core components of modern robotaxi platforms. We created perception and navigation packages using ROS 2, implemented basic object detection and path planning logic, and integrated them into a launch configuration. This system mirrors the technology that Uber and Rivian are developing for their commercial robotaxi deployments in San Francisco and Miami. While this is a simplified simulation, it provides a foundation for understanding how real autonomous vehicle systems work, incorporating sensor processing, decision-making, and control systems that form the backbone of the autonomous transportation revolution.

Source: TNW Neural

Related Articles