ROS2 URDF的使用2 URDF工具以及xacro优化

目录

urdf工具

文件的检查

文件的输出

xacro的使用

xacro案例:


urdf工具

ROS2有两个URDF的终端命令行可以对自己的urdf进行检查和输出结构层次,分别是

check_urdf  和 urdf_to_graphviz

使用他们之前需要先进行安装对应的工具

sudo apt install liburdfdom-tools

检查: check_urdf demo05_exercise.urdf

要使用这个工具,先进入要检查的urdf的目录中,比如我要检查的urdf在cpp06的urdf/urdf中,就需要将终端移至这里

文件的检查

check_urdf demo05_exercise.urdf

如果urdf文件正确会报successful 

文件的输出

urdf_to_graphviz demo05_exercise.urdf

如果输出正确,会在该目录中生成.gv和.pdf文件

其中pdf文件会显示该urdf的层级结构

xacro的使用

在前面创建小车的urdf文件时,我们会发现要创建四个轮子需要写四个几乎一模一样的代码,同时每个轮子的偏移量需要手动修改,如果轮子改变,这些值需要一个一个手动修改,非常麻烦;xacro也属于xml语言,相当于对urdf文件进行了优化,他有了我们类似C语言函数这个东西,所以可以很好优化我们的urdf文件,我们可以编写xacro文件来充当urdf文件

在前面的launch文件中我们使用xacro是直接通过xacro将我们的urdf文件导入到ros2中,这次我们写的文件是.xacro文件,launch同样可以对xacro文件进行解析。

xacro demo01_helloworld.urdf.xacro

或者(终端位于当前目录)

ros2 run xacro xacro demo01_helloworld.urdf.xacro

其中 demo01_helloworld.urdf.xacro 就是你的源文件

<robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">
    <!-- 属性封装 -->
    <xacro:property name="wheel_radius" value="0.025" />
    <xacro:property name="wheel_length" value="0.02" />
    <xacro:property name="PI" value="3.1415927" />

    <!-- 宏 -->
    <xacro:macro name="wheel_func" params="wheel_name" >
        <link name="${wheel_name}_wheel">
            <visual>
                <geometry>
                    <cylinder radius="${wheel_radius}" length="${wheel_length}" />
                </geometry>

                <origin xyz="0 0 0" rpy="${PI / 2} 0 0" />

                <material name="wheel_color">
                    <color rgba="0 0 0 0.3" />
                </material>
            </visual>
        </link>
    </xacro:macro>


    <xacro:wheel_func wheel_name="left_front"/>
    <xacro:wheel_func wheel_name="left_back"/>
    <xacro:wheel_func wheel_name="right_front"/>
    <xacro:wheel_func wheel_name="right_back"/>
</robot>

<!-- xacro demo01_helloworld.urdf.xacro  -->
<!--  ros2 run xacro xacro demo01_helloworld.urdf.xacro -->

运行结果,输出内容和之前写的urdf的四个轮子的link文件一模一样。

xacro案例:

通过xacro实现对小车的组装,其中包含激光雷达、摄像头、车体和车轮,具体效果如下

 小车是由多个部分组成的,为了方便查看,将每个部分进行模块化,然后统一到一个文件中,所以创建四个文件

car:负责将各个模块整合到一起

car_base:负责小车的车体和车轮

car_camera:负责小车的摄像头

car_laser:负责小车的激光雷达

car部分代码:里面只包含了其他文件

<!-- 总集成文件 -->

<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="car">
    <xacro:include filename="car_base.urdf.xacro"/>
    <xacro:include filename="car_camera.urdf.xacro"/>
    <xacro:include filename="car_laser.urdf.xacro"/>
</robot>

car_base代码:

<!-- 底盘 -->

<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
    <xacro:property name="PI" value="3.1415926"/>
    <!-- 车体 -->
    <xacro:property name="car_length" value="0.2"/>
    <xacro:property name="car_width" value="0.12"/>
    <xacro:property name="car_height" value="0.07"/>
    <!-- 车轮 -->
    <xacro:property name="wheel_radius" value="0.025"/>
    <xacro:property name="wheel_length" value="0.02"/>
    <!-- 离地间距 -->
    <xacro:property name="distance" value="0.015"/>
    <!-- 轮胎关节偏移量 -->
    <xacro:property name="wheel_joint_x" value="0.08"/>
    <xacro:property name="wheel_joint_y" value="${car_width / 2}"/>
    <xacro:property name="wheel_joint_z" value="${-(car_height / 2 + distance - wheel_radius)}"/>

    <!-- 设置颜色 -->
    <material name="red">
        <color rgba="1.0 0.0 0.0 1.0"/>
    </material>
    <material name="yellow">
        <color rgba="0.6 0.7 0.0 0.88"/>
    </material >   
    
    <!-- 创建初始化坐标系 -->
    <link name="base_footprint">
        <visual>
            <geometry>
                <geometry>
                    <sphere radius="0.001"/>
                </geometry>
            </geometry>
        </visual>    
    </link>

    <!-- 创建车身 -->
    <link name="base_link">
        <visual>
            <geometry>
                <box size="${car_length} ${car_width} ${car_height}"/>
            </geometry>
            <material name="yellow"/>
        </visual>        
    </link>

    <joint name="base2base_footprint" type="fixed">
        <parent link="base_footprint"/>
        <child link="base_link"/>
        <origin xyz="0.0 0.0 ${distance + car_height/2}"/>
    </joint>

    <xacro:macro name ="wheel_func" params="link_name head_flag left_flag">
        <link name="${link_name}">
            <visual>
                <geometry>
                    <cylinder radius="${wheel_radius}" length="0.02"/>
                </geometry>
                <material name="red"/>
                <origin rpy="${PI/2} 0.0 0.0"/>
            </visual>
        </link>
        <joint name="car_${link_name}" type="continuous">
            <parent link="base_link"/>
            <child link="${link_name}"/>
            <origin xyz="${wheel_joint_x * head_flag} ${wheel_joint_y * left_flag} ${wheel_joint_z}"/>
            <axis xyz="0.0 1 0.0"/>
        </joint>       
    </xacro:macro>

    <xacro:wheel_func link_name="head_left" left_flag="1" head_flag="1"/>
    <xacro:wheel_func link_name="head_right" left_flag="-1" head_flag="1"/>
    <xacro:wheel_func link_name="back_left" left_flag="1" head_flag="-1"/>
    <xacro:wheel_func link_name="back_right" left_flag="-1" head_flag="-1"/>
</robot>

car_laser代码:

<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
    <!-- 雷达尺寸 -->
    <xacro:property name="laser_radius" value="0.03"/>
    <xacro:property name="laser_height" value="0.03"/>
    <!-- 雷达位置 -->
    <xacro:property name="joint_laser_x" value="0"/>
    <xacro:property name="joint_laser_y" value="0"/>
    <xacro:property name="joint_laser_z" value="${laser_height / 2 + car_height / 2}"/>

    <link name="laser">
        <visual>
            <geometry>
                <cylinder radius="${laser_radius}" length="${laser_height}"/>
            </geometry>
            <material name="blue">
                <color rgba="0.1 0.1 0.8 0.7"/>
            </material>
        </visual>
    </link>

    <joint name="laser2base_link" type="fixed">
        <parent link="base_link"/>
        <child link="laser"/>
        <origin xyz="${joint_laser_x} ${joint_laser_y} ${joint_laser_z}"/>
    </joint>


</robot>

car_camera代码:



<robot xmlns:xacro="http://www.ros.org/wiki/xacro">

    <!-- 摄像头的长宽高 -->
    <xacro:property name="camera_x" value="0.01"/>
    <xacro:property name="camera_y" value="0.05"/>
    <xacro:property name="camera_z" value="0.01"/>
    <!-- 关节偏移量 -->
    <xacro:property name="joint_camera_x" value="${car_length / 2 - 0.01}"/>
    <xacro:property name="joint_camera_y" value="0"/>
    <xacro:property name="joint_camera_z" value="${car_height / 2 + camera_z / 2}"/>

    <link name="camera">
        <visual>
            <geometry>
                <box size="${camera_x} ${camera_y} ${camera_z}"/>
            </geometry>
        </visual>        
    </link>

    <joint name="camera2base_link" type="fixed">
        <parent link="base_link"/>
        <child link="camera"/>
        
        <origin xyz="${joint_camera_x} ${joint_camera_y} ${joint_camera_z}"/>
        
    </joint>



</robot>


<!-- ros2 launch cpp06_urdf display.launch.py model:=`ros2 pkg prefix share cpp06_urdf`/urdf/xacro/car.urdf.xacro -->

在这里注意到:car_camera文件中用到了car_base中的一些属性,这是可以的,只要他们都在一个文件中(car文件中)

写的时候记住要写一部分在运行一次,防止全写完都无法运行,如果无法运行又不知道哪里错了,可以使用之前的xacro检查工具

xacro demo01_helloworld.urdf.xacro
demo01_helloworld.urdf.xacro是你要检查的文件

运行命令

ros2 launch cpp06_urdf display.launch.py model:=`ros2 pkg prefix --share cpp06_urdf`/urdf/xacro/car.urdf.xacro

这个命令是基于之前的可视化工具中的launch文件 

参考B站ROS2 赵虚左老师

URDF是一种机器人描述文件格式,用于定义机器人的结构和几何特征。而Xacro是一种基于XML机器人描述语言,可以使用宏(macros)来简化URDF的编写和维护。 将URDF文件换为Xacro格式可以带来一些优势。首先,使用Xacro可以减少URDF文件的大小和复杂性。通过定义和重复使用宏,可以将重复、模板化的部分抽象出来,并在需要的地方进行引用。这样,我们可以避免在URDF文件中不断重复编写相似的代码,显著简化了文件结构。 其次,Xacro还支持参数化和条件逻辑。这意味着我们可以根据需要调整机器人的参数,例如尺寸、质量或其它属性,而无需更改整个URDF文件。此外,我们还可以使用条件语句来编写更灵活的机器人模型,以适应不同的应用场景和需求。 最后,Xacro还支持包含其他文件,并且具备更强大的组织结构和层次化描述功能。我们可以将机器人的各个组件拆分为不同的文件,并通过包含(include)语句将它们整合在一起。这使得文件的组织和维护更加方便,也方便进行团队协作开发。 总的来说,通过将URDF换为Xacro格式,我们可以更高效地编写和维护机器人模型。它简化了URDF文件的编写、减少了冗余代码、支持机器人参数化和条件逻辑,并且具备更强大的组织结构。这些优势使得URDFXacro成为建模机器人的一种常用方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值