机器人系统ros2-开发学习实践13-Xacro 减少 URDF 文件中代码量的技巧

到目前为止,如果您在家里按照所有这些步骤进行自己的机器人设计,您可能会厌倦做各种数学来获得非常简单的机器人描述以正确解析。幸运的是,您可以使用xacro包让您的生活更简单。它做了三件非常有帮助的事情。

  • 常数变量定义

  • 简单的数学公式

在本教程中,我们将了解所有这些快捷方式,以帮助减少 URDF 文件的整体大小并使其更易于阅读和维护。

使用 Xacro

顾名思义,xacro是 XML 的宏语言。 xacro 程序运行所有宏并输出结果。典型用法如下所示:

xacro model.xacro > model.urdf

您还可以在启动文件中自动生成 urdf。这很方便,因为它可以保持最新状态并且不会占用硬盘空间。但是,生成确实需要时间,因此请注意您的启动文件可能需要更长的时间才能启动。

要在启动文件中运行 xacro,您需要将Command替换作为参数放入robot_state_publisher.

path_to_urdf = get_package_share_path('turtlebot3_description') / 'urdf' / 'turtlebot3_burger.urdf'
robot_state_publisher_node = launch_ros.actions.Node(
    package='robot_state_publisher',
    executable='robot_state_publisher',
    parameters=[{
        'robot_description': ParameterValue(
            Command(['xacro ', str(path_to_urdf)]), value_type=str
        )
    }]
)

加载机器人模型的一种更简单的方法是使用urdf_launch包自动加载 xacro/urdf。

from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch.substitutions import PathJoinSubstitution
from launch_ros.substitutions import FindPackageShare


def generate_launch_description():
    ld = LaunchDescription()

    ld.add_action(IncludeLaunchDescription(
        PathJoinSubstitution([FindPackageShare('urdf_launch'), 'launch', 'display.launch.py']),
        launch_arguments={
            'urdf_package': 'turtlebot3_description',
            'urdf_package_path': PathJoinSubstitution(['urdf', 'turtlebot3_burger.urdf'])}.items()
    ))
    return ld

在 URDF 文件的顶部,您必须指定一个命名空间,以便正确解析该文件。例如,以下是有效 xacro 文件的前两行:

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="firefighter">

常数变量:

让我们快速浏览一下 R2D2 中的 base_link。

<link name="base_link">
  <visual>
    <geometry>
      <cylinder length="0.6" radius="0.2"/>
    </geometry>
    <material name="blue"/>
  </visual>
  <collision>
    <geometry>
      <cylinder length="0.6" radius="0.2"/>
    </geometry>
  </collision>
</link>

这里的信息有点多余。我们指定圆柱体cylinder 的长度和半径两次。更糟糕的是,如果我们想改变这一点,我们需要在两个不同的地方进行。

幸运的是,xacro 允许您指定充当常量的属性。我们可以编写这样的代码来代替上面的代码。

<xacro:property name="width" value="0.2" />
<xacro:property name="bodylen" value="0.6" />
<link name="base_link">
    <visual>
        <geometry>
            <cylinder radius="${width}" length="${bodylen}"/>
        </geometry>
        <material name="blue"/>
    </visual>
    <collision>
        <geometry>
            <cylinder radius="${width}" length="${bodylen}"/>
        </geometry>
    </collision>
</link>
  • 这两个值在前两行中指定。它们几乎可以在任何地方(假设有效的 XML)、任何级别、使用之前或之后定义。通常我们都定义放在顶部

  • 我们没有在几何元素中指定实际半径,而是使用美元符号和大括号来表示该值。

  • 此代码将生成与上面所示相同的代码。

然后使用 ${} 构造的内容值来替换 ${}。这意味着您可以将其与属性中的其他文本组合。

<xacro:property name=”robotname” value=”marvin” />
<link name=”${robotname}s_leg” />

这将生成

<link name=”marvins_leg” />

然而,${} 中的内容不仅仅作为只是一个属性,还可以用于简单的算式

算式

您可以使用四个基本运算(+、-、*、/)、一元减号和括号在 ${} 构造中构建任意复杂的表达式。例子:

<cylinder radius="${wheeldiam/2}" length="0.1"/>
<origin xyz="${reflect*(width+.02)} 0 0.25" />

您还可以使用除基本数学运算之外的其他功能,例如sin和cos。

代码块表示

这是 xacro 包中最大且最有用的组件。

我们来看一个简单的示例

<xacro:macro name="default_origin">
    <origin xyz="0 0 0" rpy="0 0 0"/>
</xacro:macro>
<xacro:default_origin />
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小海聊智造

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值