All Software + Firmware + Electrical Found Here
Overview
For my Capstone class, we developed a ground based autonomous Marsupial robot for extended exploration tasks. When a MiniBot is low on power, it autonomously navigates to a docking port on a larger “hubbot” using ROS2 and NAV2 stacks. The hubbot replaces the minibot’s battery in under 90seconds.
The minibot has a GPS, 9-axis IMU, and motor encoders for more accurate pose/state estimation in ROS2. Extended kalman filters are being used to fuse these sensors. OpenCV is being used for detecting Aruco tags, their location and orientation. NAV2’s path planning outputs Twist messages on a cmd_vel topic that is sent to the STM32 MCU over ROSSerial where it is converted from a unicycle to a differential drive PWM commands to the motor controller.
We have an Arduino Nano on the hubbot feeding battery module continuity and voltage data to the Jetson Nano, a GRBL CNC driver controlling the 3-axes of the hubbot, and our Nucleo+custom PCB providing GPS and IMU data of the HubBot. There is a main ROS2 node on the HubBot Jetson Nano coordinating the battery swapping+charging and talking to the MiniBot that is currently docking.
I wrote all firmware for the minibots in STM32Cube+STM32Duino, i.e. I use STM32Duino as much as I can as it’s a simple abstraction over the HAL drivers and makes life easier. I use STM32CubeMX for pin assignments and I use HAL drivers if I need to, such as reconfiguring clocks to use the internal LSI and HSI RC clocks instead of the external LSE and HSE clocks (if I need more I/O, for example). In the chain of command on the MiniBot, the firmware is from where the NAV2 stack outputs Twist messages down to the hardware, and getting sensor data back to the NAV2 stack. I wrote all the software/firmware for the hubbot.