Skip to content

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

@rodericktaylor

Description

@rodericktaylor

Bug report

Required Info:

  • Operating System:
    Ubuntu 22.04
  • Installation type:
    Source build (humble)
  • Version or commit hash:
    ros2/launch aed025e
  • DDS implementation:
    default, eprosima fastdds
  • Client library (if applicable):
    N/A

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.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions