使用 xacro 为 Gazebo 创建世界文件
Creating world file for Gazebo with xacro
我正在尝试在 Gazebo 模拟器的世界文件中生成随机框。
我知道如何创建模型 sdf,以及如何从世界文件中包含它。
现在我想使用 xacro 和 width/height 参数在世界文件中创建不同大小的框。
我无法让它工作。
请帮助:)
好吧,我要描述的是一种替代设计,它可以作为您问题的解决方法,它的步骤如下:
第 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 选项,但这显然是可选的。
我正在尝试在 Gazebo 模拟器的世界文件中生成随机框。 我知道如何创建模型 sdf,以及如何从世界文件中包含它。
现在我想使用 xacro 和 width/height 参数在世界文件中创建不同大小的框。
我无法让它工作。 请帮助:)
好吧,我要描述的是一种替代设计,它可以作为您问题的解决方法,它的步骤如下:
第 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 选项,但这显然是可选的。