ros2 / ros2/launch

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

Open
#710 1 comment 0 reactions 1 assignee View on GitHub

@wjwwood is already working on this.

Since Jun 15, 2023.

Dominant language
Python
Stars
155
Forks
182
Avg merge
2d 14h
Merged PRs (30d)
6

Description

Bug report

Required Info:

  • Operating System:
    Ubuntu 22.04
  • Installation type:
    Source build (humble)
  • Version or commit hash:
    ros2/launch aed025e04e0b143362c69bf29a67b2ffff4c59ee
  • 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.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.