【发布时间】:2018-02-24 02:41:10
【问题描述】:
我正在尝试在 Gazebo 模拟器的世界文件中生成随机框。 我知道如何创建模型 sdf,以及如何从 world 文件中包含它。
现在我想使用 xacro 和宽度/高度参数在世界文件中创建不同大小的框。
我无法让它工作。 请帮忙:)
【问题讨论】:
标签: ros
我正在尝试在 Gazebo 模拟器的世界文件中生成随机框。 我知道如何创建模型 sdf,以及如何从 world 文件中包含它。
现在我想使用 xacro 和宽度/高度参数在世界文件中创建不同大小的框。
我无法让它工作。 请帮忙:)
【问题讨论】:
标签: ros
好吧,我要描述的是一种替代设计,可以作为您问题的解决方法,它类似于以下步骤:
第 1 步:将您的对象创建为参数化良好的 xacro 文件 (所有参数都包含在同一个文件中)。可以在 Xacro URDF page 中找到有关 HowTO 的一个很好的教程(这里太长,无法包含在此处)。
第 2 步:将您的 xacro 包含在 Gazebo-robot 启动文件中并测试它到目前为止是否正常工作。 这方面的一个例子可以在in PR2 description here:
找到<!-- Convert an xacro and put on parameter server -->
<param name="robot_description" command="$(find xacro)/xacro.py $(find pr2_description)/robots/pr2.urdf.xacro" />
<!-- Spawn a robot into Gazebo -->
<node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-param robot_description -urdf -model pr2" />
第 3 步:如果您将对象视为要在凉亭世界中启动的机器人,则传递参数以创建其(在 xacro 文件中)的解决方案可以通过传递所需的使用prefix:=$(arg value) 的参数如下(explained in here):
<param name="robot_description" command="$(find xacro)/xacro.py '$(find my_robot_description)/urdf/my_robot.urdf.xacro' prefix:=$(arg ns)" />
in the xacro file you can simply get the passed argument using $(arg prefix)
这样,您可以在 xacro 文件中创建对象,使用 ROS 启动文件在 Gazebo 中启动它,并根据您需要的值对其进行调整。
此外,ROS 启动文件也可以将参数传递给其内容,因此,您的值也可以直接通过命令行更新:
roslaunch your_package launch_file.launch a:=1 b:=5
或存储在parameter server 中以便在启动时检索。
希望有帮助,干杯!
您还可以在 .launchfile 中添加这个小 ROS 节点,以将 .xacro 转换为 .whatever:
<node name="xacro" pkg="xacro" type="xacro" args="--inorder -o $(find YOURPKG)/PATH_TO_FILE/NAME.sdf_OR_WHATEVER_EXTENSION_YOU_WANT_FOR_FINAL_FILE $(find pkg)/PATH_TO_FILE/NAME.sdf.xacro" />
基本上,您使用 4 个参数运行 xacro 节点。最后两个是文件的路径。首先是您要创建的文件的名称(以及在哪里),其次是 .xacro 原始文件。就我而言,我添加了 find pkg 选项,但这显然是可选的。
【讨论】: