一、概述:
1.机器人系统仿真:
是通过计算机对实体机器人系统进行模拟的技术,在 ROS 中,仿真实现涉及的内容主要有三:对机器人建模(URDF)、创建仿真环境(Gazebo)以及感知环境(Rviz)等系统性实现。
(1)仿真优势:低成本、高效、高安全性。
(2)仿真缺陷:仿真器所使用的物理引擎目前还不能够完全精确模拟真实世界的物理情况;仿真器构建的是关节驱动器(电机&齿轮箱)、传感器与信号通信的绝对理想情况,目前不支持模拟实际硬件缺陷或者一些临界状态等情形。
2.机器人系统仿真所需组件:
(1)创建机器人模型:
URDF (Unified Robot Description Format,统一(标准化)机器人描述格式) ,以 XML 的方式描述机器人的部分结构,比如底盘、摄像头、激光雷达、机械臂以及不同关节的自由度,该文件可以被 C++ 内置的解释器转换成可视化的机器人模型,是 ROS 中实现机器人仿真的重要组件。
(2)显示各传感器信息:
rviz(ROS Visualization Tool,ROS的三维可视化工具),它的主要目的是以三维方式显示ROS消息,可以将数据进行可视化表达。例如:可以显示机器人模型,可以无需编程就能表达激光测距仪(LRF)传感器中的传感器到障碍物的距离,Kinect或Xtion等三维距离传感器的点云数据(PCD, Point Cloud Data),从相机获取的图像值等。
(3)搭建仿真环境:
Gazebo是一款3D动态模拟器,用于显示机器人模型并创建仿真环境,能够在复杂的室内和室外环境中准确有效地模拟机器人。与游戏引擎提供高保真度的视觉模拟类似,Gazebo提供高保真度的物理模拟,其提供一整套传感器模型,以及对用户和程序非常友好的交互方式。
二、URDF语法讲解:
1.将URDF集成进rviz基本流程:
URDF 不能单独使用,需要结合 Rviz 或 Gazebo。URDF 只是一个文件,需要在 Rviz 或 Gazebo中渲染成图形化的机器人模型。
(1)创建功能包,并导入依赖:
在该功能包下创建四个文件夹:
1)urdf:用于存放机器人模型的URDF或xacro文件;
2)meshes:用于放置URDF中引用的模型渲染文件;
3)launch:用于保存相关启动文件;
4)config:用于保存rviz的配置文件。
(2)编写urdf文件:
在功能包中新建子文件夹:urdf,添加一个.urdf文件,内容如下:
(3)在launch文件中集成URDF与rviz:
在功能包中新建子文件夹:launch,添加一个.launch文件,内容如下:
(4)通过launch文件启动rviz,并加载机器人模型:
PS:编译过程中有可能出现因缺少xacro的包导致编译失败
解决方式是输入以下安装指令安装xacro相关包:
sudo apt-get install ros-noetic-xacro
(5)rviz 启动后,会发现并没有机器人模型,这是因为默认情况下没有添加机器人显示组件,需要手动添加,添加方式如下:
(6)Fixed Frame处要将默认值map改为urdf文件中机器人底座的name(此处设置的是base_link):
(7)重复启动launch文件时,Rviz 之前的组件配置信息不会自动保存,需要重复执行步骤4的操作,为了方便使用,可以使用如下方式优化:
1)在功能包中新建子文件夹config:
2)将文件另存为一个.rviz文件:
2.urdf语法:
URDF文件是一个标准的XML文件,在ROS中预定义了一系列的标签用于描述机器人模型机器人模型可能较为复杂,但是ROS的URDF中机器人的组成却是较为简单,URDF中有四类标签:
:连杆标签;
(1)
......
......
......
......
(2)标签:
标签用于描述机器人某个部件的外观和物理属性,如形状、尺寸、颜色、惯性矩阵、碰撞参数等。机器人的link结构一般如下图所示:
基本的URDF描述语法如下:
......
......
......
子标签的描述内容如下:
示例:demo02_link.urdf
(3)
根据机器人的关节运动形式,可以将其分为六种类型:
与人的关节一样,机器人关节(joint)的主要作用是连接两个刚体(link),这两个link分别称为parent link和child link,如下图所示:
...
在这些joint的属性中,必须指定joint的parent link和child link,其他属性可选:
1)
2)
3)
4)
5)
6)
7)
8)
9)
(4)
基本语法如下:
Gazebo/Black
3.(练习)创建机器人模型,底盘为长方体,在长方体的上方安装一摄像头,摄像头可以沿着z轴360度旋转:
(1)编写demo03_joint.urdf文件:
(2)编写launch文件:
joint_state_publisher节点:可以发布每个joint的状态。
robot_state_publisher节点:将机器人各个link、joint之间的关系,通过TF的形式整理成三维姿态信息发布出去。
(3)运行:
PS:使用launch文件启动rviz时,可能出现如下报错
解决方案 :缺少依赖包,按指令安装以下依赖包即可
sudo apt-get install ros-noetic-robot-state-publisher
sudo apt-get install ros-noetic-joint-state-publisher
sudo apt-get install ros-noetic-joint-state-publisher-gui
补充完以上依赖包后,通过launch文件打开rviz,发现之前存在的status错误全部解决了。
4.base_footprint优化urdf:
之前实现的机器人模型是半沉到地下的,因为默认情况下: 底盘的中心点位于地图原点上,所以会导致这种情况产生。
优化策略:将初始link设置为一个尺寸极小的link(比如半径为0.001m的球体,或边长0.001m的立方体),然后再在初始 link上添加底盘等刚体,这个初始link一般称之为 base_footprint。
base_footprint的相关链接:
DAY5-URDF优化 简单小练习 工具_Zima Blue?的博客-CSDN博客
【ROS_URDF】小车+摄像头+优化footprint的urdf文件,带中文注释_Baily24的博客-CSDN博客
5.(课后作业)urdf文件编写练习:
要求:
(1)新建文件,demo05_test.urdf,并与launch文件集成;
(2)创建一个四轮圆柱状机器人模型,机器人参数如下:底盘为圆柱状,半径 10cm,高 8cm,四轮由两个驱动轮和两个万向支撑轮组成,两个驱动轮半径为 3.25cm,轮胎宽度1.5cm,两个万向轮为球状,半径 0.75cm,底盘离地间距为 1.5cm,与万向轮直径一致(注意joint偏移量的计算)。
作业过程:
(1)创建urdf文件:
(2) 在launch文件中集成URDF与rviz:
(3)编译,通过launch文件启动rviz,并加载机器人模型:
相关链接:
【基于ROS的URDF练习实例】四轮机器人与摄像头的使用_生如昭诩的博客-CSDN博客
6.urdf工具:
URDF提供了一些命令行工具,可以帮助我们检查、梳理模型文件,需要在终端中独立安装:
sudo apt-get install liburdfdom-tools
(1)check_urdf语法检查:
check_urdf <名称>.urdf
check_urdf会解析urdf文件,并且显示解析过程中发现的错误。如果一切正常,在终端中会输出以下信息:
(2)urdf_to_graphiz结构查看:
urdf_to_graphiz <名称>.urdf
urdf_to_graphiz命令可以查看urdf模型的整体结构。
三、URDF优化—xacro:
1.xacro简介:
urdf构建的机器人模型存在以下问题:
(1)在设计关节的位置时,需要按照一定的公式计算,公式是固定的,但是在 URDF 中依赖于人工计算,存在不便,容易计算失误,且当某些参数发生改变时,还需要重新计算;
(2)URDF 中的部分内容是高度重复的,驱动轮与支撑轮的设计实现,不同轮子只是部分参数不同,形状、颜色、翻转量都是一致的,在实际应用中,构建复杂的机器人模型时,更是易于出现高度重复的设计,按照一般的编程涉及到重复代码应该考虑封装。
在 ROS 中,为解决这样的问题,针对urdf模型产生了另一种精简化、可复用、模块化的描述形式——xacro,它具备如下优势:
(1)精简模型代码:在xacro文件中,可以通过创建宏定义的方式定义常量或复用代码,不仅可以减少代码量,而且可以让模型代码更加模块化、更具可读性;
(2)提供可编程接口:xacro的语法支持一些可编程接口,如常量、变量、数学公式、条件语句等,可以让建模过程更加智能有效。
2.xacro语法讲解:
(1)属性与算术运算:
1)属性定义:
2)属性调用:
${属性名称}
3)算术运算:
${数学表达式}
(2)宏:
类似于函数实现,提高代码复用率,优化代码结构,提高安全性。
1)宏定义:
......
2)宏调用:
(3)文件包含:
......
3.xacro文件编写:
demo01.urdf.xacro
4.xacro文件转换成urdf文件:
命令行进入 xacro文件 所属目录,执行:
rosrun xacro xacro <文件名>.xacro > <文件名>.urdf
这样就将 xacro 文件解析为 urdf 文件,并储存在当前路径。
解析前:
解析后:
5.xacro文件集成launch文件:
6.通过launch启动rviz:
(这里笔者做出来的结果总是报错,错误原因应该是demo01.urdf.xacro代码有错误,但笔者尚未找到错误,也尚未在网上找到可用代码)
相关链接:
ROS ERROR_printeger的博客-CSDN博客
使用xacro优化URDF的问题解决_m0_56588389的博客-CSDN博客
四.xacro练习:
1.要求:
(1)将demo05_test.urdf所搭建的机器人,改写为.xacro文件,驱动轮和支撑轮通过宏实现;
(2)将所提供的摄像头与雷达的.xacro文件与机器人底盘组合,用
(3)通过launch文件启动rviz并显示模型。
2.编写xacro文件:
(1)小车底盘的xacro文件:
(2)摄像头的xacro文件:
(3)雷达的xacro文件:
3.组合小车模型文件:
4.编写launch文件:
5.通过launch文件启动rviz:
相关链接:
【ROS进阶篇】第八讲(下) URDF的编程优化Xacro使用_生如昭诩的博客-CSDN博客
五、基于ArbotiX和rviz的仿真器(rviz中控制机器人运动):
1.ArbotiX介绍:
Arbotix是一款控制电机、舵机的控制板,并提供相应的 ros 功能包,这个功能包的功能不仅可以驱动真实的 Arbotix 控制板,它还提供一个差速控制器,通过接受速度控制指令更新机器人的 joint 状态,从而帮助我们实现机器人在 rviz 中的运动。
2.安装ArbotiX:
安装方式一:命令行调用
sudo apt-get install ros-noetic-arbotix
如果命令行安装失败,尝试方式二。
安装方式二:源码安装
git clone https://github.com/vanadiumlabs/arbotix_ros.git
先从 github 下载源码,移至当前工作空间/src下,然后调用catkin_make编译。
3.添加ArbotiX所需的配置文件:
在config文件夹下新建control.yaml文件。
# 该文件是控制器配置,一个机器人模型可能有多个控制器,比如: 底盘、机械臂、夹持器(机械手)....
# 因此,根 name 是 controller
controllers: {
# 单控制器设置
base_controller: {
#类型: 差速控制器
type: diff_controller,
#参考坐标
base_frame_id: base_footprint,
#两个轮子之间的间距
base_width: 0.2,
#控制频率
ticks_meter: 2000,
#PID控制参数,使机器人车轮快速达到预期速度
Kp: 12,
Kd: 12,
Ki: 0,
Ko: 50,
#加速限制
accel_limit: 1.0
}
}
(详细内容参考:http://wiki.ros.org/arbotix_python/diff_controller)
4.launch文件中配置ArbotiX节点:
(1)
(2)
(3)在仿真环境下,需要配置sim为true
5.启动launch文件并配置rviz:
6.控制机器人模型运动:
相关链接:
Rviz中控制机器人模型运动(arbotix)_most delay的博客-CSDN博客_rviz控制机器人运动
六、URDF集成Gazebo:
1.urdf与Gazebo集成的基本流程:
(1)创建功能包并导入依赖:
(2)修改urdf文件(这里以盒状的demo01.urdf的基础修改):
Gazebo/Black
注意, URDF 与 Gazebo 集成时,和 Rviz 有明显区别:
1)必须使用
2)必须使用
3)颜色设置,需要重新使用
(3)launch文件启动Gazebo并显示模型:
1)launch文件:
最后一句话意思是在Gazebo中加载一个机器人模型,该功能由gazebo_ros下的spawn_model提供:
-urdf 加载的是 urdf 文件
-model car 模型名称是 car
-param robot_description 从参数 robot_description 中载入模型
2)显示模型:
2.urdf集成Gazebo示例:
(1)编写封装惯性矩阵算法的xacro文件:
(2)为机器人模型中的每一个link添加collision和inertial标签,并且重置颜色属性:
1)底盘文件(demo05_car_base.urdf.xacro):
Gazebo/Yellow
Gazebo/Red
Gazebo/Red
2)相机文件(demo05_car_camera.urdf.xacro):
Gazebo/Blue
3)雷达文件(demo05_car_laser.urdf.xacro):
Gazebo/White
Gazebo/Black
4)组合底盘、摄像头与雷达的 Xacro 文件(demo05.urdf.xacro):
(3)在launch文件中启动gazebo并添加机器人模型:
3.Gazebo仿真环境搭建:
七、URDF、rviz、Gazebo综合应用:
1.ros_control:
rviz+Arbotix构建的仿真器使用了Arbotix差速控制器实现对机器人模型的控制,但是这款控制器有很大的局限性,无法在ROS丰富的机器人应用中通用。
ros_control是ROS为开发者提供的机器人控制中间件,包含一系列控制器接口、传动装置接口、硬件接口、控制器工具等,可以帮助机器人应用功能包快速落地,提高开发效率。
2.运动控制实现流程:
(1)为已经创建完毕的机器人模型,编写一个单独的xacro文件,添加传动装置以及控制器:
transmission_interface/SimpleTransmission
hardware_interface/VelocityJointInterface
hardware_interface/VelocityJointInterface
1
Debug
true
/
1
true
true
100.0
true
left_wheel2base_link
right_wheel2base_link
${base_link_radius * 2}
${wheel_radius * 2}
1
30
1.8
cmd_vel
odom
odom
base_footprint
(2)将move.xacro文件集成进总的机器人模型文件(以demo05.xacro为载体):
(3)launch文件启动gazebo,加载课程所提供的仿真环境,控制小车运动:
解决方案:
sudo apt-get ros-noetic-teleop-twist-keyboard
结果展示:
3.rviz查看里程计信息:
(1)launch文件启动rviz:
创建demo06_odom.launch文件:
(2)在rviz中添加组件:
1)启动demo06_car.launch文件:
2)启动demo06_odom.launch文件:
相关链接:
6.7.1 机器人系统仿真/URDF、Gazebo与Rviz综合运用/机器人运动控制以及里程计信息显示_janedipan的博客-CSDN博客
4.雷达信息仿真及显示:
(1)为机器人添加雷达配置:
//reference要和laser连杆名称一致
//type雷达类型 name起名字
0 0 0 0 0 0 //6D位姿
true //雷达射线true可视,false不可视
5.5 //雷达射线更新频率 次/s
360 //采样个数,雷达旋转一周采样数
1 //分辨率,每N个射线测距一次,设置大一点设备计算压力小,但是损失精度
-3 //采样范围,单位是弧度,以机器人朝向为中心
3 //逆时针为正,顺时针为负(看下面演示)
0.10 //采样范围 单位 米
30.0
0.01 //采样精度
//高斯噪声,数据采集不可能每次都准确
gaussian
0.0
0.01
/scan //雷达发布的话题!!!
laser
(2)将laser.xacro文件集成进总的机器人模型文件:
(3)launch文件启动gazebo和rviz并显示雷达数据:
相关链接:
ros学习笔记之雷达信息仿真及显示_要好好养胃的博客-CSDN博客
5.摄像头信息仿真及显示:
(1)为机器人添加摄像头配置:
30.0
1.3962634
1280
720
R8G8B8
0.02
300
gaussian
0.0
0.007
true
0.0
/camera
image_raw
camera_info
camera
0.07
0.0
0.0
0.0
0.0
0.0
(2)将laser.xacro文件集成进总的机器人模型文件:
(3)launch文件启动gazebo和rviz并显示摄像头数据:
1)启动gazebo:
2)打开rviz,添加摄像头:
相关链接:
6.7.3 摄像头信息仿真以及显示_赵虚左的博客-CSDN博客
6.kinect信息仿真及显示:
(1)为机器人添加kinect配置:
true
20.0
${60.0*PI/180.0}
R8G8B8
640
480
0.05
8.0
camera
true
10
rgb/image_raw
depth/image_raw
depth/points
rgb/camera_info
depth/camera_info
kinect link名称
0.1
0.0
0.0
0.0
0.0
0.0
0.4
(2)将laser.xacro文件集成进总的机器人模型文件:
相关链接:
机器人系统仿真(十六)——摄像头和kinect信息仿真以及显示_蔡军帅的博客-CSDN博客