Our team’s goal is to creat a six wheeled robot that can drive, operate a manipulator arm, detect life, and autonomously navigate. We will officially enter the robot into the University Rover Challenge, June 2022. This write up covers the content I contributed and the tools and frameworks I implemented the design with. The team’s critical design review can be found here: Critical Design Review.
Picture of the robot currently used for prototyping:

ROS is an open source robotics middleware suite and is the premier framework for robotic rapid prototyping. The ROS wiki is an outstanding resource to learn more so I won’t go into detail here. The project uses ROS for the majority of the robot’s communication between components and functionality. Each software developer on the project completed the ROS Tutorials and below is a demonstration of ROS nodes talking to one another and executing commands.
Gazebo is a suite of simulation software that communicates quite nicely with ROS. The team religiously uses gazebo to simulate all prototyped software and hardware dimensions before any fabrication takes place.
A basic gazebo simulation with a turtlebot and obstacles. The turtlebot is using it’s simulated laser scanner and a simple obstacle avoidance algorithm to wander around.

Below is an image of various ros nodes running, necessary to enable the ros network to communicate with the web based frontend. Here the pilot of the rover can pass data through the web browser, which is received through a web socket on a ros node. This is a simple integration test which merely displays the data passed over the browser.

A GUI is needed to control the robot and subsequently compete in the URC competition. The stack begins with a simple web app which interfaces with the ROS network via a web socket. Commands are transferred wirelessly using 802.11 WiFi and the HTTP protocol. The web server was made using Node.js and Express (source). The data is displayed to the operator using html/css/javascript (source).

The robot uses ten motors: six for forward and backward acceleration and four for steering the wheels left and right. I used Roboclaw motor encoders which communicate over serial ports.
A ‘roboclaw’ object was created using C++ which acts as the bridge between the linux serial ports and the actual encoders (source). This object is used by the ROS node (source) to properly send and receieve data and control when the wheels spin.