目录
简介
相关组件
URDF
rviz
gazebo
总体说明:
素材下载
URDF集成Rviz基本流程
实现流程:
创建功能包,导入依赖
编写 URDF 文件
在 launch 文件中集成 URDF 与 Rviz
在 Rviz 中显示机器人模型
优化 rviz 启动
URDF语法详解
URDF语法详解01_robot
URDF语法详解02_link
案例
URDF语法详解03_joint
属性
子标签
案例
urdf编写
launch编写
修改因python2.7的编码产生的报错
运动关节
base_footprint优化urdf
遇到问题以及解决
urdf练习
新建urdf以及launch文件
底盘搭建
添加驱动轮
添加万向轮
URDF工具
简介
1.check_urdf 语法检查
urdf_to_graphiz 结构查看
机器人操作系统学习、开发与测试过程中,会遇到诸多问题,比如:
场景1:机器人一般价格不菲,学习ROS要购买一台机器人吗?
场景2:机器人与之交互的外界环境具有多样性,如何实现复杂的环境设计?(不同恶劣天气,不能等着恶劣天气出现再去测试吧)
场景3:测试时,直接将未经验证的程序部署到实体机器人运行,安全吗?(无人驾驶一开始也不能直接扔上路测试)
...
在诸如此类的场景中,ROS中的仿真就显得尤为重要了。
1.概念
机器人系统仿真:是通过计算机对实体机器人系统进行模拟的技术,在 ROS 中,仿真实现涉及的内容主要有三:
2.作用
2.1仿真优势:
仿真在机器人系统研发过程中占有举足轻重的地位,在研发与测试中较之于实体机器人实现,仿真有如下几点的显著优势:
1.低成本:当前机器人成本居高不下,动辄几十万,仿真可以大大降低成本,减小风险
2.高效:搭建的环境更为多样且灵活,可以提高测试效率以及测试覆盖率
3.高安全性:仿真环境下,无需考虑耗损问题
2.2仿真缺陷:
机器人在仿真环境与实际环境下的表现差异较大,换言之,仿真并不能完全做到模拟真实的物理世界,存在一些"失真"的情况,原因:
1.仿真器所使用的物理引擎目前还不能够完全精确模拟真实世界的物理情况
2.仿真器构建的是关节驱动器(电机&齿轮箱)、传感器与信号通信的绝对理想情况,目前不支持模拟实际硬件缺陷或者一些临界状态等情形
URDF是 Unified Robot Description Format 的首字母缩写,直译为统一(标准化)机器人描述格式,可以以一种 XML 的方式描述机器人的部分结构,比如底盘、摄像头、激光雷达、机械臂以及不同关节的自由度.....,该文件可以被 C++ 内置的解释器转换成可视化的机器人模型,是 ROS 中实现机器人仿真的重要组件
RViz 是 ROS Visualization Tool 的首字母缩写,直译为ROS的三维可视化工具。它的主要目的是以三维方式显示ROS消息,可以将 数据进行可视化表达。例如:可以显示机器人模型,可以无需编程就能表达激光测距仪(LRF)传感器中的传感 器到障碍物的距离,RealSense、Kinect或Xtion等三维距离传感器的点云数据(PCD, Point Cloud Data),从相机获取的图像值等
以“ros- [ROS_DISTRO] -desktop-full”命令安装ROS时,RViz会默认被安装。
运行使用命令rviz
或rosrun rviz rviz
如果rviz没有安装,请调用如下命令自行安装:
sudo apt install ros-[ROS_DISTRO]-rviz
Gazebo是一款3D动态模拟器,用于显示机器人模型并创建仿真环境,能够在复杂的室内和室外环境中准确有效地模拟机器人。与游戏引擎提供高保真度的视觉模拟类似,
Gazebo提供高保真度的物理模拟,
其提供一整套传感器模型,
以及对用户和程序非常友好的交互方式。
以“ros- [ROS_DISTRO] -desktop-full”命令安装ROS时,gzebo会默认被安装。
运行使用命令gazebo
或rosrun gazebo_ros gazebo
注意1:在 Ubuntu20.04 与 ROS Noetic 环境下,gazebo 启动异常以及解决
问题1:VMware: vmw_ioctl_command error Invalid argument(无效的参数)
解决:
echo "export SVGA_VGPU10=0" >> ~/.bashrc
source .bashrc
问题2:[Err] [REST.cc:205] Error in REST request
解决:sudo gedit ~/.ignition/fuel/config.yaml
然后将url : https://api.ignitionfuel.org
使用 # 注释
再添加url: https://api.ignitionrobotics.org
问题3:启动时抛出异常:[gazebo-2] process has died [pid xxx, exit code 255, cmd.....
解决:killall gzserver
和killall gzclient
注意2:如果 gazebo没有安装,请自行安装:
1.添加源:
sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main"
>
/etc/apt/sources.list.d/gazebo-stable.list'
wget http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add -
2.安装:
sudo apt update
sudo apt install gazebo11
sudo apt install libgazebo11-dev
机器人的系统仿真是一种集成实现,主要包含三部分:
URDF 用于创建机器人模型
Gzebo 用于搭建仿真环境
Rviz 图形化的显示机器人各种传感器感知到的环境信息
三者应用中,只是创建 URDF 意义不大,一般需要结合 Gazebo 或 Rviz 使用,在 Gazebo 或 Rviz 中可以将 URDF 文件解析为图形化的机器人模型,一般的使用组合为:
如果非仿真环境,那么使用 URDF 结合 Rviz 直接显示感知的真实环境信息
如果是仿真环境,那么需要使用 URDF 结合 Gazebo 搭建仿真环境,并结合 Rviz 显示感知的虚拟环境信息
学习安排:
先介绍 URDF 与 Rviz 集成使用,在 Rviz 中只是显示机器人模型,主要用于学习 URDF 语法
再介绍 URDF 与 Gazebo 集成,主要学习 URDF 仿真相关语法以及仿真环境搭建
最后集成 URDF 与 Gazebo 与 Rviz,实现综合应用
素材链接:
打开主目录
然后复制链接
输入终端
https://github.com/zx595306686/sim_demo.git
如果下载有问题把https://换成 git://
下载完成
URDF 不能单独使用,需要结合 Rviz 或 Gazebo,URDF 只是一个文件,需要在 Rviz 或 Gazebo 中渲染成图形化的机器人模型,当前,首先演示URDF与Rviz的集成使用,因为URDF与Rviz的集成较之于URDF与Gazebo的集成更为简单,后期,基于Rviz的集成实现,我们再进一步介绍URDF语法。
需求描述:
在 Rviz 中显示一个盒状机器人
准备:新建功能包,导入依赖
核心:编写 urdf 文件
核心:在 launch 文件集成 URDF 与 Rviz
在 Rviz 中显示机器人模型
创建一个新的功能包,名称自定义,导入依赖包:urdf
与xacro
mkdir -p 自定义空间名称/src
cd 自定义空间名称
catkin_make
在当前功能包下,再新建几个目录:
urdf
: 存储 urdf 文件的目录
meshes
:机器人模型渲染文件(暂不使用)
config
: 配置文件
launch
: 存储 launch 启动文件
新建一个子级文件夹:urdf
(可选),文件夹中添加一个.urdf
文件,复制如下内容:
在launch
目录下,新建一个 launch 文件,该 launch 文件需要启动 Rviz,并导入 urdf 文件,Rviz 启动后可以自动载入解析urdf
文件,并显示机器人模型,
核心问题:如何导入 urdf 文件? 在 ROS 中,可以将 urdf 文件的路径设置到参数服务器,使用的参数名是:robot_description
,示例代码如下:
然后启动
出现报错,是因为参考坐标系不对
在urdf文件里我们给刚体起了个名字
把map改成对应的即可
然后也可以加个坐标系
效果如下
重复启动launch
文件时,Rviz 之前的组件配置信息不会自动保存,需要重复执行步骤4的操作,为了方便使用,可以使用如下方式优化:
首先,将当前配置保存进config
目录
然后,launch
文件中 Rviz 的启动配置添加参数:args
,值设置为-d 配置文件路径
然后再重新启动
就是配置好的
点击右侧工具栏Invert Z axis就是反转坐标系
按住滚轮:移动视角
按住右键拖拉:放大缩小
左键拖拉也是移动视角
URDF 文件是一个标准的 XML 文件,在 ROS 中预定义了一系列的标签用于描述机器人模型,机器人模型可能较为复杂,但是 ROS 的 URDF 中机器人的组成却是较为简单,可以主要简化为两部分:
连杆(link标签):刚体部分的统称,外壳,车轮,支架等
关节(joint标签):连杆之间的连接(不可见)
接下来我们就通过案例了解一下 URDF 中的不同标签:
关于gazebo标签,后期在使用 gazebo 仿真时,才需要使用到,用于配置仿真环境所需参数,比如: 机器人材料属性、gazebo插件等,但是该标签不是机器人模型必须的,只有在仿真时才需设置
另请参考:
robot
urdf 中为了保证 xml 语法的完整性,使用了robot
标签作为根标签,所有的 link 和 joint 以及其他标签都必须包含在 robot 标签内,在该标签内可以通过 name 属性设置机器人模型的名称
1.属性
name: 指定机器人模型的名称
2.子标签
其他标签都是子级标签
urdf 中的 link 标签用于描述机器人某个部件(也即刚体部分)的外观和物理属性,比如: 机器人底座、轮子、激光雷达、摄像头...每一个部件都对应一个 link, 在 link 标签内,可以设计该部件的形状、尺寸、颜色、惯性矩阵、碰撞参数等一系列属性
1.属性
2.子标签
visual ---> 描述外观(对应的数据是可视的)
geometry 设置连杆的形状
标签1: box(盒状)
标签2: cylinder(圆柱)
标签3: sphere(球体)
标签4: mesh(为连杆添加皮肤)
origin 设置偏移量与倾斜弧度
属性1: xyz=x偏移 y便宜 z偏移
属性2: rpy=x翻滚 y俯仰 z偏航 (单位是弧度)
metrial 设置材料属性(颜色)
属性: name
标签: color
collision ---> 连杆的碰撞属性
Inertial ---> 连杆的惯性矩阵
在此,只演示visual
使用。
需求:分别生成长方体、圆柱与球体的机器人部件
复制以下代码
然后编码launch文件(因为urdf需要通过rviz或者gazebo启动)
然后运行
以下分别为
长方体
圆柱
球体
对应修改urdf里的即可
复制对应的mesh复制到工作空间下(不复制也可以,只是路径设置比较麻烦)
完成复制
filename="package://" 里的package://就类似于https://
然后运行
xyz设置机器人再 x y z上的偏移量
rpy设置倾斜角度 x(翻滚) y(俯仰) z(偏航)
偏航角度(3.14=180度 1.57=90度)
更改代码如下下
小车翻滚并且移动
r
g
b
a:透明度
四者取值介于0-1
更改代码后
总结:link都是基于基础坐标系创建的
urdf 中的 joint 标签用于描述机器人关节的运动学和动力学属性,还可以指定关节运动的安全极限,机器人的两个部件(分别称之为 parent link 与 child link)以"关节"的形式相连接,不同的关节有不同的运动形式: 旋转、滑动、固定、旋转速度、旋转角度限制....,
parent link 与 child link
比如车轮中
底盘是parent link
车轮是child link
比如:安装在底座上的轮子可以360度旋转,而摄像头则可能是完全固定在底座上。
joint标签对应的数据在模型中是不可见的
name ---> 为关节命名
type ---> 关节运动形式
continuous: 旋转关节,可以绕单轴无限旋转
revolute: 旋转关节,类似于 continues,但是有旋转角度限制
prismatic: 滑动关节,沿某一轴线移动的关节,有位置极限
planer: 平面关节,允许在平面正交方向上平移或旋转
floating: 浮动关节,允许进行平移、旋转运动
fixed: 固定关节,不允许运动的特殊关节
parent(必需的)
parent link的名字是一个强制的属性:
child(必需的)
child link的名字是一个强制的属性:
origin
axis
需求:创建机器人模型,底盘为长方体,在长方体的前面添加一摄像头,摄像头可以沿着 Z 轴 360 度旋转。
这样运行会有问题
设置的child link在车子里面
并且还有以下报错(没有从camera 到 base link的坐标变换)
原因:
rviz中显示urdf时,必须发布不同部件之间的坐标关系
解决:
ros中提供关于机器人模型显示的坐标发布相关节点
PS:
1.状态发布节点在此是必须的:
2.关节运动控制节点(可选),会生成关节控制的UI,用于测试关节运动是否正常。
修改后运行
修改因python2.7的编码产生的报错
出现这个报错是因为python2.7的编码问题
david@david-VirtualBox:~$ sudo gedit /usr/lib/python2.7/sitecustomize.py
清除以下内容
# install the apport exception handler if available
try:
import apport_python_hook
except ImportError:
pass
else:
apport_python_hook.install()
改为
然后刷新环境变量重新运行
成功
(5条消息) ERROR: cannot launch node of type [joint_state_publisher_gui/joint_state_publisher_gui]: joint_state_放羊Wa的博客-CSDN博客https://blog.csdn.net/weixin_45392081/article/details/118075798
对应报错其他问题进行修改
为了保证摄像头摆在车子的顶部平面
运动关节
关节运动控制节点(可选),会生成关节控制的UI,用于测试关节运动是否正常。
就可以通过ros的内置gui来控制旋转
加上tf看得更清楚
去掉base link看得更清楚
base_footprint优化urdf
前面实现的机器人模型是半沉到地下的,
因为默认情况下: 底盘的中心点位于地图原点上,所以会导致这种情况产生,
可以使用的优化策略,将初始 link 设置为一个尺寸极小的 link(比如半径为 0.001m 的球体,或边长为 0.001m 的立方体),然后再在初始 link 上添加底盘等刚体,这样实现,虽然仍然存在初始link半沉的现象,但是基本可以忽略了。这个初始 link 一般称之为 base_footprint
复制以下代码
新建一个link
然后构建一个joint,连接base_link与新建的link
然后让关节上浮底盘一半高度即可
这样就不会出现底盘下沉
然后对应改名
然后运行
修改参考坐标系
左边菜单
就不会下沉了
小结:实际上就是让原来的urdf通过关节连接一个新的很小很小的link,然后上升底盘一半高度,视觉上底盘就不会一半下沉了
遇到问题以及解决
问题1:
命令行输出如下错误提示
UnicodeEncodeError: 'ascii' codec can't encode characters in position 463-464: ordinal not in range(128)
[joint_state_publisher-3] process has died [pid 4443, exit code 1, cmd /opt/ros/melodic/lib/joint_state_publisher/joint_state_publisher __name:=joint_state_publisher __log:=/home/rosmelodic/.ros/log/b38967c0-0acb-11eb-aee3-0800278ee10c/joint_state_publisher-3.log].
log file: /home/rosmelodic/.ros/log/b38967c0-0acb-11eb-aee3-0800278ee10c/joint_state_publisher-3*.log
Copy
rviz中提示坐标变换异常,导致机器人部件显示结构异常
原因:编码问题导致的
解决:去除URDF中的中文注释
问题2:[ERROR] [1584370263.037038]: Could not find the GUI, install the 'joint_state_publisher_gui' package
解决:sudo apt install ros-noetic-joint-state-publisher-gui
urdf练习
需求描述:
创建一个四轮圆柱状机器人模型,机器人参数如下,底盘为圆柱状,半径 10cm,高 8cm,四轮由两个驱动轮和两个万向支撑轮组成,两个驱动轮半径为 3.25cm,轮胎宽度1.5cm,两个万向轮为球状,半径 0.75cm,底盘离地间距为 1.5cm(与万向轮直径一致)
实现流程:
创建机器人模型可以分步骤实现
-
新建 urdf 文件,并与 launch 文件集成
-
搭建底盘
-
在底盘上添加两个驱动轮
-
在底盘上添加两个万向轮
新建urdf以及launch文件
urdf 文件:基本实现
launch 文件:
底盘搭建
这里的0.055=离地0.015+底盘一半高0.04
添加驱动轮
z = 离地间距 + 底盘长度 / 2 - 轮胎半径 = 1.5 + 4 - 3.25 = 2.25(cm)
这一步是为了让 轮胎的最高点z坐标 跟 底盘的坐标原点z 在同一高度
添加万向轮
x = 自定义(底盘半径 - 万向轮半径) = 0.1 - 0.0075 = 0.0925(cm)
y = 0
z = 底盘长度 / 2 + 离地间距 / 2 = 0.08 / 2 + 0.015 / 2 = 0.0475
万向轮实际上就是标签设置为1 1 1即可
实际上z就是万向轮的link中心距离底盘link中心的距离(在高度z上)
URDF工具
简介
在 ROS 中,提供了一些工具来方便 URDF 文件的编写,比如:
-
check_urdf
命令可以检查复杂的 urdf 文件是否存在语法问题
-
urdf_to_graphiz
命令可以查看 urdf 模型结构,显示不同 link 的层级关系
当然,要使用工具之前,首先需要安装,安装命令:sudo apt install liburdfdom-tools
1.check_urdf 语法检查
进入urdf文件所属目录,调用:check_urdf urdf文件
,如果不抛出异常,说明文件合法,否则非法
urdf_to_graphiz 结构查看
进入urdf文件所属目录,调用:urdf_to_graphiz urdf文件
,当前目录下会生成 pdf 文件
这是打开pdf
evince mycar.pdf