下面就是常见的ROS小车,相信在大家的脑海里已经有了自己小车的样子,下面我和大家一起使用urdf对ros小车建模。
这里只对urdf进行简单介绍,然后就带大家使用urdf最基础的标签,建立机器人的urdf机器人模型。关于更多细节,请参看官网:http://wiki.ros.org/urdf/Tutorials
什么是urdf?
URDF(Unified Robot Description Format),统一机器人描述格式。 在 ROS 中,大家通常使用 urdf 对机器人模型进行描述,主要的作用就是维护机器人关节的 tf 树以及用于机器人模型3D 可视化的作用,关于其他的作用,这里并没有使用到。
建模的原因?
关于机器人TF树,这里要对它进行详细说明,为的是让大家清楚建立机器人模型的一个主要原因。
ROS中的很多软件包都需要机器人发布tf变换树,那么什么是tf变换树呢?
抽象的来讲,一棵tf变换树定义了不同坐标系之间的平移与旋转变换关系。
具体来说,我们假设有一个机器人,包括一个机器人移动平台和一个安装在平台之上的激光雷达,以这个机器人为例,定义两个坐标系,一个坐标系以机器人移动平台的中心为原点,称为base_link参考系,另一个坐标系以激光雷达的中心为原点,称为base_laser参考系。
假设在机器人运行过程中,激光雷达可以采集到距离前方障碍物的数据,这些数据当然是以激光雷达为原点的测量值,换句话说,也就是base_laser参考系下的测量值。现在,如果我们想使用这些数据帮助机器人完成避障功能,当然,由于激光雷达在机器人之上,直接使用这些数据不会产生太大的问题,但是激光雷达并不在机器人的中心之上,在极度要求较高的系统中,会始终存在一个雷达与机器人中心的偏差值。这个时候,如果我们采用一种坐标变换,将及激光数据从base_laser参考系变换到base_link参考下,问题不就解决了么。于是我们就需要定义这两个坐标系之间的变换关系。
为了定义这个变换关系,假设我们已知激光雷达安装的位置在机器人的中心点上方20cm,前方10cm处。这就根据这些数据,就足以定义这两个参考系之间的变换关系:当我们获取激光数据后,采用(x: 0.1m, y: 0.0m, z: 0.2m)的坐标变换,就可以将数据从base_laser参考系变换到base_link参考系了。当然,如果要方向变化,采用(x: -0.1m, y: 0.0m, z: -0.20m)的变换即可。
从上边的示例看来,参考系之间的坐标变换好像并不复杂,但是在复杂的系统中,存在的参考系可能远远大于两个,如果我们都使用这种手动的方式进行变换,估计很快你就会被繁杂的坐标关系搞蒙了。ROS提供的tf变换就是为解决这个问题而生的,tf功能包提供了存储、计算不同数据在不同参考系之间变换的功能,我们只需要告诉tf树这些参考系之间的变换公式即可,这颗tf树就可以用树的数据结构管理我们所需要的参考系变换。
如上图所示,每两个相邻的坐标系之间都有变换关系,也就是tf变换。我们需要通过机器人的urdf模型文件,向tf树发布机器人相关tf和关节状态,这也是建立机器人urdf模型的主要原因之一。
大家都知道,几乎所有机器人都可以用连杆和关节组成;对于不同形状的机器人,连杆大小和关节的分布不同。urdf就是采用这用方式,使用连杆link和关节joint共同组成机器人结构。
robot
link
描述机器人某个刚体部分的外观和物理属性。
包括大小(size)、颜色(color)、形状(shape)、惯性参数(inertial matrix)、碰撞参数(collision properties)等。
如下面所示,描述一个原点origin设置为零,坐标系无任何旋转,几何形状geometry为半径=0.075m,长度=0.104m的圆柱,物理属性material颜色为黄色,可设置三基色rgb和透明度a。
<link name="base_link"> <!-- 连杆的名字,自定义,也可以理解为一个三维坐标系 --> <visual> <!-- 可视化标签 --> <origin xyz=" 0 0 0" rpy="0 0 0" /> <!-- 原点设置标签:原点为集合中心上,欧拉角为零,无任何方向旋转 --> <geometry> <!-- 几何形状标签 --> <cylinder radius="0.075" length = "0.104"/> <!-- 此形状圆柱,若为方形 <box size="0.03 0.157 0.03" /> 参数长宽高、若为球体 <sphere radius="0.0125" /> 参数半径 --> </geometry> <material name="yellow"> <!-- 物理属性标签,此name的颜色并不起作用,用作示意 --> <color rgba="1 0.4 0 1"/> <!-- 可设置连杆rgb三基色和a透明度 --> </material> </visual> </link>joint
描述机器人关节的运动学和动力学属性;
包括关节运动的位置和速度限制;根据具体的关节运动形式分为六种类型。
如下面所示,描述了一个链接 父link 和 子link,绕y 轴可持续旋转的节关节joint。
<joint name="left_wheel_joint" type="continuous"> <!-- name关节名字、type关节类型--> <origin xyz="0.0 0.0785 -0.085" rpy="0 0 0"/> <!-- 关节无尺寸大小 ,origin原点必须参照parent link设置。这里表示该关节以父link原点为准,设置在向y轴正方向0.0785m,向z轴负方向0.085m的地方 --> <parent link="base_link"/> <!-- 父link名字 --> <child link="left_wheel_link"/> <!-- 子link名字 --> <axis xyz="0 1 0"/> <!-- 此节点绕y轴旋转 --> </joint>关于 origin xyz=" 0 0 0" rpy=“0 0 0” 的参数还是有点说法的,一般连杆的原点坐标xyz都设置为零,但是rpy(欧拉角:弧度制)有时候会变化。一般关节的原点都有坐标,rpy都设置为零。
欧拉角RPY分别代表Roll(滚转角),Pitch(俯仰角),Yaw(偏航角),分别对应绕XYZ轴旋转。旋转的正方向是,从XYZ轴的箭头方向看过去,顺时针为正,逆时针为负。
比如这里 origin xyz=“0 0 0” rpy=“1.5707 0 0” ,就表示连杆模型绕X轴顺时针旋转1.5707rad=90度。
urdf存放机器人模型文件
launch存放相关启动文件
config 保存rviz的配置文件,可用可不用 ,使用rviz保存配置的时候用来存放的位置。
meshes存放urdf引用的模型渲染文件,可用可不用,如果有渲染的模型文件就用,没有也没关系。
编写ROS小车urdf模型文件 cd urdf/ vim robot_with_laser.urdfurdf文件内容如下:
<?xml version="1.0" ?> <robot name="robot"> <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 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="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="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> <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="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> <joint name="back_caster_joint" type="continuous"> <origin xyz="-0.18 0 -0.095" rpy="0 0 0"/> <parent link="base_link"/> <child link="back_caster_link"/> <axis xyz="0 1 0"/> </joint> <link name="back_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> </robot> 检查urdf模型整体结构 cd ~/catkin_test_ws/src/robot_description/urdf urdf_to_graphiz robot_with_laser.urdf这里生成两个文件,查看pdf如下图。
编写显示模型的launch文件 cd .. cd launch vim dispaly_robot_with_laser.launchlaunch的内容如下:
<launch> <param name="robot_description" textfile="$(find robot_description)/urdf/robot_with_laser.urdf" /> <!-- 运行joint_state_publisher_gui节点,发布机器人的关节状态 --> <node name="joint_state_publisher_gui" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" /> <!-- 运行robot_state_publisher节点,发布tf,将机器人的连杆关节之间的关系,通过TF的形式,整理成三维姿态发布出去 --> <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" /> </launch> 运行luanch文件 cd ~/catkin_test_ws catkin_make source devel/setup.bash rospack profile roslaunch robot_description dispaly_robot_with_laser.launch将出现下面这样的错误,原因是,joint_state_publisher_gui功能包默认没有安装。
解决方法:
sudo apt-get install ros-kinetic-joint-state-publisher sudo apt-get install ros-kinetic-joint-state-publisher-gui将出现下面一个这样的gui调试窗口。
使用rviz查看自己的机器人模型 rviz按照图中序号添加机器人模型。
然后将Fixed Frame 选择base_link,就出现你要小车模型了。
通过joint_state_publisher_gui可以控制模型,自行尝试。按照上面的方法,还可以将TF添加的rviz中显示,如下图这个样子。
这里只是给出了,一个最简单的ROS小车urdf文件功能包编写流程,对于新手来说这就是一个参考的流程。过程中需要注意的地方,都在文章中重点说明了。如果需要更加细化的了解urdf,可以参考官网。但是,这里描述的内容,对于ROS小车已经绰绰有余了。
urdf的缺点:
模型冗长参数修改麻烦没有参数计算能力等等下一章,我们使用xacro优化urdf文件。
以往链接,点击访问。
上一篇:ROS小车开发需要的ROS基础 下一篇:用xacro给自己的ROS小车编写模型 系列文章:从零搭建ROS机器人
如果你感觉,我的文章比较适合你,关注我,点个赞,给你不一样的惊喜。