During our transition to ROS 2 and the build of our new robot Athena, we’ve encountered quite a few issues both in ROS 2, with the middleware, but also with rqt.
For instance, when testing our manipulator, we have noticed that the ControllerManager in rqt gives you around 20 seconds of time before the application freezes completely when used over WiFi.
This is not the only issue, but that’s also not the point of this post.
You could chime in and say, “Hey, you could’ve fixed that and made a PR ”, and you would be right, and we did this in several instances.
But I’m not a fan of using Python for UI, and this presented the perfect opportunity to demonstrate how easy it is to create a nice ROS interface using my QML ROS 2 module.
So, instead, I’ve spent that time quickly developing a modern alternative, fixing all the issues that bothered me in rqt.
Hello RQml
Please note that this is still in beta and not all plugins exist yet.
You are very welcome to point me to the ones that you think would be great to have, or even implement them yourself and make a PR
Currently, the following plugins are available:
ActionCaller: Interface for calling ROS 2 Actions.
Console: A log viewer for ROS 2 messages.
ControllerManager: Manage and switch ROS 2 controllers.
ImageView: View camera streams and images.
JointTrajectoryController: Interface for sending joint trajectory commands.
MessagePublisher: Publish custom ROS 2 messages.
RobotSteering: Teleoperation tool for mobile robots.
ServiceCaller: Interface for calling ROS 2 Services.
Notably, the ImageView now also uses transparency for depth image values that are not valid (instead of using black, which also represents very close values).
As always, I hope this is of interest to you, and I would love to hear from you if you build something cool with this
If it wasn’t, my little turtle buddy will be very disappointed because he already considered you a special friend
Thanks
Good question! It has almost all the plugins I personally use, which is why I’m very open to suggestions on what hidden gems I may have overlooked.
The only thing currently missing for me is dynamic reconfigure for the parameters.
Unfortunately, I am currently very short on time, so it might take a while for me to implement that one, as it is slightly more complex than the average plugin.
Personally, I would:
Look at it not from a perspective of porting the code, but look at the functionality and what works, what doesn’t. QML offers many more opportunities for nicer interactions while remaining quite a bit simpler to work with.
I have added an example plugin package that can be copied to get the boilerplate structure and there’s also a PLUGIN_DEVELOPMENT.md that explains how the plugin mechanism works.
To get started with QML + ROS, I recommend reviewing the examples in the QML6 ROS 2 Plugin.
Please note that RQml is using Qt 6, and it is essential to develop for this version. When not using the --qt=qt6 switch in qmlscene, for example, it may default to Qt5, where some minor things do not work the same.
These examples showcase, in very small and simple files, how to use the ROS integration. The plugin also features a readthedocs documentation with lots of information on the available methods and classes.
For QML controls and layouts, the Qt documentation is a really great resource.
Once you’re comfortable with that, you can also explore the shipped default plugins for more advanced techniques, such as splitting into reusable components, using singletons, and shipping custom QML modules with C++ bindings.
Now the sky is the limit; create your own plugin widget and fill it with functionality.
RQml also supports a Dev Mode (located in the Help menu) where the plugins are reloaded whenever the source file changes. That’s still somewhat experimental and will only work with symlinked workspaces without requiring a rebuild on each change, but it can also speed up the development process.