机器人建模与仿真(二)——机器人URDF模型仿真
总述
在ROS中,机器人的模型一般放在RobotName_description功能包下。
一、创建机器人描述功能包
catkin_create_pkg mbot_description urdf xacro
机器人模型、描述文件在ROS里,通常的以 机器人名_description,并且需要依赖urdf功能包,解析模型 和 xacro(优化urdf用的)依赖。
在RobotName_description功能包下创建几个不同作用的文件夹,包含urdf、meshes、launch和config四个文件夹。
- urdf:存放机器人模型的URDF或xacro文件
- meshes:放置URDF中引用的模型渲染文件,机器人外观纹理,让外观和实际更相似,通过三维设计软件导出,放置此文件夹下
- launch:保存相关启动文件
- config:保存rviz的配置文件、功能包的配置文件
二、创建URDF模型
在了解了URDF模型中常用的标签和语法,使用这些基本语法创建机器人底盘模型。
这个机器人底盘模型有7个link和6个joint。7个link包括1个机器人底板、2个电机、2个驱动轮和2个万向轮;6个joint负责将驱动轮、万向轮、电机安装到底板上,并设置相应的连接方式。
<?xml version="1.0" ?>
<robot name="mrobot_chassis">
//robot name 标签用于定义所描述机器人的名称
<link name="base_link">
<visual> //
<origin xyz=" 0.1 0.1 0.1" rpy="0 0 0" />
<geometry>
<cylinder length="0.005" radius="0.13"/>
</geometry>
<material name="yellow">
<color rgba="1 0.4 0 1"/>
</material>
</visual>
</link>
//link标签描述了机器人某个刚体部分的外观和物理属性,包括尺寸,颜色,形状惯性和碰撞参数等,visual...../visual 标签描述机器人某个部件的外观参数等。origin 标签描述了所绘制外观geometry的坐标起点,一般对于规则形状的外观坐标起点位于规则形状的重心位置, cylinder 标签描述了这个圆柱体的尺寸,material 标签用于描述外观的颜色等信息
<joint name="base_left_motor_joint" type="fixed"> //joint...../joint标签用于描述机器人关节的运动学和动力属性
<origin xyz="0.1 0.1 0.1" rpy="0 0 0" />
<parent link="base_link"/>
<child link="left_motor" />
</joint>
//上述joint...../joint标签中一般描述origin parent child等参数,origin描述了joint连接点基于parent link="base_link"
坐标的偏移量,一般在rviz仿真中左上角Fixed Frame 的map选项设置成base_link,则base_link在rviz中为坐标原点,那么 origin所描述的joint为基于坐标原点的偏移量,parent为jiont的支撑连接部件,child为子部件,joint就为子部件和支撑连接部件 的关节
<link name="left_motor">
<visual>
<origin xyz="0.2 0.2 0.2" rpy="0 0 0" />
<geometry>
<cylinder radius="0.02" length = "0.08"/>
</geometry>
<material name="gray">
<color rgba="0.75 0.75 0.75 1"/>
</material>
</visual>
</link>
//link name="left_motor"标签为base_left_motor_joint连接件的子部件,其中origin描述了该部件基于base_left_motor_joint关节
坐标的偏移点,base_left_motor_joint关节的坐标原点为origin xyz="0.1 0.1 0.1",若left_motor部件的origin xyz="0.2 0.2 0.2"
则表示left_motor所描述部件基于base_left_motor_joint关节坐标xyz="0.1 0.1 0.1"的偏移量为xyz="0.2 0.2 0.2"
<joint name="left_wheel_joint" type="continuous">
<origin xyz="0.5 0.0485 0" rpy="0 0 0"/>
<parent link="left_motor"/>
<child link="left_wheel_link"/>
<axis xyz="0 1 0"/>
</joint>
//连接关节joint name="left_wheel_joint" 为left_motor和left_wheel_link关节点,left_wheel_link为left_motor的子部件,其中
left_wheel_joint的基础坐标是基于parent link="left_motor"的关节joint name="base_left_motor_joint" 的基础坐标偏移量
而非left_motor的origin偏移量
.......
..........
</robot>
URDF提供了一些命令行工具,可以帮助我们检查、梳理模型文件,需要在终端中独立安装:
sudo apt-get install liburdfdom-tools
然后使用check_urdf命令对描述机器人文件进行检查:
check_urdf #<机器人描述名称>.urdf
check_urdf命令会解析URDF文件,并且显示解析过程中发现的错误。如果一切正常,在终端中会无报错输出。
还可以使用urdf_to_graphiz命令查看URDF模型的整体结构:
urdf_to_graphiz #<机器人描述名称>.urdf
执行urdf_to_graphiz命令后,会在当前目录下生成一个pdf文件,打开该文件,可以看到模型的整体结构图。
三、URDF模型解析
四、在rviz中显示模型
完成URDF模型的设计后,可以使用rviz将该模型可视化显示出来,检查是否符合设计目标。
编辑launch启动文件
<launch>
<!-- param是要加载ros的一个参数:robot_description (描述机器人的具体模型)-->
<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>
- joint_state_publisher:发布每个joint(除fixed类型)的状态,而且可以通过UI界面对joint进行控制
- robot_state_publisher:将机器人各个links、joints之间的关系,通过TF的形式,整理成三维姿态信息发布
打开终端运行该launch文件,如果一切正常,可以在打开的rviz中看到机器人模型。
五、改进URDF模型
1、添加物理和碰撞属性
2、使用xacro优化URDF
(1)使用常量定义
(2)调用数学公式
(3)使用宏定义
3、xacro文件引用
4、显示优化后的模型
(1)将xacro文件转换成URDF文件
(2)直接调用xacro文件解析器
六、添加传感器模型
1、添加摄像头
2、添加Kinect
3、添加激光雷达
七、基于ArbotiX和rviz的仿真器
1、安装ArbotiX
2、配置ArbotiX控制器
<1>创建launch文件
<2>创建配置文件
3、运行仿真环境