ROS urdf xacro 建模 差速轮模型
目录
URDF
1.什么是URDF
2.link与joint标签
3.robot标签
4.建模实例
xacro
1.什么是xacro
2.如何使用xacro
3.常量定义与使用
4.数学计算
5.宏定义
6.文件包含
7.xacro转urdf
URDF
1.什么是URDF
URDF(Unified Robot Description Format),统一机器人描述格式,ROS中非常重要的机器人模型描述格式,将真实世界的机器人映射到计算机上。一般使用XML格式来进行表述,ROS对URDF文件的支持非常友好,提供C++解析器,在构建(catkin_make) 项目时完成描述解析。
2.link与joint标签
link官方文档:http://wiki.ros.org/urdf/XML/link
用于描述机器人某个刚体部分的外观和物理属性,可以描述其尺寸(size),颜色(color),形状(shape),关系矩阵(inertial matrix),碰撞参数(collision properties)等
参考格式为:
<link name="base_link">
<visual>
<origin xyz=" 0 0 0" rpy="0 0 0" />
<geometry>
<cylinder length="0.16" radius="0.20"/>
</geometry>
<material name="yellow">
<color rgba="1 0.4 0 1"/>
</material>
</visual>
</link>
joint官方文档:http://wiki.ros.org/urdf/XML/joint
- revolute - 旋转关节,其极限位置由 upper and lower limits 决定
- continuous - 旋转关节,无位置限制
- prismatic - 滑动关节,其极限位置由 upper and lower limits 决定
- fixed - 虚拟关节,关节不可运动
- floating - 六自由度关节
- planar - 平面关节
参考格式:
<joint name="left_wheel_joint" type="continuous">
<origin xyz="0 0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="left_wheel_link"/>
<axis xyz="0 1 0"/>
</joint>
上面描述了left_wheel_likn对于base_link的joint转换,类型是continuous,旋转关节,旋转关节多用于滚轮或机器臂等非静态刚体,origin描述了相对于base_link的位姿关系,在y轴(即左方)0.19米,z轴(高度)上下降0.05米 ,axis描述了依照什么轴旋转,这里为y轴,标为1。(根据这一段描述很容易看出这是在描述一个轮子的urdf)。
更多的joint参数有:
参考图形
3.robot标签
位于整个urdf的最外层,在其中有一系列与
<?xml version="1.0" ?>
<robot name="mbot">
<link ....>
....
</link>
<joint ...>
......
</joint>
<link ....>
....
</link>
<joint ...>
......
</joint>
</robot>
4.建模实例
1)创建工作空间以及功能包
$ source /opt/ros/kinetic/setup.bash
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace
$ cd ~/catkin_ws
$ catkin_make
$ cd src
$ catkin_create_pkg mbot_description urdf xarco
2)创建luach启动文件
$ cd mbot_description
$ mkdir launch config urdf
$ cd launch && touch display_mbot_base_urdf.launch
<launch>
<param name="robot_description" textfile="$(find mbot_description)/urdf/mbot_base.urdf" />
<!-- 设置GUI参数,显示关节控制插件 -->
<param name="use_gui" value="true"/>
<!-- 运行joint_state_publisher节点,发布机器人的关节状态 -->
<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 mbot_description)/config/mbot_urdf.rviz" required="true" />
</launch>
使用use_gui需安装 apt install ros-kinetic-joint-state-publisher-gui,robot_state_publisher发布车体状态
joint_state_publisher发布关节状态
3)创建urdf文件
创建就base_link车体,创建左轮右轮left_wheel_link,right_wheel_link,创建关节信息,特别注意左右轮的物理位置。我们的车体是一个半径为0.2米,高0.16米的圆柱,车轮为半径0.06,高0.025的圆柱,但是他的翻滚角,即r周1.5707即90°,关节joint定义其在和处连接,0 0.19 -0.05,即x轴0方向,y轴(左方)0.19米(车体为0.2,有一部分陷入车体),z轴下方0.05米,这是一个相对合理的位置。
<?xml version="1.0" ?>
<robot name="mbot">
<link name="base_link">
<visual>
<origin xyz=" 0 0 0" rpy="0 0 0" />
<geometry>
<cylinder length="0.16" radius="0.20"/>
</geometry>
<material name="yellow">
<color rgba="1 0.4 0 1"/>
</material>
</visual>
</link>
<link name="left_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder radius="0.06" length = "0.025"/>
</geometry>
<material name="white">
<color rgba="1 1 1 0.9"/>
</material>
</visual>
</link>
<joint name="left_wheel_joint" type="continuous">
<origin xyz="0 0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="left_wheel_link"/>
<axis xyz="0 1 0"/>
</joint>
<link name="right_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder radius="0.06" length = "0.025"/>
</geometry>
<material name="white">
<color rgba="1 1 1 0.9"/>
</material>
</visual>
</link>
<joint name="right_wheel_joint" type="continuous">
<origin xyz="0 -0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="right_wheel_link"/>
<axis xyz="0 1 0"/>
</joint>
</robot>
4)启动
$ roslaunch mbot_description display_mbot_base_urdf.launch
可以看到车体与左右轮的样子在rviz上呈现出来,由于我们的节点joint的type类型为 continuous,所以我们可以拖动joint_state_publisher让轮子旋转
5)改造,增加激光雷达,摄像头等设备
通常来说,一个完整的无人驾驶机器人是需要激光雷达,摄像头等视觉设备的,而且注意到上面的小车只有两个轮子,这是不满足转弯条件的,我们需要给他添加一个前置万向轮,接下来我们添上。
添加很简单,在urdf下添加如下结点即可
<joint name="front_caster_joint" type="continuous">
<origin xyz="0.18 0 -0.095" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="front_caster_link"/>
<axis xyz="0 1 0"/>
</joint>
<link name="front_caster_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<sphere radius="0.015" />
</geometry>
<material name="black">
<color rgba="0 0 0 0.95"/>
</material>
</visual>
</link>
<link name="laser_link">
<visual>
<origin xyz=" 0 0 0 " rpy="0 0 0" />
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<material name="black"/>
</visual>
</link>
<joint name="laser_joint" type="fixed">
<origin xyz="0 0 0.105" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="laser_link"/>
</joint>
roslaunch运行
xacro
1.什么是xacro
xacro是在urdf的基础上,新增了宏定义与文件包含的功能,提供常量定义,变量定义,数学计算以及程式判断(条件语句)
2.如何使用xacro
使用xacro的第一步是在catkin_create_pkg时导入,如 catkin_create_pkg mbot_description urdf xarco。若功能包已创建,则在CMakelist.txt文件找到find_package,并添加
find_package(catkin REQUIRED COMPONENTS
…
xacro
)
在package.xml中添加:
xacro
xacro
<robot name="mbot" xmlns:xacro="http://www.ros.org/wiki/xacro">
</robot>
3.常量定义与使用
常量的定义格式为:
如下定义pi,车半径与长度,左右轮半径与长度
<xacro:property name="M_PI" value="3.1415926"/>
<xacro:property name="base_radius" value="0.20"/>
<xacro:property name="base_length" value="0.16"/>
<xacro:property name="wheel_radius" value="0.06"/>
<xacro:property name="wheel_length" value="0.025"/>
<xacro:property name="wheel_joint_y" value="0.19"/>
<xacro:property name="wheel_joint_z" value="0.05"/>
<xacro:property name="caster_radius" value="0.015"/>
<xacro:property name="caster_joint_x" value="0.18"/>
常量的使用也很简单,格式为:${name}
如
4.数学计算
xacro同样提供数学运算,所有的xacro要包含在${}中
如(定义前向轮的坐标系信息,在z轴上等于车体高度的一半加上前向轮的半径也就是让前向轮附着在车体前方,因为在z轴下方所以取负):
xacro仅支持加减乘除取余等基础运算
5.宏定义
xacro中的宏定义指的是定义一个基础模板,写法同urdf,可任意添加变量从而在调用宏时做动态赋值,不太好理解的话看下面实例。
在下面这段定义中,除开常量定义外,我添加了两个变量${prefix}与${reflect},为什么这么写,请往下看
<xacro:macro name="wheel" params="prefix reflect">
<joint name="${prefix}_wheel_joint" type="continuous">
<origin xyz="0 ${reflect*wheel_joint_y} ${-wheel_joint_z}" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="${prefix}_wheel_link"/>
<axis xyz="0 1 0"/>
</joint>
<link name="${prefix}_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="${M_PI/2} 0 0" />
<geometry>
<cylinder radius="${wheel_radius}" length = "${wheel_length}"/>
</geometry>
<material name="gray" />
</visual>
</link>
</xacro:macro>
我们通过调用宏,为prefix和reflect赋值,左轮为left,右轮为right,注意到reflect分别取到了-1和1,这在宏定义中有描述<origin xyz=”0 ${reflect*wheel_joint_y},取-1代表在y轴的左方,取1代表在y轴的右方。我们仅通过一个宏定义,就实现了两个轮子的urdf建模,如果有4个,6个乃至更多,这极大提高了我们建模效率。
<wheel prefix="left" reflect="-1"/>
<wheel prefix="right" reflect="1"/>
还有一点要注意的是,我们在调用宏时标签名使用的是宏定义的name,上述为wheel所以使用wheel标签
6.文件包含
xacro同样提供文件包含功能,想想看,把一整套urdf写在一个文件中好,还是按照功能单独写,最后组装成一个urdf好。答案当然是后者,这样更加有利于查看与维护。
xacro中的文件包含也非常简单,格式为
<?xml version="1.0"?>
<robot name="arm" xmlns:xacro="http://www.ros.org/wiki/xacro">
<xacro:include filename="$(find 功能包名)/路径/文件名.xacro" />
<mbot_base/>
</robot>
<xacro:macro name="mbot_base">
<link name="base_footprint">
...
</link>
<joint name="base_footprint_joint" type="fixed">
...
</joint>
</xacro:macro>
7.xacro转urdf
xacro文件是不能被直接使用的,需要转urdf,格式为:
rosrun xacro xacro.py 文件名.xacro > 文件名.urdf
xacro同样也支持在launch文件中动态转换,如:
还没有评论,来说两句吧...