Hey, I am new here on Discourse, but not new to ROS. I am a long-time “power user” of ROS1, coming from the field of multirotor aerial vehicles at the MRS group, CTU in Prague. Here is our code base if you are interested: github.com/ctu-mrs/mrs_uav_system. We are slowly getting to a point where others start to ask about ROS2 support by our system, so I took a peek into it.
I started from the basics, first trying the essential building blocks before attempting any serious application. I immediately stumbled upon difficulties and major problems. I already realized that ROS2 is not “the second version of ROS”, but more of another variant of a similar system and, therefore, the concepts and design patterns might not be transferable. Anyway, I approach the transition from the point of view of a ROS1 user, since we have tens of thousands of lines of code build around the ROS1 design.
I was told that you guys here might appreciate my feedback, so here is my repository with the basic examples (Foxy): github.com/ctu-mrs/ros2_examples. The README inside covers all the basics on my list that should be probed before going further. The README also contains my impressions and notes regarding the differences and problems. Please, feel free to collaborate, any help will be appreciated. It took me a relatively long time to investigate those basics, during which I found the existing documentation and examples difficult to adhere to. Truthfully, I might have used stack overflow more during the last week than during the past five years. More in the README.
TL;DR from the repo:
- How to make services synchronous? Services in ROS1 were completely synchronous. I concede that I might want asynchronous services in like 5% of the time, but that can be done easily with some threading or one-shot timers. But making all services asynchronous makes stuff difficult to port from ROS1.
- Multithreading with timers seems to be broken.
- Timers seem to struggle to produce a stable rate with the multi-threaded executor.
- Why are most demos and examples not using the “component” architecture which is promoted in the ROS2 docs? We are already nodeleting everything in ROS1, so seeing
main()in the ROS2 demos seems very strange.