目录
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 赵虚左老师