ROSbot XL Docker setup on RPi5

Hello,

I’m trying to use a Raspberry Pi 5 as the SBC for my ROSbot XL. I’m running the stock Raspberry Pi OS (Raspbian) on the RPi5 and wanted to control the robot using the dockerized approach provided by Husarion.

I configured the Ethernet interface on the Raspberry Pi to the expected static address:

192.168.77.2/24

and connected the RPi directly to the ROSbot XL controller via Ethernet and the micro USB port.

I then tried to start the system following the docker-based workflow. Initially I used two separate terminals:

Terminal 1 – micro-ROS agent

docker run -it --rm --network host \
  husarion/micro-xrce-agent:v2.4.1 \
  MicroXRCEAgent udp4 --port 8888

Terminal 2 – ROSbot bringup

docker run -it --rm --network host --privileged \
  husarion/rosbot-xl:humble

Inside the container:

source /opt/ros/humble/setup.bash
source /ros2_ws/install/setup.bash
ros2 launch rosbot_xl_bringup bringup.launch.py

With this setup the system partially works:

  • /battery_state topic is published correctly

  • /cmd_vel can be published

However:

  • the robot does not move

  • /joint_states and /rosbot_xl_base_controller/odom remain empty

  • controller logs show warnings like:

Feedback message from motors wasn't received yet

I also tried flashing the STM32 firmware from the docker container using:

docker run --rm -it --privileged \
  --mount type=bind,source=/dev/ttyUSB0,target=/dev/ttyUSB0 \
  husarion/rosbot-xl:humble \
  flash-firmware.py -p /dev/ttyUSB0

The flash completed successfully, however nothing changed.

Can anyone help? I know that I’m not using the Husarion OS, but I thought that using Docker images is enogh.

Thanks, Mateusz

Hi @Mateusz_Norek,

Snap
For over a year, the primary distribution source for our software for ROSbot 3 and XL has been snap: https://snapcraft.io/rosbot

For both humble and jazzy:

# Instalation
sudo snap install rosbot --channel humble/jazzy

# Configuration
sudo /var/snap/rosbot/common/post_install.sh
sudo snap set rosbot driver.robot-model=rosbot/rosbot-xl

# Flashing
sudo rosbot.flash

# Running
sudo rosbot

and this is the recommended software version.

Docker

If you prefer to use Docker, that’s also an option. However, the latest images for ROSbot XL are located in the husarion/rosbot repository, not husarion/rosbot_xl.

Example:

husarion/rosbot:jazzy-0.18.8-20260316

compose.yaml can be found in rosbot_ros repository.

*microros is part of husarion/rosbot image no need to run it separately.

Thanks for the reply Rafał!
I went with the snap approach as the docker containers were giving me some fatal errors.

Just one more question - is the ROSbot XL: navigation snap working? snapcraft website says it hasn’t been updated for a while and it might be unmaintained.

Best regards!

I would suggest using the repo:

branch main. The latest changes are there, and the startup process has been greatly simplified.

Hey,

I used the above repo, but after listing the just recipies there isn’t a “start-navigation’ one available. I listed them:

~/rosbot-autonomy $ just
Available recipes:
connect-husarnet joincode hostname # connect to Husarnet VPN network
flash-firmware # flash the proper firmware for STM32 microcontroller in ROSbot 2R / 2 PRO
start-rosbot # start ROSbot 2R / 2 PRO autonomy containers
start-pc # start RViz visualization on PC
restart-nav2 # restart the navigation stack (and SLAM)
start-gazebo-sim # start Gazebo simulator with autonomy
start-webots-sim # start Webots simulator with autonomy
run-teleop # run teleop_twist_keybaord (host)
run-teleop-docker # run teleop_twist_keybaord (inside rviz2 container)
sync hostname=“${ROBOT_NAMESPACE}” password=“husarion” # copy repo content to remote host with ‘rsync’ and watch for changes

Have there been any changes to the procedure of using this repo? Or do I have to be connected to the Husarnet etc? I was hoping to run it on my plain RPi5 with Raspbian OS. Can you advise?

Thanks,

Mateusz

You didn’t change the branch after downloading the repository. Please switch to main branch.

Hello Rafał,

Good point, however after changing to branch main I have this problem:
zarzadca@admin:~/rosbot-autonomy $ just start-navigation
[+] down 1/1
:check_mark: Container demo-rosbot_navigation-1 Removed 10.1s
[+] pull 1/1
:check_mark: Image husarion/rosbot-autonomy:humble Pulled 17.4s
WARN[0000] Found orphan containers ([demo-orbbec-camera-1 demo-rviz-1]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
[+] up 1/1
:check_mark: Container demo-rosbot_navigation-1 Started 0.2s
sudo: husarion-webui.start: command not found
error: Recipe start-visualization failed with exit code 1
error: Recipe start-navigation failed with exit code 1

I would just like to perform SLAM and create a map. Don’t really need the UI. When I started digging deeper I fund this in the logs of the rosbot snap:
Could not get transform, ignoring laser scan!
Invalid frame ID “laser” passed to canTransform argument source_frame - frame does not exist
When I check the scan topic in a docker container I see data:
root@admin:/ros2_ws# ros2 topic echo /scan --once
header:
stamp:
sec: 1774734104
nanosec: 395401103
frame_id: laser
angle_min: -3.1241390705108643
angle_max: 3.1415927410125732
angle_increment: 0.0034828970674425364
time_increment: 5.100544876768254e-05
scan_time: 0.09175880253314972
range_min: 0.15000000596046448
range_max: 16.0
ranges:

  • 1.0579999685287476
  • 1.0579999685287476
  • 1.0579999685287476
  • 1.055999994277954
  • 1.055999994277954
  • 1.05999994277954

and so on, but I cannot really figure out whether I’m doing something wrong or something is not working.

Hi @Mateusz_Norek,

ROSbot XL is available in several configurations:
basic, telepresence, autonomy, manipulation, manipulation-pro

You’re most likely running the default configuration, which is basic, which doesn’t include the appropriate transformation for the lidar mounting location. You can switch configuration to autonomy using:

sudo snap set rosbot driver.configuration=autonomy

or manually specify the transformation if it’s not standard, e.g., using the tf_broadcaster node.

ros2 run tf2_ros static_transform_publisher --frame-id laser --child-frame-id cover_link <xyz & rpy arguments>

And please install husarion-webui. If you do not want to use it just stop it sudo husarion-webui.stop

Hi Rafał,

I changed the configuration, however there are still some problems. Regarding the webui, I have it installed:
~ $ snap list
Name Version Rev Tracking Publisher Notes
core22 20260128 2340 latest/stable canonical✓ base
core24 20260211 1500 latest/stable canonical✓ base
husarion-rplidar 2.1.4+git4.gd71b45d 40 humble/stable husarion✓ -
husarion-webui v1.1.0 136 humble/stable husarion✓ -
just 1.46.0 18 latest/stable lucabello classic
ros-humble-ros-base 0.1 108 latest/stable ubuntu-robotics-community✓ -
rosbot 0.15.1 223 humble/stable husarion✓ -
snapd 2.74.1 26383 latest/stable canonical✓ snapd

However I’m still getting that message about the webui:
zarzadca@admin:~/rosbot-autonomy $ just start-navigation
[+] pull 1/1
:check_mark: Image husarion/rosbot-autonomy:humble Pulled 9.4s
WARN[0000] Found orphan containers ([demo-orbbec-camera-1 demo-rviz-1]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
[+] up 1/1
:check_mark: Container demo-rosbot_navigation-1 Started 0.2s
sudo: husarion-webui.start: command not found
error: Recipe start-visualization failed with exit code 1
error: Recipe start-navigation failed with exit code 1.

And also when I check the transformation in the docker container I get this message:

zarzadca@admin:~ $ docker run -it --rm
–network host
-v /var/snap/rosbot/common:/var/snap/rosbot/common:ro
-v /var/snap/husarion-rplidar/common:/var/snap/husarion-rplidar/common:ro
ros:humble-ros-base
root@admin:/# source /opt/ros/humble/setup.bash
source /var/snap/rosbot/common/ros.env
ros2 run tf2_ros tf2_echo base_link laser
[INFO] [1774899850.959645571] [tf2_echo]: Waiting for transform base_link → laser: Invalid frame ID “base_link” passed to canTransform argument target_frame - frame does not exist

Can it be anyhow connected to how the lidar is plugged into the robot? There are two USB inputs, atm I have them both plugged in to the motherboard of the robot. Should I connect the data USB input into the RPi 5?

Best regards and big thanks for the help,

Mateusz

Hi @Mateusz_Norek,

I suspect this is currently a DDS or ROS distro issue.

Let me know if:

  1. Before executing “just start-navigation,” the robot driver is working, topics are visible, and you can control the robot.
  2. Are there any devices running ROS from another distro (including your laptop) available on the LAN?
  3. Check if all snaps are using the same middleware: sudo snap get <snap_name> ros.transport UDP or udp-lo (localhost) is recommended if you have ROS applications running on the network.
  4. I’m unable to reproduce your behavior. I’m sending a few screenshots so you can compare them to see if there are any differences.





Hello Rafał,

I get all the same messages as you, however there is also some override happening for the DDS client, I don’t know whether it is an issue:

zarzadca@admin:~ $ sudo snap logs rosbot
2026-03-31T17:48:42+02:00 rosbot.daemon[2786]: [micro_ros_agent-3] [1774972122.800291] warning | FastDDSMiddleware.cpp | create_participant_by_bin | Overriding Micro XRCE-DDS Client DOMAIN_ID | domain_id: 0
2026-03-31T17:48:42+02:00 rosbot.daemon[2786]: [micro_ros_agent-3] [1774972122.819480] info | ProxyClient.cpp | create_participant | participant created | client_key: 0x5E583ECE, participant_id: 0x000(1)
2026-03-31T17:48:42+02:00 rosbot.daemon[2786]: [micro_ros_agent-3] [1774972122.822174] info | ProxyClient.cpp | create_topic | topic created | client_key: 0x5E583ECE, topic_id: 0x000(2), participant_id: 0x000(1)
2026-03-31T17:48:42+02:00 rosbot.daemon[2786]: [micro_ros_agent-3] [1774972122.823370] info | ProxyClient.cpp | create_subscriber | subscriber created | client_key: 0x5E583ECE, subscriber_id: 0x000(4), participant_id: 0x000(1)
2026-03-31T17:48:42+02:00 rosbot.daemon[2786]: [micro_ros_agent-3] [1774972122.829904] info | ProxyClient.cpp | create_datareader | datareader created | client_key: 0x5E583ECE, datareader_id: 0x000(6), subscriber_id: 0x000(4)
2026-03-31T17:48:42+02:00 rosbot.daemon[2786]: [micro_ros_agent-3] [1774972122.833895] info | ProxyClient.cpp | create_topic | topic created | client_key: 0x5E583ECE, topic_id: 0x001(2), participant_id: 0x000(1)
2026-03-31T17:48:42+02:00 rosbot.daemon[2786]: [micro_ros_agent-3] [1774972122.836230] info | ProxyClient.cpp | create_publisher | publisher created | client_key: 0x5E583ECE, publisher_id: 0x000(3), participant_id: 0x000(1)
2026-03-31T17:48:42+02:00 rosbot.daemon[2786]: [micro_ros_agent-3] [1774972122.840002] info | ProxyClient.cpp | create_datawriter | datawriter created | client_key: 0x5E583ECE, datawriter_id: 0x000(5), publisher_id: 0x000(3)
2026-03-31T17:48:42+02:00 rosbot.daemon[2786]: [micro_ros_agent-3] [1774972122.841519] info | ProxyClient.cpp | create_topic | topic created | client_key: 0x5E583ECE, topic_id: 0x002(2), participant_id: 0x000(1)
2026-03-31T17:48:44+02:00 rosbot.daemon[2786]: [INFO] [launch.user]: All systems are up and running!

Regarding ROS running - to connect to the RPi 5 I use Tiger VNC viewer that can stream display from my RPi to the laptop, however you can say they are connected via the Wi-Fi that my laptop is streaming using hotspot to the RPi. I’m not using ROS on my laptop. I checked any other Docker containers with ROS on my RPi, however they are not running.

I believe this check is ok:
zarzadca@admin:~ $ sudo snap get rosbot ros
Key Value
ros.domain-id 0
ros.localhost-only
ros.namespace
ros.transport udp
zarzadca@admin:~ $ sudo snap get husarion-webui ros
Key Value
ros.domain-id 0
ros.localhost-only
ros.namespace
ros.transport udp
zarzadca@admin:~ $ sudo snap get husarion-rplidar ros
Key Value
ros.domain-id 0
ros.localhost-only
ros.namespace
ros.transport udp

This also looks fine:
zarzadca@admin:~ $ snap list
Name Version Rev Tracking Publisher Notes
core22 20260128 2340 latest/stable canonical✓ base
core24 20260211 1500 latest/stable canonical✓ base
husarion-rplidar 2.1.4+git4.gd71b45d 40 humble/stable husarion✓ -
husarion-webui v1.1.0 136 humble/stable husarion✓ -
just 1.46.0 18 latest/stable lucabello classic
ros-humble-ros-base 0.1 108 latest/stable ubuntu-robotics-community✓ -
rosbot 0.15.1 223 humble/stable husarion✓ -
snapd 2.74.1 26383 latest/stable canonical✓ snapd
zarzadca@admin:~ $ snap services
Service Startup Current Notes
husarion-rplidar.daemon enabled active -
husarion-webui.web-ui enabled active -
husarion-webui.web-ws enabled active -
rosbot.daemon enabled active -
rosbot.db-server enabled active -

This check was a little bit concerning:

zarzadca@admin:~ $ sudo snap get <snap_name> ros.transport
bash: snap_name: No such file or directory
zarzadca@admin:~ $ sudo snap get ros.transport
bash: rosbot: No such file or directory
zarzadca@admin:~ $ sudo snap get ros.transport
bash: husarion-rplidar: No such file or directory

When starting the just start-navigation I would always get this prompt: sudo: husarion-webui.start: command not found. Then I remembered that in order to perform sudo rosbot.stop or sudo rosbot.start I had to add /snap/bin for it to work. I went with this clue and changed the just file to: sudo /snap/bin/husarion-webui.start sudo /snap/bin/husarion-webui.stop. Then just start-navigation worked. Do you think it’s a problem with my environment?

Also when using the web ui I was getting this prompt that the map could not be saved as on the screen below:

Teleop and goal setting was working correctly - do you have any ideas/recomendations?

Big thanks,

Mateusz Norek

Hi @Mateusz_Norek,

Overriding Micro XRCE-DDS Client DOMAIN_ID
This is a desirable thing because the DOMAIN ID of the robot computer overwrites the DOMAIN ID of the microcontroller to enable proper communication.

/snap/bin issue
I see you found the solution and not demo is working. I haven’t encountered anything like this and it looks like a problem with wrong PATH or operating system issue. Check if /snap/bin is part of root PATH. Make test:

sudo su
echo $PATH # there should be path to: /snap/bin
exit

I suspect that for some unknown reason this path is missing and needs to be added.

sudo visudo # find `secure_path` and add to the end `:/snap/bin`

Out of curiosity, please tell me what operating system you have, if it is Husarion OS, check the version

echo $HUSARION_OS_VERSION

Hi Rafał,

As I mentioned in my first post in this chain, I’m running the stock Raspbian OS (I think it’s debian based and so it cannot run ROS2 natively). I guess it might be main source of the issue.

What about this error about saving the map? Is this part of the demo?

Best regards,

Mateusz