I had always wanted to build a custom 3d printed robot, but it seemed like a time intensive process. When Rafaello published his design in 2022, I was still learning a lot about ROS2 and unsure if I could take on building a custom robot.
Fast forward to June 2025 and I had gotten all of the 3d printed parts, Pololu motors, OLEDs, ball bearings, Adafruit Feather motor controller, and the Jetson TX2 NX as the brains (a simple drop-in upgrade to the original Jetson Nano). There was one thing missing, and that was the PCB.
I was planning to use the original design, but thought it was missing some things. Chiefly among those missing things, this board really needed better utilization of space -to include space for actual connectors and components. Since I had a T962 reflow oven on hand, I could forgo the through-hole components and go straight to SMD.
I chose to add an ICM20948 I2C IMU to the board, which would be on an i2c bus alongside one of the OLED displays. The motor control interface would remain similar but I would add the connectors via a JST-XH. The I2C connectors would be JST-SH 4 pin connectors. No longer would I struggle with cheap dupont connectors breaking off from the pin header interface (there is no strain relief!).
After designing in Kicad, I sent the gerber files off to osh park. Once I received the boards, I knew the stencil was really the most important part, and decided to buy one from a local manufacturer, Tropical Stencil. It was not cheap and about 10x the price of getting a stencil from PCBway, but it was an excellent quality stencil and came in handy when it came to the paste application (more on that later).
After these components all arrived, I could no longer procrastinate on the build.
TPU Filament Woes
I had some issues with the 3d printed treads earlier on in the build process as it turned out the TPU I was using for the prints was too stiff -I needed a more flexible TPU. I ended up breaking one of the tread support brackets!
After getting the TPU correct, I had a partial build minus the modified expansion PCB
I had my first attempt at reflow soldering a fail: the IMU QFN package was tricky. I had originally used the cheap cardboard cutouts and spare pcbs to try to sandwich the pcb but this was tricky due to the Osh Park pcb's having pointed edges where breaking off from the panel was left. I could not align these with the traditional pcb and cardboard method, so I turned once again to 3d printing to get a custom pcb holder so I can apply solder paste and get the QFN right this time. Success! I had detected the IMU over i2cdetect and valid readings!
I did have to modify the jetson i2c device clock rate from 400k to 100k, probably due to an incorrectly sized pull-up resistor on the i2c lines in my PCB. A minor issue fixed in software.
ROS2 IMU ProcessingThe next steps were to implement a custom ROS2 driver based on the Adafruit icm20X library.
I forked an existing repo and substituted the underlying driver with Adafruit's implementation, which can be found here on github. Finally, I had to clone and build this package to get the madgwick filter and process orientation so I can see the orientation change in rviz2. Next I modified the Nanosaur urdf xacro file to include the transform for the IMU. There are some cool ROS2 TF packages that allow you to visualize your transforms outside of rviz2:
ros2 run tf2_tools view_frames
Now that my transforms were correct, I fired up rivz2 and verify orientation.
In 2025, I would recommend starting with another robot platform such as the Duckiebot for a simple differential drive kit, or for something more complex opt for Hiwonder or Yahboom kits which are also Jetson based.
The issue with the Nanosaur in general is that it is difficult to build unless you have knowledge of 3d printer filaments. The other strike against it is the lack of motor encoders for localization. It would have been better to make the design slightly wider to accommodate motor encoders as Pololu makes these for a slight bump in cost.
After encoders, the platform really needs a 2D LiDAR such as the Slamtec C1. Without these hardware pieces, we are left to implement Nvidia's proprietary Elbrus SLAM library for localization, which is dependent on an Intel Realsense Stereo camera (D455 for example). We are also reliant on docker on the original Ubuntu 18.04 based jetpack. It would have been great to run the ROS2 SLAM toolbox with both the encoders and 2D lidar pulling their weight, and not have to resort to Visual SLAM + an expensive Realsense.
Docker can be problematic for beginners - in this project I built a custom yocto distro based off of the Tegrademo repo, and can run ROS 2 natively. With all of these issues in mind, it was a fun and challenging build and I learned a lot!









Comments