最近在学习一下ROS中URDF的使用,参照古月大佬的文章,建立一个简单的智能车机器人smartcar.
1. 设计智能车结构
智能车采用四个轮子+长方体车体的结构,车体大小为25X16X5cm,轮子大小为直径为5cm,高度为2cm。下图为古月给出的模型图:
智能车尺寸数据
项目的文件夹结构:
.
├── CMakeLists.txt
├── config (配置folder)
│ ├── smartcar_urdf.launch
│ └── smart_urdf.rviz
├── launch (启动配置folder)
│ └── base_urdf_rviz.launch
├── meshes
├── package.xml
└── urdf (模型folder)
├── smartcar.gv
├── smartcar.pdf
└── smartcar.urdf
2. 建立URDF文件
- 2.1. URDF代码
相关包怎么建立以及文件夹结构可以参考古月大佬的博客,这里只贴入代码,用于记录:
<?xml version="1.0"?>
<robot name="smartcar">
<link name="base_link">
<visual>
<geometry>
<box size="0.25 .16 .05"/>
</geometry>
<origin rpy="0 0 1.57075" xyz="0 0 0"/>
<material name="blue">
<color rgba="0 0 .8 1"/>
</material>
</visual>
</link>
<joint name="right_front_wheel_joint" type="continuous">
<axis xyz="0 0 1"/>
<parent link="base_link"/>
<child link="right_front_wheel"/>
<origin rpy="0 1.57075 0" xyz="0.08 0.1 -0.03"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="right_front_wheel">
<visual>
<geometry>
<cylinder length=".02" radius="0.025"/>
</geometry>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<joint name="right_back_wheel_joint" type="continuous">
<axis xyz="0 0 1"/>
<parent link="base_link"/>
<child link="right_back_wheel"/>
<origin rpy="0 1.57075 0" xyz="0.08 -0.1 -0.03"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="right_back_wheel">
<visual>
<geometry>
<cylinder length=".02" radius="0.025"/>
</geometry>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<joint name="left_front_wheel_joint" type="continuous">
<axis xyz="0 0 1"/>
<parent link="base_link"/>
<child link="left_front_wheel"/>
<origin rpy="0 1.57075 0" xyz="-0.08 0.1 -0.03"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="left_front_wheel">
<visual>
<geometry>
<cylinder length=".02" radius="0.025"/>
</geometry>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<joint name="left_back_wheel_joint" type="continuous">
<axis xyz="0 0 1"/>
<parent link="base_link"/>
<child link="left_back_wheel"/>
<origin rpy="0 1.57075 0" xyz="-0.08 -0.1 -0.03"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="left_back_wheel">
<visual>
<geometry>
<cylinder length=".02" radius="0.025"/>
</geometry>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<joint name="tobox" type="fixed">
<parent link="base_link"/>
<child link="head"/>
<origin xyz="0 0.08 0.025"/>
</joint>
<link name="head">
<visual>
<geometry>
<box size=".02 .03 .03"/>
</geometry>
<material name="white">
<color rgba="1 1 1 1"/>
</material>
</visual>
</link>
</robot>
- 2.2.
link
与joint
的变换关系
link
分为base_link
和一般link
,base_link
的几何中心默认为世界中心。一般情况下,在描述base_link
时,若无偏移,则<origin xyz="0 0 0" rpy="0 0 0"/>
,其中旋转采用弧度表示,比如90°使用1.57075
,对应π/2。
一般link
的相对位置是根据joint
的位置确定的。
- 先定义
joint
,再定义link
; -
link
中的origin
描述的是link
的几何中心相对于该link
的joint
的位置变化; -
joint
中的origin
描述的是本joint
相对于其父link
的joint
的位置变化;
3. 建立launch
命令文件
在smartcar_description
文件夹下建立launch
文件夹,创建智能车的描述文件 base_urdf_rviz.launch
,描述代码如下:
<launch>
<arg name="model" />
<arg name="gui" default="False" />
<param name="robot_description" textfile="$(find smartcar_description)/urdf/smartcar.urdf" />
<!-- 设置GUI参数,显示关节控制插件 -->
<param name="use_gui" value="$(arg gui)"/>
<!-- 运行joint_state_publish节点,发布机器人关节装态 -->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<!-- 运行robot_state_publisher节点,发布TF -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<!-- 运行rviz,可视化界面 -->
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find urdf_tutorial)/urdf.vcg" />
</launch>
但由于版本问题,上述的代码需要进行更改
<launch>
<arg name="model" />
<arg name="gui" default="False" />
<param name="robot_description" textfile="$(find smartcar_description)/urdf/smartcar.urdf" />
<!-- 设置GUI参数,显示关节控制插件 -->
<param name="use_gui" value="$(arg gui)"/>
<!-- 将joint_state_publish节点更换为joint_state_publish_gui节点 -->
<node name="joint_state_publisher_gui" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" />
<!-- 运行robot_state_publisher节点,发布TF -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<!-- 不使用urdf_tutorial,在加载rviz之后,保存配置文件到该文件夹下 -->
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find smartcar_description)/config/smartcar.rviz" required="true" />
</launch>
4. 注意事项
- 4.1.
joint_state_publish_gui
安装
由于joint_state_publish
功能包更新为joint_state_publish_gui
功能包,所以需要重新安装,在终端输入指令sudo apt-get install ros-kinetic-joint-state-publisher-gui
,同时更新对应的节点名称,将joint_state_publish
节点更换为joint_state_publish_gui
节点。 - 4.2.
package.xml
文件更新
另外需要再package.xml
文件中更新依赖库,添加一行
<exec_depend>joint_state_publisher_gui</exec_depend>
5. 参考链接
【1】 Melodic 使用URDF创建简单的机器人模型
【2】ROS探索总结(五)——创建简单的机器人模型smartcar
【3】joint_state_publisher功能包
网友评论