ROS的TF坐标变换
TF 坐标变换
坐标转换是一个坐标在不同坐标系下的表示,而坐标系转换是不同坐标系的相对位姿关系。ROS中机器人模型包含大量的部件,每一个部件统称之为link(比如手部、头部、某个关节、某个连杆),每一个link上面对应着一个frame(坐标系), 用frame表示该部件的坐标系,frame和link是绑定在一起的。
TF是一个通俗的名称,实际上它有很多含义
可以被当做是一种标准规范,这套标准定义了坐标转换的数据格式和数据结构.tf本质是树状的数据结构,即"tf tree"。
tf也可以看成是一个话题 /tf,话题中的消息保存的就是tf tree的数据结构格式。维护了整个机器人的甚至是地图的坐标转换关系。维持并更新机器人整个坐标系的话题是/tf,/tf话题表示的内容是整个机器人的tf树,而非仅仅是某两个坐标系的转换关系,这样的话,/tf话题是需要很多的节点来维护的,每一个节点维护两个frame之间的关系。
tf还可以看成是一个package,它当中包含了很多的工具.比如可视化,查看关节间的tf,debug tf等等
tf含有一部分的API接口,用来节点程序中的编程。TF对发布器与订阅器进行了封装,使开发者通过TF的接口更加简单地建立对TF树中某些坐标系转换关系的维护与订阅
tf是一个树状结构,维护坐标系之间的关系,靠话题通信机制来持续地发布不同link之间的坐标关系。
作为树状结构,要保证父子坐标系都有某个节点在持续地发布他们之间的位姿关系,才能使树状结构保持完整。只有父子坐标系的位姿关系能被正确的发布,才能保证任意两个frame之间的连通。如果出现某一环节的断裂,就会引发error系统报错.所以完整的tf tree不能有任何断层的地方,这样我们才能查清楚任意两个frame之间的关系。
每两个相邻frame之间靠节点发布它们之间的位姿关系,这种节点称为broadcaster。broadcaster就是一个发布器publisher,如果两个frame之间发生了相对运动,broadcaster就会发布相关消息。
机器人系统上,有多个传感器,如激光雷达、摄像头等,有的传感器是可以感知机器人周边的物体方位(或者称之为:坐标,横向、纵向、高度的距离信息)的,以协助机器人定位障碍物,可以直接将物体相对该传感器的方位信息,等价于物体相对于机器人系统或机器人其它组件的方位信息吗?显示是不行的,这中间需要一个转换过程。更具体描述如下:
场景1:雷达与小车现有一移动式机器人底盘,在底盘上安装了一雷达,雷达相对于底盘的偏移量已知,现雷达检测到一障碍物信息,获取到坐标分别为(x,y,z),该坐标是以雷达为参考系的,如何将这个坐标转换成以小车为参考系的坐标呢?
场景2:现有一带机械臂的机器人(比如:PR2)需要夹取目标物,当前机器人头部摄像头可以探测到目标物的坐标(x,y,z),不过该坐标是以摄像头为参考系的,而实际操作目标物的是机械臂的夹具,当前我们需要将该坐标转换成相对于机械臂夹具的坐标,这个过程如何实现?
当然,根据我们高中学习的知识,在明确了不同坐标系之间的的相对关系,就可以实现任何坐标点在不同坐标系之间的转换,但是该计算实现是较为常用的,且算法也有点复杂,因此在 ROS 中直接封装了相关的模块: 坐标变换(TF)。
概念词解释
tf:TransForm Frame,坐标变换
坐标系:ROS 中是通过坐标系统开标定物体的,确切的将是通过右手坐标系来标定的。
注意
在ROS中坐标变换最初对应的是tf,不过在 hydro 版本开始, tf 被弃用,迁移到 tf2,后者更为简洁高效,tf2对应的常用功能包有:
tf2_geometry_msgs:可以将ROS消息转换成tf2消息。
tf2: 封装了坐标变换的常用消息。
tf2_ros:为tf2提供了roscpp和rospy绑定,封装了坐标变换常用的API。
使用TF主要两个部分
1、监听TF变换
接受并缓存系统中发布的所有坐标变换数据,并从中查询所需要的坐标变换关系
2、广播TF变换
向系统中广播坐标系之间的坐标变换关系,系统中可能会存在多个不同部分的TF变换广播,每个广播可以直接将坐标变换关系插入TF树中,不需要再进行同步
基于TF的乌龟运动跟随
关闭之前的所有终端,打开一个新的终端,启动小乌龟的跟随案例。
roslaunch turtle_tf turtle_tf_demo.launch
运行后可以看到两只小乌龟,其中一直在朝着另一只移动
启动新的终端,打开键盘控制节点,控制原本静止的乌龟进行移动
rosrun turtlesim turtle_teleop_key
查看此时的TF树
rosrun tf view_frames
在当前运行指令的目录下会生成TF坐标的PDF文件,可以看到当前系统存在三个坐标系world 、turtle1 、turtle2
world是世界坐标系,作为系统的基础坐标系,其他坐标系都相对于该坐标系建立。所以world坐标系是TF树的根节点,相对于world坐标系,两只乌龟分别建立了自己的坐标系,
这两个坐标系的原点就是乌龟在世界坐标系下的坐标位置
要让turtle2跟随turtle1移动,等价于让坐标系turtle2跟随 坐标系turtle1移动,这就需要知道turtle2于turtle1之间的坐标变换。
三者的坐标变换关系可用如下公式表示
Tturtle1_turtle2 = Tturtle1_world X Tworld_turtle2
使用tf_echo可以查看当前状态下两乌龟坐标系之间的变换关系
也可以通过rviz 图形界面更加形象看到这三者之间的坐标关系
rosrun rviz rviz -d rospack find turtle_tf /rviz/turtle_rviz.rviz
能够随时知道turtle2与turtle1之间的坐标变换后就能计算两乌龟之间的距离和角度,就能控制turtle2向turtle1移动
TF工具
- tf_monitor :打印TF树中所有坐标系的发布状态,也可以通过输入参数来查看指定坐标系之间的发布状态
rosrun tf tf_monitor #显示当前坐标变换树的信息,主要是名称和实时的时间延时
- tf_echo :查看指定坐标系之间的变换关系
rosrun tf tf_echo source_frame target_frame
- view_frames : 可视化调试工具,生成PDF文件,显示整个TF树信息
rosrun tf view_frames
这个工具首先订阅/tf,订阅5秒钟,根据这段时间接受到的tf信息,绘制成一张tf tree,然后创建成一个pdf图。
将会以图形的形式显示出TF树中所有的frame和两个frame 的父子关系及其Broadcaster、Average rate等
坐标数据类型
订阅发布模型中数据载体 msg 是一个重要实现,首先需要了解一下,在坐标转换实现中常用的 msg:geometry_msgs/TransformStamped
和geometry_msgs/PointStamped
前者用于传输坐标系相关位置信息,后者用于传输某个坐标系内坐标点的信息。在坐标变换中,频繁的需要使用到坐标系的相对关系以及坐标点信息。
1.geometry_msgs/TransformStamped
命令行键入:rosmsg info geometry_msgs/TransformStamped
std_msgs/Header header #头信息
uint32 seq #|-- 序列号
time stamp #|-- 时间戳
string frame_id #|-- 坐标 ID
string child_frame_id #子坐标系的 id
geometry_msgs/Transform transform #坐标信息
geometry_msgs/Vector3 translation #偏移量
float64 x #|-- X 方向的偏移量
float64 y #|-- Y 方向的偏移量
float64 z #|-- Z 方向上的偏移量
geometry_msgs/Quaternion rotation #四元数
float64 x
float64 y
float64 z
float64 w
四元数用于表示坐标的相对姿态
2.geometry_msgs/PointStamped
命令行键入:rosmsg info geometry_msgs/PointStamped
std_msgs/Header header #头
uint32 seq #|-- 序号
time stamp #|-- 时间戳
string frame_id #|-- 所属坐标系的 id
geometry_msgs/Point point #点坐标
float64 x #|-- x y z 坐标
float64 y
float64 z
数据集录制
机器人传感器获取到的信息,有时我们可能需要时时处理,有时可能只是采集数据,事后分析,比如:
机器人导航实现中,可能需要绘制导航所需的全局地图,地图绘制实现,有两种方式,方式1:可以控制机器人运动,将机器人传感器感知到的数据时时处理,生成地图信息。方式2:同样是控制机器人运动,将机器人传感器感知到的数据留存,事后,再重新读取数据,生成地图信息。两种方式比较,显然方式2使用上更为灵活方便。
在ROS中关于数据的留存以及读取实现,提供了专门的工具: rosbag。
概念
是用于录制和回放 ROS 主题的一个工具集。实现了数据的复用,方便调试、测试。rosbag本质也是ros的节点,当录制时,rosbag是一个订阅节点,可以订阅话题消息并将订阅到的数据写入磁盘文件;当重放时,rosbag是一个发布节点,可以读取磁盘文件,发布文件中的话题消息。
rosbag命令详细介绍
rosbag record
rosbag record
订阅多个话题并将所有发布在这些话题上的消息写入 bag 文件。该文件包含了按顺序排列的、序列化的 ROS 消息,这些消息被直接写入单个文件。这种格式在性能和磁盘使用方面是最友好的。如果需要进一步减少磁盘使用量,可以在创建 bag 文件时启用压缩。
如果您需要记录高带宽的数据(例如来自摄像头的消息),强烈建议在与摄像头相同的机器上运行 rosbag record
,并将文件存储在本地硬盘上。
**record <topic-names>**
记录指定话题的 bag 文件:
rosbag record rosout tf cmd_vel
-h, --help
显示帮助信息并退出:
rosbag record -h
-a, --all
记录所有话题:
rosbag record -a
注意:rosbag 会定期轮询 master 来发现新的话题,因此 rosbag record -a
可能会错过任何话题上发布的初始消息。
-e, --regex
使用正则表达式匹配话题:
rosbag record -e "/(.*)_stereo/(left|right)/image_rect_color"
记录所有名称中包含“sensors”的话题:
rosbag record -e "(.*)sensors(.*)"
-p, --publish
(ROS Melodic 中新增)
当记录器开始写入新的 bag 文件时,发布一条消息:
rosbag record -p
-x EXCLUDE_REGEX, --exclude=EXCLUDE=REGEX
排除匹配给定正则表达式的话题(可结合 -a
或 -e
使用):
rosbag record -e "/wide_stereo(.*)" -x "(.*)/points(.*)"
-q, --quiet
禁止控制台输出:
rosbag record -q /chatter
-d, --duration
指定录制的最大持续时间:
rosbag record --duration=30 /chatter
rosbag record --duration=5m /chatter
rosbag record --duration=2h /chatter
-o PREFIX, --output-prefix=PREFIX
在 bag 文件名之前添加前缀:
rosbag record -o session1 /chatter
-O NAME, --output-name=NAME
将录制的内容写入 NAME.bag
文件:
rosbag record -O session2_090210.bag /chatter
--split
当达到最大大小或时长时,分割 bag 文件:
rosbag record --split --size=1024 /chatter
rosbag record --split --duration=30 /chatter
--max-splits=MAX_SPLITS
最多分割 MAX_SPLITS
次,之后开始删除最旧的文件:
rosbag record --split --size 1024 --max-splits 3 /chatter
-b SIZE, --buffsize=SIZE
使用大小为 SIZE
MB 的内部缓冲区(默认值为 256,0 表示无限制):
rosbag record -b 1024 /chatter
--chunksize=SIZE
高级设置。将数据记录到大小为 SIZE
KB 的块中(默认值为 768):
rosbag record --chunksize=1024 /chatter
-l NUM, --limit=NUM
每个话题只记录 NUM
条消息:
rosbag record -l 1000 /chatter
--node=NODE
记录特定节点订阅的所有话题:
rosbag record --node=/joy_teleop
-j, --bz2
使用 BZ2 压缩:
rosbag record -j /chatter
--lz4
使用 LZ4 压缩:
rosbag record --lz4 /chatter
--tcpnodelay
订阅话题时使用 TCP_NODELAY
传输提示。
--udp
订阅话题时使用 UDP 传输提示。
rosbag info
rosbag info
显示 bag 文件内容的概要信息,包括开始和结束时间、话题及其类型、消息计数、中位数频率及压缩统计信息。
info <bag-files>
显示 bag 文件的内容概要:
rosbag info session*.bag
rosbag play
rosbag play
读取一个或多个 bag 文件的内容,并以时间同步的方式进行回放。回放会立即开始,接下来的消息会按照接收时的时间偏移发布。
play <bag-files>
回放给定的 bag 文件:
rosbag play recorded1.bag recorded2.bag
**-h, --help**
显示帮助信息并退出:
rosbag play -h
其余内容类似,涵盖了不同命令和选项的详细使用方法。
rosbag使用_命令行
ROS 内置的乌龟案例并操作,操作过程中使用 rosbag 录制,录制结束后,实现重放。
1.准备
创建目录保存录制的文件,关闭所有终端,打开新的终端输入下面的指令。
mkdir ./dateset
cd dateset
2.启动小乌龟的跟随案例
roslaunch turtle_tf turtle_tf_demo.launch
3.开始录制
rosbag record -a -O turtle
操作小乌龟一段时间,结束录制使用 ctrl + c,在创建的目录中会生成bag文件。
4.查看文件
rosbag info turtle.bag
5.回放文件
rosbag play turtle.bag
重启乌龟节点,会发现,乌龟按照录制时的轨迹运动。
命令实现不够灵活,可以使用编码的方式,增强录制与回放的灵活性,本节将通过简单的读写实现演示rosbag的编码实现。
rqt工具
之前,在 ROS 中使用了一些实用的工具,比如: ros_bag 用于录制与回放、tf2_tools 可以生成 TF 树 ..... 这些工具大大提高了开发的便利性,但是也存在一些问题: 这些工具的启动和使用过程中涉及到一些命令操作,应用起来不够方便,在ROS中,提供了rqt工具箱,在调用工具时以图形化操作代替了命令操作,应用更便利,提高了操作效率,优化了用户体验。
概念
ROS基于 QT 框架,针对机器人开发提供了一系列可视化的工具,这些工具的集合就是rqt。可以方便的实现 ROS 可视化调试,并且在同一窗口中打开多个部件,提高开发效率,优化用户体验。
组成
rqt 工具箱组成有三大部分
rqt——核心实现,开发人员无需关注
rqt_common_plugins——rqt 中常用的工具套件
rqt_robot_plugins——运行中和机器人交互的插件(比如: rviz)
rqt安装启动与基本使用
1.安装
一般只要你安装的是desktop-full版本就会自带工具箱
如果需要安装可以以如下方式安装
sudo apt-get install ros-melodic-rqt
sudo apt-get install ros-melodic-rqt-common-plugins
2.启动
使用rqt前,关闭之前所有终端,启动小乌龟的跟随案例
roslaunch turtle_tf turtle_tf_demo.launch
rqt
的启动方式有两种:
方式1:
rqt
方式2:
rosrun rqt_gui rqt_gui
3.基本使用
启动 rqt 之后,可以通过 plugins 添加所需的插件
rqt常用插件:rqt_graph
简介:可视化显示计算图
启动:可以在 rqt 的 plugins 中添加,或者使用rqt_graph
启动
URDF模型
机器人操作系统学习、开发与测试过程中,会遇到诸多问题,比如:
场景1:机器人一般价格不菲,学习ROS要购买一台机器人吗?场景2:机器人与之交互的外界环境具有多样性,如何实现复杂的环境设计?场景3:测试时,直接将未经验证的程序部署到实体机器人运行,安全吗?...
在诸如此类的场景中,ROS中的仿真就显得尤为重要了。
概念
机器人系统仿真是通过计算机对实体机器人系统进行模拟的技术,在 ROS 中,仿真实现涉及的内容主要有三:对机器人建模(URDF)、创建仿真环境(Gazebo)以及感知环境(Rviz)等系统性实现。
作用
仿真优势:
仿真在机器人系统研发过程中占有举足轻重的地位,在研发与测试中较之于实体机器人实现,仿真有如下几点的显著优势:
1.低成本:当前机器人成本居高不下,动辄几十万,仿真可以大大降低成本,减小风险
2.高效:搭建的环境更为多样且灵活,可以提高测试效率以及测试覆盖率
3.高安全性:仿真环境下,无需考虑耗损问题
仿真缺陷:
机器人在仿真环境与实际环境下的表现差异较大,换言之,仿真并不能完全做到模拟真实的物理世界,存在一些"失真"的情况,原因:
1.仿真器所使用的物理引擎目前还不能够完全精确模拟真实世界的物理情况
2.仿真器构建的是关节驱动器(电机&齿轮箱)、传感器与信号通信的绝对理想情况,目前不支持模拟实际硬件缺陷或者一些临界状态等情形
相关组件
URDF
URDF是 Unified Robot Description Format 的首字母缩写,直译为统一(标准化)机器人描述格式,可以以一种 XML 的方式描述机器人的部分结构,比如底盘、摄像头、激光雷达、机械臂以及不同关节的自由度,该文件可以被 C++ 内置的解释器转换成可视化的机器人模型,是 ROS 中实现机器人仿真的重要组件
rviz
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
Gazebo是一款3D动态模拟器,用于显示机器人模型并创建仿真环境,能够在复杂的室内和室外环境中准确有效地模拟机器人。与游戏引擎提供高保真度的视觉模拟类似,Gazebo提供高保真度的物理模拟,其提供一整套传感器模型,以及对用户和程序非常友好的交互方式。
以“ros- [ROS_DISTRO] -desktop-full”命令安装ROS时,gzebo会默认被安装。
运行使用命令gazebo
或rosrun gazebo_ros gazebo
机器人的系统仿真是一种集成实现,主要包含三部分:
URDF 用于创建机器人模型
Gzebo 用于搭建仿真环境
Rviz 图形化的显示机器人各种传感器感知到的环境信息
三者应用中,只是创建 URDF 意义不大,一般需要结合 Gazebo 或 Rviz 使用,在 Gazebo 或 Rviz 中可以将 URDF 文件解析为图形化的机器人模型,一般的使用组合为:
如果非仿真环境,那么使用 URDF 结合 Rviz 直接显示感知的真实环境信息
如果是仿真环境,那么需要使用 URDF 结合 Gazebo 搭建仿真环境,并结合 Rviz 显示感知的虚拟环境信息
后续课程安排:
先介绍 URDF 与 Rviz 集成使用,在 Rviz 中只是显示机器人模型,主要用于学习 URDF 语法
再介绍 URDF 与 Gazebo 集成,主要学习 URDF 仿真相关语法以及仿真环境搭建
最后集成 URDF 与 Gazebo 与 Rviz,实现综合应用
URDF 不能单独使用,需要结合 Rviz 或 Gazebo,URDF 只是一个文件,需要在 Rviz 或 Gazebo 中渲染成图形化的机器人模型,当前,首先演示URDF与Rviz的集成使用,因为URDF与Rviz的集成较之于URDF与Gazebo的集成更为简单,后期,基于Rviz的集成实现,我们再进一步介绍URDF语法。
使用案例
创建功能包,导入依赖
创建一个新的功能包,名称自定义,导入依赖包:urdf
与xacro
在当前功能包下,再新建几个目录:
urdf
: 存储 urdf 文件的目录
meshes
:机器人模型渲染文件(暂不使用)
config
: 配置文件
launch
: 存储 launch 启动文件
编写 URDF 文件
新建一个子级文件夹:urdf
(可选),文件夹中添加一个.urdf
文件,复制如下内容:
<robot name="mycar">
<link name="base_link">
<visual>
<geometry>
<box size="0.5 0.2 0.1" />
</geometry>
</visual>
</link>
</robot>
在 launch 文件中集成 URDF 与 Rviz
在launch
目录下,新建一个 launch 文件,该 launch 文件需要启动 Rviz,并导入 urdf 文件,Rviz 启动后可以自动载入解析urdf
文件,并显示机器人模型,核心问题:如何导入 urdf 文件? 在 ROS 中,可以将 urdf 文件的路径设置到参数服务器,使用的参数名是:robot_description
,示例代码如下:
<launch>
<!-- 设置参数 -->
<param name="robot_description" textfile="$(find 包名)/urdf/urdf/urdf01_HelloWorld.urdf" />
<!-- 启动 rviz -->
<node pkg="rviz" type="rviz" name="rviz" />
</launch>
在 Rviz 中显示机器人模型
rviz 启动后,会发现并没有盒装的机器人模型,这是因为默认情况下没有添加机器人显示组件,需要手动添加,添加方式如下:
设置完毕后,可以正常显示了
优化 rviz 启动
重复启动launch
文件时,Rviz 之前的组件配置信息不会自动保存,需要重复执行步骤4的操作,为了方便使用,可以使用如下方式优化:
首先,将当前配置保存进config
目录
然后,launch
文件中 Rviz 的启动配置添加参数:args
,值设置为-d 配置文件路径
<launch>
<param name="robot_description" textfile="$(find 包名)/urdf/urdf/urdf01_HelloWorld.urdf" />
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find 报名)/config/rviz/show_mycar.rviz" />
</launch>
再启动时,就可以包含之前的组件配置了,使用更方便快捷。
URDF 文件讲解
URDF 文件是一个标准的 XML 文件,在 ROS 中预定义了一系列的标签用于描述机器人模型,机器人模型可能较为复杂,但是 ROS 的 URDF 中机器人的组成却是较为简单,可以主要简化为两部分:连杆(link标签) 与 关节(joint标签),接下来我们就通过案例了解一下 URDF 中的不同标签:
robot 根标签,类似于 launch文件中的launch标签
link 连杆标签
joint 关节标签
gazebo 集成gazebo需要使用的标签
关于gazebo标签,后期在使用 gazebo 仿真时,才需要使用到,用于配置仿真环境所需参数,比如: 机器人材料属性、gazebo插件等,但是该标签不是机器人模型必须的,只有在仿真时才需设置。
robot
urdf 中为了保证 xml 语法的完整性,使用了robot
标签作为根标签,所有的 link 和 joint 以及其他标签都必须包含在 robot 标签内,在该标签内可以通过 name 属性设置机器人模型的名称
1.属性
name: 指定机器人模型的名称
2.子标签
其他标签都是子级标签
link
urdf 中的 link 标签用于描述机器人某个部件(也即刚体部分)的外观和物理属性,比如: 机器人底座、轮子、激光雷达、摄像头...每一个部件都对应一个 link, 在 link 标签内,可以设计该部件的形状、尺寸、颜色、惯性矩阵、碰撞参数等一系列属性
1.属性
- name ---> 为连杆命名
2.子标签
visual ---> 描述外观(对应的数据是可视的)
geometry 设置连杆的形状
标签1: box(盒状)
- 属性:size=长(x) 宽(y) 高(z)
标签2: cylinder(圆柱)
- 属性:radius=半径 length=高度
标签3: sphere(球体)
- 属性:radius=半径
标签4: mesh(为连杆添加皮肤)
- 属性: filename=资源路径(格式:package://
/ )/文件
- 属性: filename=资源路径(格式:package://
origin 设置偏移量与倾斜弧度
属性1: xyz=x偏移 y便宜 z偏移
属性2: rpy=x翻滚 y俯仰 z偏航 (单位是弧度)
metrial 设置材料属性(颜色)
属性: name
标签: color
- 属性: rgba=红绿蓝权重值与透明度 (每个权重值以及透明度取值[0,1])
collision ---> 连杆的碰撞属性
Inertial ---> 连杆的惯性矩阵
joint
urdf 中的 joint 标签用于描述机器人关节的运动学和动力学属性,还可以指定关节运动的安全极限,机器人的两个部件(分别称之为 parent link 与 child link)以"关节"的形式相连接,不同的关节有不同的运动形式: 旋转、滑动、固定、旋转速度、旋转角度限制....,比如:安装在底座上的轮子可以360度旋转,而摄像头则可能是完全固定在底座上。
joint标签对应的数据在模型中是不可见的
1.属性
name ---> 为关节命名
type ---> 关节运动形式
continuous: 旋转关节,可以绕单轴无限旋转
revolute: 旋转关节,类似于 continues,但是有旋转角度限制
prismatic: 滑动关节,沿某一轴线移动的关节,有位置极限
planer: 平面关节,允许在平面正交方向上平移或旋转
floating: 浮动关节,允许进行平移、旋转运动
fixed: 固定关节,不允许运动的特殊关节
2.子标签
- parent(必需的)
parent link的名字是一个强制的属性:
link:父级连杆的名字,是这个link在机器人结构树中的名字。
child(必需的)
child link的名字是一个强制的属性:
link:子级连杆的名字,是这个link在机器人结构树中的名字。
origin
属性: xyz=各轴线上的偏移量 rpy=各轴线上的偏移弧度。
axis
属性: xyz用于设置围绕哪个关节轴运动。
URDF工具
在 ROS 中,提供了一些工具来方便 URDF 文件的编写,比如:
check_urdf
命令可以检查复杂的 urdf 文件是否存在语法问题urdf_to_graphiz
命令可以查看 urdf 模型结构,显示不同 link 的层级关系
当然,要使用工具之前,首先需要安装,安装命令:sudo apt install liburdfdom-tools
1.check_urdf 语法检查
进入urdf文件所属目录,调用:check_urdf urdf文件
,如果不抛出异常,说明文件合法,否则非法
2.urdf_to_graphiz 结构查看
进入urdf文件所属目录,调用:urdf_to_graphiz urdf文件
,当前目录下会生成 pdf 文件
URDF优化_xacro
URDF 文件构建机器人模型的过程中,存在若干问题。
问题1:在设计关节的位置时,需要按照一定的公式计算,公式是固定的,但是在 URDF 中依赖于人工计算,存在不便,容易计算失误,且当某些参数发生改变时,还需要重新计算。
问题2:URDF 中的部分内容是高度重复的,驱动轮与支撑轮的设计实现,不同轮子只是部分参数不同,形状、颜色、翻转量都是一致的,在实际应用中,构建复杂的机器人模型时,更是易于出现高度重复的设计,按照一般的编程涉及到重复代码应该考虑封装。......
如果在编程语言中,可以通过变量结合函数直接解决上述问题,在 ROS 中,已经给出了类似编程的优化方案,称之为:Xacro。Xacro 是 XML Macros 的缩写,Xacro 是一种 XML 宏语言,是可编程的 XML。
Xacro 可以声明变量,可以通过数学运算求解,使用流程控制控制执行顺序,还可以通过类似函数的实现,封装固定的逻辑,将逻辑中需要的可变的数据以参数的方式暴露出去,从而提高代码复用率以及程序的安全性。
较之于纯粹的 URDF 实现,可以编写更安全、精简、易读性更强的机器人模型文件,且可以提高编写效率。
URDF的使用
关闭所有终端,打开新的终端,输入指令
roslaunch handsfree_robot_description display.launch
启动后rviz界面展示urdf模型
同时指令会启动四个活动关节的控制GUI界面,通过运动滑块,可以让四个关节进行相应的运动。
rviz三维可视化工具
rviz介绍
rviz(ROS Visualization)是一款功能强大的三维可视化工具,它能够将机器人的状态、传感器数据以及周围环境等信息以图形化的方式呈现出来。 rviz兼容各种基于ROS的机器人平台,使得开发人员可以更加直观地了解机器人的运行状态和环境变化。
安装 rviz 并介绍其界面
安装 ros 时,如果执行的是完全安装,rviz 已经安装,可以尝试直接运行;如果未完全安装,可以单独安装 rviz:
# Ubuntu16.04
sudo apt-get install ros-kinetic-rviz
# Ubuntu18.04
sudo apt-get install ros-melodic-rviz
# Ubuntu20.04
sudo apt-get install ros-noetic-rviz
关闭之前所有终端,打开一个新终端(快捷键:Ctrl+Alt+T)并输入以下命令:
roscore
然后打开一个新的终端(快捷键:Ctrl+Alt+T),输入以下命令打开 rviz。
rosrun rviz rviz
# or
rviz
打开 rviz,将显示以下界面:
左侧有一个显示器列表。显示器是在三维世界中绘图的设备,在显示列表中可能有一些可用选项。
顶部是一个工具栏,用户可以使用各种功能按钮选择具有多种功能的工具。
中间部分是 3D 视图:这是一个主屏幕,可以在其中查看各种三维数据。三维视图的背景颜色、固定框架、网格等可以在左侧显示的全局选项和网格项目中进行详细设置。
下面是时间显示区域,包括系统时间和 ROS 时间。
右侧为观察角度设置区,可设置不同的观察角度。
二维仿真stage
Stage介绍
Stage是Player/Stage项目的一个软件,是一种用于移动机器人和智能传感系统研究的仿真工具,是一个2D的机器人模拟器,主要通过.world文件来定义这个仿真世界。包括机器人,lidar,camera和障碍物等等。
Stage在一个二维的位图环境下模拟移动机器人、传感器和障碍物等对象。Stage提供了多种传感器和执行器,包括声纳,激光扫描测距仪,色斑显示器,里程计,抓斗,防撞器/触须器以及移动机器人基座等。
Stage在设计中就考虑到了多智能体系统的问题,可以提供对多机器人系统的测试仿真。需要了解的是Stage只提供了真正简单,可计算的廉价的设备模式,而无法非常精密地仿真任何具体的设备终端。
stageros 节点通过 libstage 封装了 Stage 2-D 多机器人模拟器。Stage 通过一个 .world
文件来模拟世界。这个文件包含了关于这个世界的所有信息,从障碍物(通常通过位图来表示,作为一种背景)到机器人和其他物体。
该节点只通过 ROS 暴露了 Stage 的部分功能。具体来说,它查找类型为激光(laser)、相机(camera)和位置(position)的 Stage 模型,并将这些模型映射到下面列出的 ROS 话题。如果在 .world 文件中未找到至少一个激光/相机和位置模型,stageros 将退出。
用法
rosrun stage_ros stageros [-g 无界面运行] <world> [标准的 ROS 参数]
参数:
world: 需要加载的 Stage
.world
文件。-g: 如果设置该选项,将以“无界面”方式运行 stage,不会显示图形界面。
世界文件语法
.world
文件的语法在 Stage 手册中有说明。stageros 只暴露通过 .world
文件语法创建的部分模型,主要是激光、位置和相机模型。有关示例,请参见 stage 和 stage_ros 软件包中的 world 目录。
订阅的话题
如果 .world
文件中仅定义了一个位置模型,所有这些话题都会出现在顶层命名空间中。然而,如果定义了多个位置模型,这些话题将会按命名空间区分,并在话题前添加 robot_<i>/
作为前缀,例如 robot_0/cmd_vel
等。
- cmd_vel (
geometry_msgs/Twist
): 速度命令,用于驱动机器人的位置模型。
发布的话题
如果 .world
文件中仅定义了一个位置模型,所有这些话题都会出现在顶层命名空间中。如果定义了多个位置模型,这些话题将会按命名空间区分,并在话题前添加 robot_<i>/
作为前缀,例如 robot_0/cmd_vel
等。
odom (
nav_msgs/Odometry
): 来自位置模型的里程计数据。base_scan (
sensor_msgs/LaserScan
): 激光模型的扫描数据。base_pose_ground_truth (
nav_msgs/Odometry
): 地面真实的位姿。image (
sensor_msgs/Image
): 可视化相机图像。depth (
sensor_msgs/Image
): 深度相机图像。camera_info (
sensor_msgs/CameraInfo
): 相机校准信息。
使用 Stage 控制器
Stage 支持使用“控制器”,即在模拟器内部控制模拟机器人的代码段,而不是通过 ROS 连接来控制机器人。在某些情况下,使用 Stage 控制器可能会更有利。
Stage的仿真使用
关闭所有终端,打开一个新的终端,输入指令
roslaunch handsfree_stage stage_handsfree_xuda.launch
代码启动后,出现一个二维地图
红色方块为测试使用的障碍物
蓝色圆柱为机器人本体
黑色边界为地图墙体
深色区域为雷达覆盖视野
空白区域为自由空间
Stage的仿真案例
关闭所有终端,打开一个新的终端,输入指令
roslaunch handsfree_stage demo_handsfree_sanhang_stage.launch
代码启动后,出现一个stage二维地图和一个rviz界面
rviz机器人的位置和stage地图上的蓝色圆柱位置相互映射,通过点击RVIZ菜单栏的2D Nav Goal图标。鼠标指定一个地图上机器人可以到达的地方。 如果一切正常的话,机器人将规划出一条路径,并自主移动到所指定的目标点。
通过rviz的界面可以观察到,雷达视野和真实环境类似,被障碍物所阻挡