A fully working 1/5 scale model of the Husarion Lynx AMR.
spin_small.mp4
nav_small.mp4
Just for fun. I mean look at it! It's so tiny! It has such a mean scowl!
And to maybe learn a few things in the process.
To give it a decent amount of compute in a tiny package, it runs a CM4 with 32GB of eMMC. The eMMC is necessary since the Ochin V2 quadrotor carrier board omits a microSD card slot, but that makes the entire compute part almost smaller than a Pi Zero. It does need a fan so the 3D printed chassis doesn't melt (don't ask me why I know). Let's just say this isn't the first nor the second chassis...
The VL53L7CX sensor is mounted at an angle at the front and provides as 90x90 deg FoV up to 4m, although it's only an 8x8 grid. The top two rows are used for emulating a laserscan, while the rest are used for obstacle and cliff detection. The STS3045M servos provide excellent closed loop control for slow crawling, and report odometry feedback. The wheels are so soft that they tend to deform in turns though, so the BNO085 IMU takes care of heading. The LED filaments are driven with a slimmed down MX1508 motor driver with half of the inputs pulled low and the other half driven by PWM. The crazy compact USB audio amp taken from a laptop external speaker handles audio out for the TTS and sound effects.
![]() |
![]() |
Most of the peripheral boards had their capacitors and other unnecessary components removed in order to fit. I had to take some creative liberties on the rear end to make everything work properly anyway.
The dock is still a WIP, though the electronics setup is relatively finalized, with one CC/CV charger, a display board, and pogo pin connectors that are input-only via a mosfet emulated diode so the pins don't get shorted if the thing runs into a metal pole or something.

There's only a few printed parts which are derived from the original Rviz/Gazebo collada model of the Lynx.
These can be found lynx_kitten/stl in the intended printing orientation. Note that all four servos need one of their mounting plates sawed off in order to fit, but can then be lightly press-fit into the chassis. The side pods have holes thorugh which LED filaments can be wired and pulled though, then sealed in place with UV resin.
This is very approximate, mostly for my own future reference. It's not like there's anyone else mad enough to build this thing.
| Category | Qty | Item | Notes / Specs |
|---|---|---|---|
| Compute | 1 | Raspberry CM4 | with eMMC |
| 1 | 2.4 GHz antenna | 3 dBi, U.FL | |
| 1 | Ochin V2 carrier board | ||
| 10 | M2 Brass insert | 3 mm | |
| 1 | Cooling fan | 40 × 40 × 7 mm | |
| Sensors | 1 | BNO085 IMU | Bridge PS0 for UART-RVC mode |
| 1 | AMS1117 LDO regulator | 3.3 V | |
| 1 | VL53L7CX ToF sensor | ||
| Drive | 4 | STS3045M serial servo | |
| 1 | XIAO Seeed Studio Bus servo board | ||
| 1 | FPV DC-DC converter | 5 V, 3 A | |
| 4 | ZH 1.5 mm female connector | ||
| 1 | Electrolytic capacitor | 220 µF, 10 V | |
| 4 | 1/14 RC Crawler tires | 1.0", 54×17 mm, W1004-T1014 | |
| 16 | M3 hex head screws | M3 × 10 mm, low-profile | |
| Lighting | 2 | Red LED filament | 80 mm, same-end connector |
| 2 | White LED filament | 80 mm, same-end connector | |
| 4 | Resistor | 150 Ω, LED current limiting | |
| 1 | MX1508 H-bridge | ||
| 2 | Resistor | 10 kΩ, H-bridge pulldown | |
| Power Supply | 2 | 21700 cell | |
| 1 | HX-2S-D20 | BMS 2S protection board | |
| 3 | Nickel strip | battery tabbing | |
| 2 | 2.54mm JST 2-pin Connector | male + female, one for charging, one for main power | |
| 1 | Magnetic pogo pin connector | 5 pin, 2.8mm spacing | |
| 1 | XL0401 ideal diode | pogo pin isolation | |
| 1 | XL4015 CC/CV supply | configurable charger |
The Ochin Manual and Suggestions pdfs cover flashing and wiring setup. The SPI soldering pads need to be bridged on the back side to connect the PWM pins to the actual JST plug. Note that the EEPROM gets flashed using the SPI pins on the CM4, so that needs to be unplugged if any settings need changing.
Add to /boot/firmware/config.txt
[cm4]
# Enable the USB2 outputs on the IO board
dtoverlay=dwc2,dr_mode=host
[all]
# Switch to the external antenna.
dtparam=ant2
# Uarts
dtoverlay=disable-bt
dtoverlay=uart0
dtoverlay=uart5
#I2c
dtparam=i2c_arm=on,i2c_arm_baudrate=1000000
#PWM
dtoverlay=pwm-2chan,pin=18,func=2,pin2=19,func2=2
#I am speed
arm_freq=1800Nav deps:
sudo apt install ros-jazzy-navigation2 ros-jazzy-nav2-bringup ros-jazzy-nav2-minimal-tb*
pip install feetech-servo-sdk --break-system-packagesAudio stuff:
sudo apt install espeak-ng alsa-utils sox libsox-fmt-mp3cd ~/colcon_ws/src
git clone https://github.com/MoffKalast/lynx_kitten_ros
# Just like on the original Kinect Mk1 :)
git clone https://github.com/KaiserGabo/slam_gmapping_ros2.git
# For of adityakamath's VL53L7CX driver to add a PC2 publisher and LaserScan emulator
git clone https://github.com/MoffKalast/tof_imager_ros
# Visualization
git clone -b jazzy https://github.com/v-kiniv/rws.git
git clone -b ros2 https://github.com/MoffKalast/vizanti.git
cd ..
rosdep install -i --from-path src -y
colcon buildInstall the pwm-permissions.service to set up the PWM pins so the node can use them without root access.
#Wheels, sensors, visualization
ros2 launch lynx_kitten_bringup boot.launch.xml
#Slam_toolbox config, no scan matching with this emulated lidar lol
ros2 launch lynx_kitten_nav slam.launch.py
#AMCL, works decently for the most part
ros2 launch lynx_kitten_nav loc.launch.py
#Nav2, drives slowly but surely
ros2 launch lynx_kitten_nav nav2.launch.py

