-
Where the hell do I find complete docs for XML launch files?
- https://design.ros2.org/articles/roslaunch_xml.html seems to be the canonical doc
- but XSD schemata are machine-readable, not human-readable
- also, it is missing lots of stuff (launch_ros.actions), so e.g.
push_ros_namespaceis not mentioned in this doc
- https://docs.ros.org/en/rolling/How-To-Guides/Migrating-from-ROS1/Migrating-Launch-Files.html
- this is a quite good source, but it isn't comprehensive
- https://design.ros2.org/articles/roslaunch_xml.html seems to be the canonical doc
-
use_sim_timehell (i.e. no support for global parameters)- https://discourse.ros.org/t/ros2-use-sim-time-leads-to-inconsistent-clocks/42030/2
<set_param>could partially remedy this (but each separately launched file has to set it)- Why can't ROS 2 just require a
parameter_blackboardnode foruse_sim_time?
-
$(dirname)is broken and unreliable (ros2/launch#618) -
ugly testing for nonempty XML launch args (
$(eval 'bool(\'$(var var_name)\')')) -
in Python launch,
launch_argumentsofIncludeLaunchDescriptioningest booleans as'true'/'false', i.e. strings!launch_arguments=[('use_sim_time', 'true'),]- and the error you get if you pass an actual boolean is super cumbersome
-
cannot use parameters which are lists of dicts or other non-trivial types (ros2/ros2#1380)
- the error you get is difficult to understand
-
I haven't found any docs on writing custom launch actions (and it took me quite some time to get a little into it)
- what's missing at minimum is a doc that would tell what are all the steps needed to register the action
- setup.cfg, make and install as a Python package even if it's a C++ one otherwise, add the decorator...
- what's missing at minimum is a doc that would tell what are all the steps needed to register the action
-
No XSD schema for launch_ros with all its actions, only for launch base:
- ros2/launch#392
- launch schema is at https://raw.githubusercontent.com/ros2/design/gh-pages/articles/specs/launch.0.1.1.xsd
- no official example on how to use the schema in launch files
-
Setting
<arg value>in an<include>will also overwrite the arg in the rest of the launch file (ros2/launch#620 (comment))- Workaround: wrap each
<include>within its own<group>. - It is described in the migration guide, but its meaning is not really obvious to people who want to dive into ROS 2 without prior knowledge:
-
Available in ROS 1, included content was scoped. In ROS 2, it’s not. Nest includes in group tags to scope them.
-
- Workaround: wrap each
-
newly created launch files are not detected until recompilation even when using symlinked directories (which was very convenient ROS 1 behaviour)
-
creating
Image,PointCloud2and other messages with large arrays can be extremely slow- https://stackoverflow.com/a/71940633/1076564
- workaround: assign
msg._datainstead ofmsg.data - alternative (better) workaround: launch Python with
-O: https://docs.python.org/3/using/cmdline.html#cmdoption-O- how to do that?
#!/usr/bin/env python -O?
- how to do that?
-
the FastRTPS interface is extremely unperformant, which is unfortunate given that it's somehow the default RMW (https://discourse.ros.org/t/rmw-zenoh-binaries-for-rolling-jazzy-and-humble/41395/13)
-
I haven't found any complete documentation about
qos_overridesparameter. There are some bits and pieces, but e.g. no docs page explains to you thatdeadlineis in nanoseconds. -
tutorials and most tools hardcode "10" as the default QoS for subscribers which means reliable transport is required, and unreliable publishers cannot send data to them since they're not compatible; subscribers should always be set to best effort if not specified otherwise
- this is an annoyance where the QoS is redefinable on the fly (e.g. Rviz2), but a major problem in cases of 3rd party packages where connecting unreliable topics just isn't possible without forking the codebase
-
having a volatile and transient local publisher on the same topic makes them impossible to receive properly by the same subscriber, because those two durability policies aren't compatible
- conceptually one would want a subscriber to connect to a specified topic without any extra information given, since that information can be inferred from the publisher, and if there's multiple publishers, the broadest possible compatibility config should be chosen
-
subscribers should not declare topic QoS unless strictly specified, but adapt to the first publisher instead
-
ros2 topic hzis unusable under FastRTPS because it is in Python and it deserializes all messages (https://discourse.ros.org/t/rmw-zenoh-binaries-for-rolling-jazzy-and-humble/41395/18)- maybe got fixed (or at least improved) by ros2/ros2cli#1005
-
tab completion is slower and overly verbose in selection, the pregenerated message content is incorrect and cannot be used as-is
-
CLI tools silently ignore
RMW_IMPLEMENTATIONvariable and only talk to the running daemon. So if you first launch something with one RMW and then want to run something else with another RMW, all CLI tools still silently use the first RMW. To solve that, callros2 daemon stop. -
ros2 node killdoes not exist because of endless bickering around killing composite nodes- the bar for doing better than
ps aux | grep nodename | awk '{print $2}' | xargs kill -9which we need to resort to like cavemen is extremely low, at the very least ros2 should contain a cli link to something roughly equivallent that tracks node PIDs at least as reliably and pack it into a cli command for convenience - idea for a more proper approach: every node could implicitly (see: without ANY extra declarations) be lifecycle node in active state by default and implement only the deactivate trigger that allows it to be called by node kill, and that could simply stop rlcpy/rclcpp and call the shutdown hook to perform basic cleanup, proper lifecycle nodes could then override this default behaviour if needed
- this would allow killing nodes cleanly with while maintaining backwards compatibility
- it would let you kill nodes on different machines
- it could stop individual composite nodes while leaving the process intact for the rest
- containers could be killed themselves (while calling all nodes contained within recursively) as a way to just remove the entire set
- the bar for doing better than
-
ros2cd packagenamehas been added as a 3rd party tool but has yet to be rolled into colcon tools
- ament_python packages contain a lot of unnecessary boilerplate: https://discourse.ros.org/t/why-is-there-no-ament-python-simple/42591
what is a preferred package type for message-only packages? do they need to use ament_cmake? this is a quite common task, so it'd be great to have this documented
- server can be launched as a composable node, but the client can't (need to use
Executable) - topic bridges cannot be launched as composable nodes with the bridge specification passed as arg/parameter (only through YAML config)
- there is no way how the YAML config of a bridge could be parametrized by world and robot name, which makes these configs practically useless (gazebosim/ros_gz#717)
- topic bridges do not allow easy setting of QoS profiles (but that can be overcome by setting qos_overrides manually)
- quite important for
/clockbridge!
- quite important for
- it is quite difficult to understand how changing a sensor frame_id works, because you have to use
gz_frame_id, but that is an undocumented SDF element.- SDF defines
frame_id, but that doesn't change the ROS frame ID
- SDF defines
<export>ing Gazebo resource paths in package.xml no longer works- This needs to be newly implemented using ament hooks and DSV files; the official project template is wrong (gazebosim/ros_gz_project_template#43) and confusing (gazebosim/ros_gz_project_template#44)
component_containeris single-threaded (it even rins its own load/unload callbacks on the single thread)! Usecomponent_container_mtorcomponent_container_isolated.
-
no support for explicit
--extendas in catkin_tools: colcon/colcon-core#393 -
default behaviour requires recompiling for every file change since directories are deep copied and it seems like most people end up using
--symlink-installeventually and despair and suffer until they learn of it, so it would make sense to swap the two, making linking the default, and e.g.--no-symlinkto swap back to the current default
- agent only supports FastRTPS (notably, doesn't support Zenoh): micro-ROS/micro-ROS-Agent#243