ROSbot "Humble Dave" Is Dreaming Again

Robot Dave has had a lot of personalities since he was born, and it appears Dave is contemplating “Robot Dreams” again. (Due to completion of mechanical project adding docking contacts.)

ROSbot “Humble Dave”'s Robot Dream (Based on ROS 2 Humble Hawksbill over Ubuntu 22.04 Server):

  • Stay alive (24/7 operation without human plug/unplug assistance)
  • Get on dock when battery low. Get off dock when charged.
  • Learn ROS 2 Navigation
  • Test/Tune Localization
  • Test/Tune Mapping (“Dock Room”, “Tile Areas”, “Carpeted Areas”)
  • Incorporate MPU9250 IMU
  • Test/Tune EKF fusion of encoders and IMU data
  • Learn Behavior Tree Programming
  • Learn “Robot Control” Programming


The physical robot “Dave” first booted up on June 21st, 2021.

After unrecorded hours of

  • booting nearly every OS available for the Raspberry Pi, and every version of each of those, with
  • uncounted hours running ROS Kinetic, then
  • running ROS Melodic, then
  • “running” a 1k in ROS 2 Foxy,
  • working through the Hands On ROS book in ROS 2 Galactic, then
  • exploring SLAM in Humble, and
  • 10 days last month running ROS Noetic…

Humble Dave is officially a 24/7 robot maintaining life, wheel, and ROS 2 odometry logs.

He doesn’t have any autonomy yet, but Is celebrating his latest incarnation as “ROSbot Humble Dave” sitting on his charging dock, not letting another minute of “life” pass unrecorded.


Working through all the ROS 2 Humble Hawksbill image examples, updating for HumbleDave path.

@este noted that the teleop-tools teleop_keyboard node recognized the arrow keys, which my teleop_gopigo3_keyboard node did not, so had to figure a way to add those mappings.


Interesting issue arose with Humble Dave’s safetyShutdown program now that he is a 24/7 bot. Previously, I programmed the safetyShutdown to flash the “WiFi LED” orange when the battery voltage dropped below 10 volts and to actually perform a full safety shutdown at 9.75v. This worked well for the “charge, then run till battery drained” use case of “ROSbot Dave”.

Now Humble Dave will be getting back on his dock when the light starts flashing, and the light should stop flashing when the battery is again sufficiently above 10volts. BUT, I didn’t program the safetyShutdown for that usecase, so once the light was flashing, charging would not turn the blinking caution light off!

New safetyShutdown appears to be working now:


2023-11-09 20:06|[]** Another Test of last leg LED **
2023-11-09 20:09|[]** safetyShutdown: voltage warning blinker activated  **
2023-11-09 20:42|[]** safetyShutdown: voltage warning blinker deactivated  **
2023-11-09 21:17|[]** Another Test of last leg LED **
2023-11-09 21:28|[]** safetyShutdown: voltage warning blinker activated  **
2023-11-09 21:40|[]** safetyShutdown: voltage warning blinker deactivated  **

Fun, when software finally does what you want.


Very cool. Congrats to Dave.


Drove around the room four times with HumbleDave running SLAM - and the produced map looks better than I remembered. Actually surprising since his odometry thinks he is at x: 2.4 meters, y: -1.3 meters when he is back at 0,0.

I need to figure out how to see what the SLAM thinks his location and heading are.


Ok, now I am impressed by ROS 2 Simultaneous Localization and Mapping (SLAM)!

2023-11-11 09:49|[]** Starting ROS2 GoPiGo3 on dock 12.4v reported **
2023-11-11 09:51|[]** Off dock 11.5v using 500MB, load 1.05 reported **
2023-11-11 10:06|[]** Around the room and Back on dock: Odom: 0.3,-1,39deg  Pose: 0.056,0.009,2deg reported 11.3v before docking 12.4v docked **

Test: HumbleDave went around the room once, then backed onto his dock:

  • “Dead Reckoning” with GoPiGo3 encoders only claims x,y: 0.3, -1 heading: 39 deg
    (300mm in front and 1m to left of dock, with heading error of approximately 39 degrees)

  • SLAM from LIDAR and GoPiGo3 encoders claims 0.056,0.009 heading 2deg
    (56mm in front and 9mm to left of dock, with heading error approximately 2 degrees)


  • While much better than dead reckoning, “ROS 2 navigation with SLAM” is not going to be able to put Humble Dave back on the dock without assistance.
  • /pose topic is only published at 2Hz
  • Noting: The iRobot Create 3 uses an IR beacon, encoders, and optical flow sensor for final docking
  • Noting: Carl’s assistance:
    • castor wheel guide with 90mm wide entry extending 200mm in front of dock
      (shout out to @jimrh for the suggestion - 4142 dockings ago)
    • Aruco marker / OpenCV tracking available (but not integrated)

This was only the first test of Humble Dave’s SLAM, but it is quite encouraging.

I need to learn how to add navigation to Humble Dave for the next phase of testing, (and go back to read the Hands On ROS Chapter 8…)



  • Previously figured out the map building using slam_toolbox instead of AMCL.
  • There is a cool “wander” node that I need to translate for ROS 2
  • The HoROS navigation configuration is quite hidden in launch files, but are ROS (1) specific
  • Nav2 replaces navigation in ROS2 so …
  • I’m going to have to work through the Nav2 “First Time Robot Setup” tutorial
  • Reminded that the HoROS URDF uses a “non-conventional” laser_frame instead of base_laser, have to decide if I change my urdf to fit or change my configuration files to use the HoROS convention.
  • Once I get Nav2 working, I should update the ROS 2 Humble For GoPiGo3 image and documentation to include mapping and navigation (and add the “manual v4 updates” that the current image requires.)

Good luck - I’m sure you’ll master it in no time.


Now, what seems like many “robot lifetimes” ago ROSbot Dave did a “1k run” which actually was Dave listening to my wireless game pad commands - go forward, turn right, turn left, and stop.

ROSbot Dave ran the entire 1k on the sidewalk dreaming of the day he would return to do the same run autonomously. I was not dreaming; I was imagining the difficulty to create a control structure where Dave could navigate using lane recognition but I could “assist” with joystick commands for safety of Dave as well as the dogs and bicycles that Dave would not be able to recognize and navigate around.

This morning I learned that the ROS community already built exactly this function as a ROS package called Twist-mux. I can feel ROSbot Dave’s dream becoming a reality.


Oh boy, installed Nav2, started robot dave, launched navigation, launched rviz2, clicked on “2D Goal” button, dragged a point in front of Dave, and he raced off his dock to the point. Yo, this is cool!


Great when things actually work, isn’t it?