This is the digital home of L3X-Z (lɛɡz), a mixed electric/hydraulic hexapod robot.
All software components are built to leverage ROS2 Humble Hawksbill.
All real-time intravehicular communication is provided via Cyphal / CAN using 107-Arduino-Cyphal.
- A. Entinger (2023, January). Building a legged robot in 80 days: Lessons learned, tears shed, blood spilled.
cd $COLCON_WS/src
git clone https://github.com/107-systems/l3xz
cd $COLCON_WS
source /opt/ros/humble/setup.bash
colcon build --packages-select l3xz
L3X-Z Hexapod Robot
cd $COLCON_WS
. install/setup.bash
ros2 launch l3xz robot.py
Control Station
cd $COLCON_WS
. install/setup.bash
ros2 launch l3xz control.py
- l3xz_joy: ROS PS3 joystick driver for feeding
l3xz_teleop
node. - l3xz_teleop: Teleoperation for L3X-Z via PS3 joystick and ROS topics.
- l3xz_mapping: L3X-Z mapping stack.
- l3xz_system_monitor: This packages supervises the state of all of L3X-Z ROS sub-systems.
- ros2_cyphal_bridge: Interface between ROS and L3X-Z's Cyphal connected components.
- ros2_dynamixel_bridge: Interface between ROS2 and L3X-Z's Robotis Dynamixel servos.
- l3xz_gait_ctrl: Gait controller for the L3X-Z electric/hydraulic hexapod robot.
- l3xz_head_ctrl: Head controller for the L3X-Z electric/hydraulic hexapod robot.
- l3xz_pump_ctrl: Hydraulic pump controller for the L3X-Z electric/hydraulic hexapod robot.
- l3xz_valve_ctrl: ROS package for controlling L3X-Z's valve block.
- l3xz_frontend: Web based frontend for L3X-Z.
- l3xz-aux-ctrl-firmware: Firmware for the L3X-Z auxiliary controller (OpenCyphalPicoBase).
- l3xz-leg-ctrl-firmware: Firmware for the L3X-Z leg controller (l3xz-leg-ctrl-hardware).
- l3xz-radiation-sensor-firmware: Firmware for the L3X-Z radiation sensor (OpenCyphalPicoBase).
- l3xz-valve-ctrl-firmware: Firmware for the L3X-Z radiation sensor (OpenCyphalServoController12).
- l3xz-pressure-sensor-firmware: Firmware for the L3X-Z pressure sensor (OpenCyphalPicoBase).
- l3xz-leg-ctrl-hardware: L3X-Z Hexapod leg controller hardware design files.
- RS485-Power-Injector: Provide battery power to RS485 devices.
- CAN-Power-Injector: Provide power via CAN to all L3X-Z CAN devices.
- PowerPole-Distributor-12: 12 - way power distribution board with Anderson PowerPole® connectors.
- l3xz-cad: L3X-Z Hexapod hardware design files (3D model, printed parts, etc.).
- ROS: l3xz_openmv_camera: ROS driver for OpenMV camera.
- CAD: l3xz-hw-pan-tilt-head: CAD files for L3X-Z's pan/tilt color/thermal imaging head.
- Docker: l3xz-sw-pan-tilt-head: Software bundle for deployment on the Raspberry Pi Zero 2 of the pan/tilt head.
Component | IP |
---|---|
L3X-Z Raspberry Pi 4 (Ethernet) | 192.168.88.4 |
L3X-Z Pan/Tilt Head | 192.168.88.5 |
L3X-Z Raspberry Pi 4 (WiFi) | 192.168.88.6 |
L3X-Z Control PC (Ethernet) | 192.168.88.9 |
L3X-Z Control PC (WiFi) | 192.168.88.10 |
L01S Robot | 192.168.88.101 |
L01S Control | 192.168.88.102 |
- Edit
/etc/network/interfaces
:
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.88.6
netmask 255.255.255.0
- Check this script for keeping WiFi connected:
#!/bin/bash
SSID=$(/sbin/iwgetid --raw)
if [ -z "$SSID" ]
then
echo "`date -Is` WiFi interface is down, trying to reconnect" >> /home/pi/wifi-log.txt
sudo ifconfig wlan0 down
sleep 30
sudo ifconfig wlan0 up
fi
echo "WiFi check finished"
Component | IP | Notes |
---|---|---|
MikroTik "Base Station" | 192.168.88.2 (Bridge-IP) | (station bridge, nv2, pre-shared-key, l...) |
MikroTik "Robot" | 192.168.88.1 (Bridge-IP) | (bridge, nv2, pre-shared-key, l...) |
Robot Rasperry Pi (Ethernet) | 192.168.88.5 | |
Control PC (Ethernet) | 192.168.88.3 | |
Note: MikroTik RBMetal5SHPn. |
Install and configure yakut
:
. setup_yakut.sh
Dump all write-able registers into cyphal-config-raw.yaml
:
y rl 11,12,13,14,15,16,20,30,40,50,60 | y --yaml rb --only=mp > config/cyphal-config-raw.yaml
Format the YAML file for better human readability via pyyaml:
pip install pyyaml
python -c "import sys,yaml;yaml.dump_all(yaml.load_all(sys.stdin, yaml.Loader), sys.stdout)" < config/cyphal-config-raw.yaml | tee config/cyphal-config.yaml
Edit to file for your desired network configuration and write back:
y rb --file=config/cyphal-config.yaml
Store configuration into persistent storage and restart.
y cmd 11,12,13,14,15,16,20,30,40,50,60 store
y cmd 11,12,13,14,15,16,20,30,40,50,60 restart
Port ID | DSDL Type | Node ID | Type | Description |
---|---|---|---|---|
1001U | uavcan::si::unit::angle::Scalar_1_0 |
11 | Pub | Left/Front Femur Angle Actual / rad |
1002U | uavcan::si::unit::angle::Scalar_1_0 |
11 | Pub | Left/Front Tibia Angle Actual / rad |
1003U | uavcan::primitive::scalar::Bit_1_0 |
11 | Pub | Left/Front Tibia Tip Switch |
1004U | uavcan::si::unit::angle::Scalar_1_0 |
12 | Pub | Left/Middle Femur Angle Actual / rad |
1005U | uavcan::si::unit::angle::Scalar_1_0 |
12 | Pub | Left/Middle Tibia Angle Actual / rad |
1006U | uavcan::primitive::scalar::Bit_1_0 |
12 | Pub | Left/Middle Tibia Tip Switch |
1007U | uavcan::si::unit::angle::Scalar_1_0 |
13 | Pub | Left/Back Femur Angle Actual / rad |
1008U | uavcan::si::unit::angle::Scalar_1_0 |
13 | Pub | Left/Back Tibia Angle Actual / rad |
1009U | uavcan::primitive::scalar::Bit_1_0 |
13 | Pub | Left/Back Tibia Tip Switch |
1010U | uavcan::si::unit::angle::Scalar_1_0 |
14 | Pub | Right/Back Femur Angle Actual / rad |
1011U | uavcan::si::unit::angle::Scalar_1_0 |
14 | Pub | Right/Back Tibia Angle Actual / rad |
1012U | uavcan::primitive::scalar::Bit_1_0 |
14 | Pub | Right/Back Tibia Tip Switch |
1013U | uavcan::si::unit::angle::Scalar_1_0 |
15 | Pub | Right/Middle Femur Angle Actual / rad |
1014U | uavcan::si::unit::angle::Scalar_1_0 |
15 | Pub | Right/Middle Tibia Angle Actual / rad |
1015U | uavcan::primitive::scalar::Bit_1_0 |
15 | Pub | Right/Middle Tibia Tip Switch |
1016U | uavcan::si::unit::angle::Scalar_1_0 |
16 | Pub | Right/Front Femur Angle Actual / rad |
1017U | uavcan::si::unit::angle::Scalar_1_0 |
16 | Pub | Right/Front Tibia Angle Actual / rad |
1018U | uavcan::primitive::scalar::Bit_1_0 |
15 | Pub | Right/Front Tibia Tip Switch |
Port ID | DSDL Type | Node ID | Type | Description |
---|---|---|---|---|
2001U | uavcan::primitive::scalar::Bit_1_0 |
20 | Pub | Emergency Stop |
2002U | uavcan::primitive::scalar::Integer8_1_0 |
20 | Sub | Light Mode |
Port ID | DSDL Type | Node ID | Type | Description |
---|---|---|---|---|
3001U | uavcan::primitive::scalar::Natural16_1_0 |
30 | Pub | Radiation Tick Count |
Port ID | DSDL Type | Node ID | Type | Description |
---|---|---|---|---|
4001U | uavcan::primitive::array::Natural16_1_0 |
40 | Sub | Servo Pulse Width / us |
Port ID | DSDL Type | Node ID | Type | Description |
---|---|---|---|---|
5001U | reg::udral::service::common::Readiness_0_1 |
50 | Sub | Readiness |
5002U | reg::udral::service::actuator::common::sp::Scalar_0_1 |
50 | Sub | RPM Setpoint |
Port ID | DSDL Type | Node ID | Type | Description |
---|---|---|---|---|
6001U | uavcan::si::unit::pressure::Scalar_1_0 |
60 | Pub | Hydraulic Circuit #0 Pressure |
6002U | uavcan::si::unit::pressure::Scalar_1_0 |
60 | Pub | Hydraulic Circuit #1 Pressure |