建模练习1 —— 手写一个移动机器人urdf模型
1 机器人的定义与组成2 URDF建模方法2.1 < link >2.2 < joint >
3 从零写一个移动机器人URDF模型3.1 使用圆柱体创建底盘3.2 使用圆柱体创建左侧车轮,继续添加3.3 同理,添加右轮模型3.4 这样的小车是无法直立的,再创建两个支撑轮3.5 到此,模型基本创建完毕,但是他还不能感知环境,所以,为他添加一些传感器,在上述基础上,添加laser的Link和joint3.6 添加一个kinetic3.7 检查urdf模型整体结构
学习了好一阵子Gazebo相关和Moveit相关知识,本以为搭建husky和kinova机械臂仿真环境只不过是把下载的软件包修修改改就好了,没必要深究这两个机器人的细致之处,而事实是,经修改后的仿真模型总是bug百出,可能自己还是掌握的不扎实,所以从零开始,看看如何一步一步建模,看看自己“篡改”的代码究竟哪里出了错。
本博客按照古月大神的视频课程整理学习笔记,旨在方便自己今后的回顾与学习。
1 机器人的定义与组成
2 URDF建模方法
URDF:
Unfied Robot Description Format,统一机器人描述格式;可以解析URDF文件中使用XML格式描述的机器人模型;包含link和joint自身及相关属性的描述信息;
2.1 < link >
描述机器人某个刚体部分的外观和物理属性描述连杆尺寸(size)、颜色(color)、形状(shape)、惯性矩阵(inertial matrix)、碰撞参数(collision properties)等每个link都会成为一个坐标系
link的充分描述需要有三大部分:< visual >< collision >< inertial matrix >
<!-- Base link is the center of the robot's bottom plate
-->
<link name
="base_link">
<visual
>
<origin xyz
="0 0 0" rpy
="0 0 0" />
<geometry
>
<mesh filename
="package://husky_description/meshes/base_link.dae" />
</geometry
>
</visual
>
<collision
>
<origin xyz
="${( husky_front_bumper_extend - husky_rear_bumper_extend ) / 2.0} 0 ${base_z_size/4}" rpy
="0 0 0" />
<geometry
>
<box size
="${ base_x_size + husky_front_bumper_extend + husky_rear_bumper_extend } ${base_y_size} ${base_z_size/2}"/>
</geometry
>
</collision
>
<collision
>
<origin xyz
="0 0 ${base_z_size*3/4-0.01}" rpy
="0 0 0" />
<geometry
>
<box size
="${base_x_size*4/5} ${base_y_size} ${base_z_size/2-0.02}"/>
</geometry
>
</collision
>
</link
>
这是husky中的base_link描述
<origin xyz
="0 0 0" rpy
="0 0 0" />
其中的这句代码很关键,与坐标变换有关系,xyz表示在三个坐标轴上的平移变换,单位是米,rpy是坐标系下的旋转偏移,单位是弧度,分别是围绕x、y、z三轴旋转的角度。所以< visual >部分主要描述了长什么样、位置如何。
会发现< collision >部分的geometry是用box描述的,这样做的目的是简化模型,减少碰撞检测的计算量。
对于惯性矩阵参数,如果是标准几何体,就用公式计算即可,如果是不规则物体,则要借助工具比如Solidworks来计算了。
2.2 < joint >
描述两个link之间的关系包括关节运动的位置和速度限制描述机器人关节的运动学和动力学属性
这里的
<origin xyz
="0.2 0.2 0" rpy
="0 0 0" />
描述child link相对于parent link的坐标变换关系。
<axis xyz
="0 0 1"/>
说明z是旋转轴
3 从零写一个移动机器人URDF模型
在catkin_ws/src下,创建功能包
catkin_create_pkg mbot_description urdf xacro
在功能包中建立四个文件夹,分别用于存放特定的文件 接下来编写mbot.urdf文件
3.1 使用圆柱体创建底盘
<?xml version
="1.0"?>
<robot name
="mbot">
<!--
<material name
="Black">
<color rgba
="0 0 0 1"/>
</material
>
<material name
="White">
<color rgba
="1 1 1 0.95"/>
</material
>
<material name
="Blue">
<color rgba
="0 0 1 1"/>
</material
>
<material name
="Yellow">
<color rgba
="1 0.4 0 1"/>
</material
>
<!--
<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"/>
</visual
>
</link
>
</robot
>
然后编写display_mbot_urdf.launch文件,在rviz中可视化一下
<launch
>
<!-- 设置机器人模型路径参数
-->
<param name
="robot_description" textfile
="$(find mbot_description)/urdf/mbot.urdf" />
<!-- 运行joint_state_publisher节点,发布机器人的关节状态
-->
<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
="robot_state_publisher" />
<!-- 运行rviz可视化界面
-->
<node name
="rviz" pkg
="rviz" type
="rviz" args
="-d $(find mbot_description)/config/mbot_urdf.rviz" required
="true" />
</launch
>
catkin_make编译一下工作区 运行rviz
roslaunch mbot_description display_mbot_urdf
.launch
简单配置: Add->RobotModel,出现下图所示白色模型 发现错误,其中的map坐标系是rviz默认的坐标系,这里需要将Fixed Frame改为base_link 这个base_link就是刚刚建立的base_link,所以说,每个link都会建立一个同名的坐标系。
Save Config As到自己的config文件夹下,下次再打开rviz时就会保存上述配置了。
3.2 使用圆柱体创建左侧车轮,继续添加
<!--
<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"/>
</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
>
再用rviz看一下 点击Add,添加TF,可以观看坐标系的姿态关系 也可以把robotmodel取消掉,更直观的查看 上图所示的箭头是一个向量,这个向量就是origin的内容 注意: 左轮的visual中的origin是描述左轮相对于第二个坐标系而言的
3.3 同理,添加右轮模型
<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"/>
</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
>
在rviz中查看
3.4 这样的小车是无法直立的,再创建两个支撑轮
<!--
<link name
="front_caster_link">
<visual
>
<origin xyz
="0 0 0" rpy
="0 0 0"/>
<geometry
>
<sphere radius
="0.015" />
</geometry
>
<material name
="Black"/>
</visual
>
</link
>
<joint name
="front_caster_joint" type
="fixed">
<origin xyz
="0.18 0 -0.095" rpy
="0 0 0"/>
<parent link
="base_link"/>
<child link
="front_caster_link"/>
</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"/>
</visual
>
</link
>
<joint name
="back_caster_joint" type
="fixed">
<origin xyz
="-0.18 0 -0.095" rpy
="0 0 0"/>
<parent link
="base_link"/>
<child link
="back_caster_link"/>
</joint
>
在rviz中查看
3.5 到此,模型基本创建完毕,但是他还不能感知环境,所以,为他添加一些传感器,在上述基础上,添加laser的Link和joint
<!--
<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
>
用rviz查看
3.6 添加一个kinetic
<!--
<link name
="kinect_link">
<visual
>
<origin xyz
="0 0 0" rpy
="0 0 1.5708"/>
<geometry
>
<mesh filename
="package://mbot_description/meshes/kinect.dae" />
</geometry
>
</visual
>
</link
>
<joint name
="kinect_joint" type
="fixed">
<origin xyz
="0.15 0 0.11" rpy
="0 0 0"/>
<parent link
="base_link"/>
<child link
="kinect_link"/>
</joint
>
同时注意在meshes文件夹中添加kinetic的3D描述文件 在rviz中查看
3.7 检查urdf模型整体结构
进入urdf目录下,以终端形式打开 发现在urdf文件夹下生成了两个文件 这样以树形图的方式,joint和link一目了然,便于排查模型错误