ros2 / launch

Tools for launching multiple processes and for writing tests involving multiple processes.
Apache License 2.0
124 stars 139 forks source link

Substitutions in XML are not expanded intuitively when used for the purpose of executing programs. #710

Open rodericktaylor opened 1 year ago

rodericktaylor commented 1 year ago

Bug report

Required Info:

Steps to reproduce issue

add_model_launch.xml

<launch>
  <arg name="initial_pose" default="-x 0.0 -y 0.0 -z 0.2"/>

  <arg name="model_name" default="robot"/>

  <arg name="model_type" default="robot"/>

  <node pkg="ros_gz_sim" exec="create" name="$(var model_name)_spawner"
    args="-name $(var model_name) -param robot_description $(var initial_pose)">
    <param name="robot_description"
      value="$(command 'xacro $(find-pkg-share robot_gazebo)/models/$(var model_type)/model.urdf.xacro')"/>
  </node>

</launch>

ros2 launch my_package add_model_launch.xml

Expected behavior

When the arguments to create are processed, $(var initial_pose) is expanded to [...'-x','0.0','-y','0.0','-z','0.2'] (i.e. multiple list items) for command execution. This is so that the create node executable recognises the command arguments.

Additionally, when executed with the -d flag, launch should log the command as an array of strings, as this is what is supplied to the operating system call. Example provided below.

process details: cmd=['/path/to/ros_gz_sim/lib/ros_gz_sim/create','-name','robot','-param','robot_description','-x','0.0','-y','0.0','-z','0.2','--ros-args','-r','__node:=robot_spawner','--params-file','/tmp/launch_params_958ns6s1'], cwd='None', custom_env?=True

Actual behavior

When the arguments to create are expanded $(var initial_pose) is expanded to [...'-x 0.0 -y 0.0 -z 0.2'] (.i.e a single list item) for command execution. The create command does not recognise these as a single argument string.

I had to hack the code to force it to log the command being executed. There is an implementation there, but I could not find how to turn it on. This implementation logs the command executed as a joined string, which hid this issue.

process details: cmd='/path/to/ros_gz_sim/lib/ros_gz_sim/create -name robot -param robot_description -x 0.0 -y 0.0 -z 0.2 --ros-args -r __node:=robot_spawner --params-file /tmp/launch_params_958ns6s1', cwd='None', custom_env?=True

Additional information

A work around is to ensure substitutions expand to strings without spaces in them.

i.e.

  <arg name="initial_pose_x" default="0.0"/>
  <arg name="initial_pose_y" default="0.0"/>
  <arg name="initial_pose_z" default="0.2"/>

I suspect this may also be an issue for yaml, but did not test.

wjwwood commented 1 year ago

I just ran into this myself, this is my proposed fix, but right now it causes test failures, so I'll need to look into it more:

https://github.com/ros2/launch/pull/711