launch xacro参数传递


参考: https://blog.csdn.net/aazjt/article/details/70920087

roslaunch 是如何解析的 launch

https://wiki.ros.org/action/fullsearch/roslaunch/XML?action=fullsearch&context=180&value=linkto%3A"roslaunch%2FXML"

Includes are processed in depth-first traversal order. Tags are evaluated serially and the last setting wins. Thus, if there are multiple settings of a parameter, the last value specified for the parameter will be used.
include的文件是深度优先解析,tag是顺序解析,tag值是最终被设置那个值。

arg

arg相当于launch的局部变量,default说明此变量可修改,value说明变量的值不可被修改。

// 定义
<arg name="root" default="$(find shell_car)"/>
// 使用 $(arg var_name)
<arg name="urdf_robot_file" value="$(arg root)/urdf/smart.xacro"/>
<?xml version="1.0" encoding="UTF-8"?>
<launch>
	<arg name="root" default="$(find shell_car)"/>
	<include file="$(arg root)/launch/spawn_xacro.launch">
		<arg name="x" value="0.0"/>
		<arg name="y" value="0.0"/>
		<arg name="z" value="0.0"/>
		<arg name="urdf_robot_file" value="$(arg root)/urdf/smart.xacro"/>
		<arg name="robot_name" value="smart"/>
	</include>
</launch>

param

paramlaunch向可执行程序传递参数的方法。

group

group包围的节点,发布的parameters、topics、services均会被加上<命名空间>/前缀。

<group ns="命名空间">
...
</group>

launch之间传递参数

好像没有什么好的办法
1 https://answers.ros.org/question/220296/roslaunch-forwarding-args-to-included-launch-file/

2 wiki.ros.org/action/fullsearch/roslaunch/XML?action=fullsearch&context=180&value=linkto%3A"roslaunch%2FXML"

3 https://blog.csdn.net/cookie909/article/details/79700354

两种可行的方法:

  1. 利用inlcude的文件内部argdefault,外面override一下,要在include标签内重写。(下面的例子是这样的)

    inchude 标签内的arg是给被includelaunch文件提供的arg,不是为本launch文件提供的。且被includelaunch文件不能继承上层的arg

    // 最外层的 launch文件
    <?xml version="1.0" encoding="UTF-8"?>
    <launch>
    	<arg name="pkg_name" value="$(find shell_car)"/>
    	<include file="$(arg pkg_name)/launch/spawn_xacro.launch">
    		<arg name="root" value="$(arg pkg_name)"/> // 外层覆盖掉内层的value
    		<arg name="x" value="0.0"/>
    		<arg name="y" value="0.0"/>
    		<arg name="z" value="0.0"/>
    		<arg name="urdf_robot_file" value="$(arg pkg_name)/urdf/smart.xacro"/>
    		<arg name="robot_name" value="smart"/>
    	</include>
    </launch>
    // 里层的 launch文件
    <?xml version="1.0" encoding="UTF-8"?>
    <launch>
    	<arg name="root" default=""/> // 内层定义了‘root’ 默认值随意,反正外层的include标签内都会修改它
    	<arg name="x" default="0.0"/>
    	<arg name="y" default="0.0"/>
    	<arg name="z" default="0.0"/>
    	<arg name="urdf_robot_file" default=""/>
    	<arg name="robot_name" default=""/>
    	<param name="robot_description" command="$(find xacro)/xacro '$(arg urdf_robot_file)' roboname:='smart' root:=$(arg root)"/>
    	<node name="spawn_model" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen" args="-urdf -x $(arg x) -y $(arg y) -z $(arg z) -model $(arg robot_name) -param robot_description"/>
    </launch>
    
  2. 利用optenv 设置环境变量,试过不成功

    gg
    

launch中向xacro传递参数,并解析xacro

launch中向xacro传递参数的方法,xacro是一个可执行程序或者脚本,launch通过param可以向其传递参数。

name必须是这个robot_description,可执行程序xacro自动解析这个参数,
调用xacro.py解析xacro文件,并且传入ns参数,
在xacro文件中可以通过$(arg ns)来获取传入的参数,
将解析出来的urdf模型设置给<命名空间>/robot_description参数。

<param name="robot_description"
        command="$(find xacro)/xacro.py
        $(find battlebot)/urdf/$(arg model) ns:=<命名空间>"
/>

launch中向gazebo添加模型

<node name="spawn_model" pkg="gazebo_ros" 
		type="spawn_model" respawn="false" output="screen" 
		args="-urdf -x $(arg x) -y $(arg y) -z $(arg z) 
			-model $(arg robot_name) 
			-param robot_description"
/>

xacro

添加xacro属性:<xacro:property name="local_param" value="$(arg launch_param)" />
解析本地参数: <link name = "${local_param}">

一个例子

shell命令

// 一个窗口
source devel/setup.bash
roslaunch gazebo_ros empty_world.launch

// 另一个窗口
source devel/setup.bash
roslaunch shell_car spawn_car.launch

所有文件

2个launch文件,1个xacro文件,xacro文件用到了2个3D模型库(这里没给出)。

launch/spawn_car.launch 运行的是这个文件
launch/spawn_xacro.launch 解析xacro文件,并将模型加入gazebo
urdf/smart.xacro 模型文件xacro,定义了关节链接关系等。

目录结构如下:
在这里插入图片描述

launch/spawn_car.launch

<?xml version="1.0" encoding="UTF-8"?>
<launch>

	<!-- 'pkg_name' is package name, there is the path of 'shell_car' -->
	<arg name="pkg_name" value="$(find shell_car)"/>
	<include file="$(arg pkg_name)/launch/spawn_xacro.launch">
	
		<!-- arg 'root' value is modified here, there is it's final value -->
		<arg name="root" value="$(arg pkg_name)"/>
		<arg name="x" value="0.0"/>
		<arg name="y" value="0.0"/>
		<arg name="z" value="0.0"/>
		<arg name="urdf_robot_file" value="$(arg pkg_name)/urdf/smart.xacro"/>
		<arg name="robot_name" value="smart"/>

	</include>

</launch>

launch/spawn_xacro.launch

<?xml version="1.0" encoding="UTF-8"?>

<launch>
	<!-- 'root' in '$(arg root)' is from launch/spawn_car.launch 
		Note:
			the arg 'root' is default, 
			because it's not the final last here, it is modified by 'spawn_car.launch'
			‘root’ must be defined here, included file cannot inherit upper launch args.
	--> 
	<arg name="root" default="" />
	<arg name="x" default="0.0"/>
	<arg name="y" default="0.0"/>
	<arg name="z" default="0.0"/>

	<arg name="urdf_robot_file" default=""/>
	<arg name="robot_name" default=""/>
	
	<!-- <param name="robot_description" command="$(arg urdf_robot_file)"/> -->
	<param name="robot_description" command="$(find xacro)/xacro '$(arg urdf_robot_file)' roboname:='smart' root:=$(arg root)"/>

	<node name="spawn_model" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen" args="-urdf -x $(arg x) -y $(arg y) -z $(arg z) -model $(arg robot_name) -param robot_description"/>

</launch>

urdf/smart.xacro

<?xml version="1.0" ?>

<robot name="$(arg roboname)" xmlns:xacro="http://www.ros.org/wiki/xacro">
  <!-- 'root_pkg' is used 3D model file path,
    pkg_name/urdf/smart.xacro , arg 'root' from launch/spawn_xacro.launch -->
  <xacro:property name="root_pkg" value="$(arg root)"/>
  <xacro:property name="PI" value="3.1415926835897931"/>

  <!-- base -->
  <xacro:property name="base_length" value="2.695"/>
  <xacro:property name="base_width" value="0.68"/>
  <xacro:property name="base_height" value="1.370"/>
  <xacro:property name="base_collision_height" value="0.875"/>
  <xacro:property name="base_mass" value="956"/>
  <xacro:property name="base_mass_ixx" value="343"/>
  <xacro:property name="base_mass_iyy" value="728"/>
  <xacro:property name="base_mass_izz" value="772"/>

  <!-- rear tyre -->
  <xacro:property name="rear_tyre_x" value="0.945"/>
  <xacro:property name="rear_tyre_y" value="0.642"/>
  <xacro:property name="rear_tyre_r" value="0.3"/>
  <xacro:property name="rear_tyre_length" value="0.165"/>
  <xacro:property name="rear_tyre_mass" value="20"/>
  <xacro:property name="rear_tyre_mass_ixx" value="0.5"/>
  <xacro:property name="rear_tyre_mass_iyy" value="0.9"/>
  <xacro:property name="rear_tyre_mass_izz" value="0.5"/> 

  <!-- front tyre -->
  <xacro:property name="front_tyre_x" value="0.923"/>
  <xacro:property name="front_tyre_y" value="0.642"/>
  <xacro:property name="front_tyre_r" value="0.3"/>
  <xacro:property name="front_tyre_length" value="0.165"/>
  <xacro:property name="front_tyre_mass" value="20"/>
  <xacro:property name="front_tyre_mass_ixx" value="0.5"/>
  <xacro:property name="front_tyre_mass_iyy" value="0.9"/>
  <xacro:property name="front_tyre_mass_izz" value="0.5"/>  

  <!-- steering -->
  <xacro:property name="str_angle" value="0.6"/>    
  <xacro:property name="str_length" value="0.01"/>
  <xacro:property name="str_radius" value="0.1"/>
  <xacro:property name="str_mass" value="5"/>
  <xacro:property name="str_mass_ixx" value="0.012"/>
  <xacro:property name="str_mass_iyy" value="0.025"/>
  <xacro:property name="str_mass_izz" value="0.012"/> 

  <!--Car Body-->
  <link name="base_link">
    <collision>
      <origin xyz="0 0 ${base_collision_height}" rpy="0 0 0"/>  
      <geometry>
        <box size="${base_length} ${base_width} ${base_height}"/>
      </geometry>
    </collision>

    <visual>
      <origin xyz="0.05 0 ${base_collision_height}" rpy="0 0 ${PI/2}"/>  
      <geometry>
        <mesh filename="${root_pkg}/meshes/vehicle_body.dae"/>
        <!-- <box size="${base_length} ${base_width} ${base_height}"/> -->
      </geometry>
    </visual>
  </link>

  <joint name="inertial_joint" type="fixed">
    <parent link="base_link"/>
    <child link="main_mass"/>
    <origin xyz="0 0 0" rpy="0 0 0"/>
  </joint>  

  <link name="main_mass" type="fixed">
    <inertial>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <mass value="${base_mass}"/>
      <inertia
        ixx="${base_mass_ixx}"  ixy="0.000000"  ixz="0.000000"
        iyy="${base_mass_iyy}"  iyz="0.000000"
        izz="${base_mass_izz}"/>
    </inertial>
  </link>


  <!--Rear Right Wheel-->
  <joint name="rear_right_wheel_joint" type="continuous">
    <parent link="base_link"/>
    <child link="rear_right_wheel_link"/>
    <origin xyz="${-rear_tyre_x} ${-rear_tyre_y} ${rear_tyre_r}" rpy="0 0 0"/>
    <axis xyz="0 1 0"/>
    <dynamics damping="0.1"/>
    <limit effort="100000" velocity="10000" />
    <joint_properties damping="0.0" friction="0.0" />
  </joint>

  <link name="rear_right_wheel_link">
    <collision>
      <origin xyz="0 0 0" rpy="${PI/2} 0 0"/>
      <geometry>
        <cylinder length="${rear_tyre_length}" radius="${rear_tyre_r}"/>
      </geometry>
    </collision>

    <visual>
      <origin xyz="0 0 0" rpy="0 0 -${PI/2}"/>
      <geometry>
        <mesh filename="${root_pkg}/meshes/wheel.dae"/>
        <!-- <cylinder length="${rear_tyre_length}" radius="${rear_tyre_r}"/> -->
      </geometry>
    </visual>

    <inertial>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <mass value="${rear_tyre_mass}"/>
      <inertia
        ixx="${rear_tyre_mass_ixx}"  ixy="0.000000"  ixz="0.000000"
        iyy="${rear_tyre_mass_iyy}"  iyz="0.000000"
        izz="${rear_tyre_mass_izz}"/>
    </inertial>
  </link>

  <!--Rear Left Wheel-->
  <joint name="rear_left_wheel_joint" type="continuous">
    <parent link="base_link"/>
    <child link="rear_left_wheel_link"/>
    <origin xyz="${-rear_tyre_x} ${rear_tyre_y} ${rear_tyre_r}" rpy="0 0 0"/>
    <axis xyz="0 1 0"/>
    <dynamics damping="0.1"/>
    <limit effort="100000" velocity="10000" />
    <joint_properties damping="0.0" friction="0.0" />
  </joint>

  <link name="rear_left_wheel_link">
    <collision>
      <origin xyz="0 0 0" rpy="${PI/2} 0 0"/>
      <geometry>
        <cylinder length="${rear_tyre_length}" radius="${rear_tyre_r}"/>
      </geometry>
    </collision>

    <visual>
      <origin xyz="0 0 0" rpy="0 0 ${PI/2}"/>
      <geometry>
        <mesh filename="${root_pkg}/meshes/wheel.dae"/>
        <cylinder length="${rear_tyre_length}" radius="${rear_tyre_r}"/>
      </geometry>
    </visual>

    <inertial>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <mass value="${rear_tyre_mass}"/>
      <inertia
        ixx="${rear_tyre_mass_ixx}"  ixy="0.000000"  ixz="0.000000"
        iyy="${rear_tyre_mass_iyy}"  iyz="0.000000"
        izz="${rear_tyre_mass_izz}"/>
    </inertial>
  </link> 

  <!--Front Right Steering-->
  <joint name="front_right_steering_joint" type="revolute">
    <parent link="base_link"/>
    <child link="front_right_steering_link"/>
    <origin xyz="${front_tyre_x} ${-front_tyre_y} ${front_tyre_r}" rpy="0 0 0"/>
    <axis xyz="0 0 1"/>
    <limit lower="${-str_angle}" upper="${str_angle}" effort="1000000.0" velocity="10000.0"/>
    <dynamics damping="10.0" friction="0.0"/>
  </joint>

  <link name="front_right_steering_link">
    <visual>
      <origin xyz="0 0 0" rpy="${PI/2} 0 0"/>
      <geometry>
        <cylinder length="${str_length}" radius="${str_radius}"/>
      </geometry>
    </visual>

    <inertial>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <mass value="${str_mass}"/>
      <inertia
      ixx="${str_mass_ixx}"  ixy="0.000000"  ixz="0.000000"
      iyy="${str_mass_iyy}"  iyz="0.000000"
      izz="${str_mass_izz}"/>
    </inertial>
  </link>


  <!--Front Right Wheel-->
  <joint name="front_right_wheel_joint" type="continuous">
    <parent link="front_right_steering_link"/>
    <child link="front_right_wheel_link"/>
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <axis xyz="0 1 0"/>
    <dynamics damping="0.1"/>
    <limit effort="1000000" velocity="10000" />
    <joint_properties damping="0.0" friction="0.0" />
  </joint>

  <link name="front_right_wheel_link">
    <collision>
      <origin xyz="0 0 0" rpy="${PI/2} 0 0"/>
      <geometry>
        <cylinder length="${front_tyre_length}" radius="${front_tyre_r}"/>
      </geometry>
    </collision>

    <visual>
      <origin xyz="0 0 0" rpy="0 0 -${PI/2}"/>
      <geometry>
        <mesh filename="${root_pkg}/meshes/wheel.dae"/>
        <cylinder length="${front_tyre_length}" radius="${front_tyre_r}"/>
      </geometry>  
    </visual>

    <inertial>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <mass value="${front_tyre_mass}"/>
      <inertia
        ixx="${front_tyre_mass_ixx}"  ixy="0.000000"  ixz="0.000000"
        iyy="${front_tyre_mass_iyy}"  iyz="0.000000"
        izz="${front_tyre_mass_izz}"/>
    </inertial>
  </link>

  <!--Front Left Steering-->
  <joint name="front_left_steering_joint" type="revolute">
    <parent link="base_link"/>
    <child link="front_left_steering_link"/>
    <origin xyz="${front_tyre_x} ${front_tyre_y} ${front_tyre_r}" rpy="0 0 0"/>
    <axis xyz="0 0 1"/>
    <limit lower="${-str_angle}" upper="${str_angle}" effort="1000000.0" velocity="10000.0"/>
    <dynamics damping="10.0" friction="0.0"/>
  </joint>

  <link name="front_left_steering_link">

    <visual>
      <origin xyz="0 0 0" rpy="${PI/2} 0 0"/>
      <geometry>
        <cylinder length="${str_length}" radius="${str_radius}"/>
      </geometry>
    </visual>

    <inertial>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <mass value="${str_mass}"/>
      <inertia
      ixx="${str_mass_ixx}"  ixy="0.000000"  ixz="0.000000"
      iyy="${str_mass_iyy}"  iyz="0.000000"
      izz="${str_mass_izz}"/>
    </inertial>
  </link>


  <!--Front Left Wheel-->
  <joint name="front_left_wheel_joint" type="continuous">
    <parent link="front_left_steering_link"/>
    <child link="front_left_wheel_link"/>
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <axis xyz="0 1 0"/>
    <dynamics damping="0.1"/>
    <limit effort="1000000" velocity="10000" />
    <joint_properties damping="0.0" friction="0.0" />
  </joint>

  <link name="front_left_wheel_link">
    <collision>
      <origin xyz="0 0 0" rpy="${PI/2} 0 0"/>
      <geometry>
        <cylinder length="${front_tyre_length}" radius="${front_tyre_r}"/>
      </geometry>
    </collision>

    <visual>
      <origin xyz="0 0 0" rpy="0 0 ${PI/2}"/>
      <geometry>
        <mesh filename="${root_pkg}/meshes/wheel.dae"/>
        <!-- <cylinder length="${front_tyre_length}" radius="${front_tyre_r}"/> -->
      </geometry>  
    </visual>

    <inertial>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <mass value="${front_tyre_mass}"/>
      <inertia
        ixx="${front_tyre_mass_ixx}"  ixy="0.000000"  ixz="0.000000"
        iyy="${front_tyre_mass_iyy}"  iyz="0.000000"
        izz="${front_tyre_mass_izz}"/>
    </inertial>
  </link>  


</robot>

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gst-launch是GStreamer多媒体框架提供的一个命令行工具,用于构建和运行GStreamer管道。通过gst-launch,可以非常方便地查看GStreamer管道的参数。 首先,我们需要在终端中输入命令“gst-launch ”,然后跟随一个管道描述。在管道描述中,我们可以指定多个元素及其参数。 例如,如果我们想查看一个简单的视频播放器的参数,可以使用以下命令: gst-launch-1.0 playbin uri=file:///path/to/video.mp4 这个命令中,我们使用了playbin元素来创建一个简单的视频播放器。通过uri参数指定了要播放的视频文件的路径。 当我们运行这个命令后,GStreamer会解析这个管道,并将其参数打印到终端上。我们可以在输出中看到playbin元素的参数,如uri、volume、buffer-size等。 除了查看元素的参数,我们还可以通过添加其他元素来构建更复杂的管道,并通过参数修改它们的行为。 例如,我们可以使用以下命令将一个视频文件实时转码为MP3文件并保存到硬盘上: gst-launch-1.0 filesrc location=/path/to/video.mp4 ! decodebin ! audioconvert ! lamemp3enc ! filesink location=/path/to/audio.mp3 在这个命令中,我们使用了filesrc元素来读取视频文件,decodebin元素将视频解码为原始数据,audioconvert元素对音频进行格式转换,lamemp3enc元素将音频编码为MP3格式,最后使用filesink元素将转码后的音频保存到硬盘上。 通过查看元素的参数,我们可以了解每个元素的功能和可调整的参数,从而更好地理解和使用GStreamer的功能。通过修改参数,我们可以灵活地配置和优化GStreamer管道的行为,满足不同的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值