Hey everyone! 
Over the past few months while working with Zenoh, my team kept running into the same issue, it was hard to see what was actually flowing through the system when debugging live traffic.
So I ended up building a small tool and ended calling it Carto. 
Itās basically just a Zenoh stream inspector that lets you:
-
subscribe to streams by key expression
-
filter messages live
-
decode payloads (JSON, text, binary, protobuf)
-
publish test messages back onto the bus
We started using it internally while debugging messages in Zenoh and it turned out to be pretty useful, so I cleaned it up and open sourced it.
Feel free to try it out!
https://github.com/derek-diaz/Carto
4 Likes
Hi, and thank you for open-sourcing this tool!
Does it support āros2/rmwā communication? Or is it a āvanillaā zenoh tool?
Right now Carto focuses on native Zenoh traffic rather than ROS2/RMW directly.
If ROS2 is running over Zenoh (for example through zenoh-bridge-ros2dds or rmw_zenoh), the underlying Zenoh key expressions should still appear in Carto since it observes the Zenoh network itself.
Explicit ROS2 awareness (nodes, topics, services, etc.) isnāt implemented yet, so for now the tool is mainly aimed at vanilla Zenoh deployments. 
1 Like
This is great, thank you! I was actually looking for something like this literally last week. Thereās tools like this for MQTT, but I couldnāt find one for Zenoh.
If I may make one request: It would be great to make this available as a since Docker image (Zenoh router excluded) through Docker Hub or the GitHub Container registry so that people can launch it with a single command like this for MQTT Explorer.
2 Likes
Definitely something I was looking for.
I gave it a try. Here are my conclusions:
- It works with ROS 2 and with Shared Memory
- There is still some issues with large messages and heavy payloads. I wasnāt able to run my whole stack on it (the UI crashes totally). I opened an issue on your Github
- We need a custom script to decode payload if I understand correctly
- You canāt use it with the router provided by rmw_zenoh. You need to use the pure zenohd package (because you need to add a plugin and thatās not possible with rmw_zenoh router)
Great work, thanks for this ! I definitely keep an eye on this 
Thanks a lot for trying it out and for the detailed feedback!
I just released v0.4.0, which should address the crashing issue with large payloads. While testing earlier versions I was mostly working with PLC messaging in our system, which tends to produce very small messages. Once I subscribed to camera frame messages (much larger payloads) I was able to reproduce the crash almost immediately.
The new version handles those cases much better.
For payload decoding, Carto currently supports protobuf, since thatās what we use in our projects. The workflow is pretty simple, you can paste the contents of a .proto file or drag-and-drop the definitions in the app settings page and it should be able to decode the messages. I also added support for multiple protobuf definitions per subscription, since I ran into cases where some messages (like PackML in my tests) werenāt being decoded correctly with a single schema.
Regarding rmw_zenoh, thatās something I still need to investigate further. Right now our internal projects use pure Zenoh directly, so I havenāt tested Carto much with the ROS 2 stack yet. Improving that integration is definitely something Iād like to explore.
If you find any other issues, be sure to let me know. 
Thatās a great idea. Right now Carto is packaged as a desktop app using Electron, but making it available as a Docker image would definitely make it much easier to try out. Iāll look into it. 
2 Likes