本次构建一个名为dd_robot的机器人,为机器人建立URDF文件后构建可视化模型,在rviz中能直观地看到。之后对URDF做些许修改后,机器人模型可以在Gazebo的模拟3D环境中移动。
名词解释:
dd 差分驱动 (differential drive)
URDF 统一的机器人描述格式(Unified Robot Description Format),描述机器人的主要组成部分,URDF文件能够被ROS的相关工具进行可视化和控制。
rviz:可视化工具。(ROS可视化,ROS visualization)
Gazebo:模拟工具,提供机器人移动的外部环境,模拟机器人的物理学特性。
1.rviz
rviz,以点云或深度图的形式显示3D传感器的数据;以图片数据的形式显示2D传感器的数据。3D设备:立体摄像机,激光扫描仪,Kinect;2D设备:网络摄像机,RGB摄像机,2D激光测距仪。
rviz提供提供一个可配置的GUI。
1.1.启动rviz
rviz 是ros-kinetic-desktop-full的组成部分,之前安装ROS时已经安装。
若尚未安装rviz,则输入下列命令从Debian软件进行安装
sudo apt-get install ros-kinetic-rviz
启动ROSmaster:
roscore
第二个终端启动rviz
rosrun rviz rviz
1.2.使用rviz
主界面分为四个显示区域:中心窗口、左侧的Displays控制面板、右侧的Views控制面板以及底部的Time控制面板
轨道视图:rviz默认的摄像机视图,在该视图下摄像头围绕一个焦点旋转。
在display面板中点击add按钮添加可视化元素
- 左键拖动:围绕焦点旋转
Shift + 左键拖动:移动焦点
右键拖动:缩放
1.3生成并构建ROS功能包
生成ROS功能包,catkin_create_pkg要求一个唯一的功能包名,同时提供功能包可选项依赖表,依赖表示功能包所需要的软件包。
格式为:caking_create_pkg <package_name> [depend1] [depend2] [depend3]
cd ~/catkin_ws/src
catkin_create_pkg ros_robotics
构建(编译)上述功能包
cd ~/catking_ws
catkin_make
构建完毕后,子目录~/catkin_ws/devel的结构和目录/opt/ros/kinetic下的结构相似
2.构建差分驱动的机器人URDF
URDF是一种XML格式,专门对机器人硬件进行抽象的模型描述。
复杂的机器人系统,URDF文件会变得繁杂。一种XML宏命令语言Xacro(XML Macros)能够减少重复信息
自行编写源代码,需要在ros_roborics功能包目录下生成一个/urdf 目录
2.1生成机器人底座
对机器人模型进行描述时通常由两个基本的URDF组件定义一个树状结构实现。这两个组件一个是link组件(连接杆组件),一个是joint组件(关节组件)。
link组件描述了刚体的物理学属性(包括维度,初始位置,颜色等)。link组件由joint组件连接。joint组件描述了连接的运动学以及动态属性(包括连接的连接杆、关节类型、旋转轴、摩擦力和阻尼的合力等)
URDF组件实际上描述了一组link元素和一组将link元素连接在一起的joint元素合集。URDF文件是一个包含一根连接杆组件的树状结构。
机器人第一个组成部分是一个底座盒子。包含一个link组件,link组件名为base_link。base_link是整个机器人运动链的URDF根link组件,是构建机器人模型的初始组件。机器人模型中的其他连接杆组件将在该连接杆的基础上定义。
XML代码包含参数:盒子尺寸size,盒子中心初始位置xyz,在三条轴上的旋转rpy(滚转roll,俯仰pitch,偏航yaw)
代码实现
将 dd_robot.urdf 文件保存到 ~/catkin_ws/src/ros_robotics/urdf 目录下,文件的XML代码如下:
<robot name="dd_robot">
<!-- Base Link -->
<link name="base_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<box size="0.5 0.5 0.25"/>
</geometry>
</visual>
</link>
</robot>
<origin>标签定义了可视化元素相对于link参考系的参考系框架,本例把可视化元素——盒子的原点定为几何中心。
2.2使用roslaunch
roslaunch是ros的一个启动工具,命令格式: roslaunch [options] [package] <filename> [arg_name:=value…]
它能够使得启动 多个ROS节点的过程变得简单,同时也 简化了ROS参数服务器进行参数设置的过程。
roslaunch配置文件使用XML语言编写,文件以.launch为扩展名。
在分布式环境下,.launch文件为节点指定了运行的处理器。
roslaunch文件的功能:
- 将命令行中设置的模型加载到参数服务器中;
- 启动订阅了关节组件状态和转换的节点
- 启动使用urdf.rviz文件配置的rviz
代码实现
在ros_robotics功能包生成launch目录,在launch下生成ddrobot_rviz.launch文件,其XML代码如下:
<launch>
<!-- values passed by command line input -->
<arg name="model" />
<arg name="gui" default="False" />
<!-- set these parameters on Parameter Server -->
<param name="robot_description" textfile="$(find ros_robotics)/urdf/$(arg model)" />
<param name="use_gui" value="$(arg gui)"/>
<!-- Start 3 nodes: joint_state_publisher, robot_state_publisher and rviz -->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find ros_robotics)/urdf.rviz" required="true" />
<!-- (required = "true") if rviz dies, entire roslaunch will be killed -->
</launch>
若在rviz中查看机器人模型,需要在终端输入命令:
roslaunch ros_robotics ddrobot_rviz.launch model:=dd_robot.urdf
设置主界面的盒子三个步骤:
- Displays面板下点Add按钮,添加RobotModel
- Displays面板下点Add按钮,添加TF;
- Global Options项下选择Fixed Frame,将 map 改为 base_link
若在退出时不保存 (文件名为urdf.rviz),则每次都要执行上面三个步骤。
2.3添加轮子
为URDF文件添加连接杆组件时,需要添加关节组件以描述连接杆组件之间的关系。
关节有柔性关节(可移动的)和非柔性关节(固定的)之分。
在URDF中有6种可能的关节类型:
- 固定关节:六个自由度是锁定的。
- 旋转关节:能围绕一条轴进行旋转,有旋转上限和旋转下限的范围限制。
- 连续关节:连续铰链关节,围绕一条轴进行旋转,无范围限制。
- 棱柱形关节:可沿轴移动,移动范围有上限和下限。
- 浮动关节:可在六个自由度上移动。
- 平面关节:允许在一个垂直于坐标轴的平面内移动。
连续关节能无限制旋转,所以机器人的轮子选择连续关节。
代码实现
下面XML代码为机器人的轮子添加形状和组件。
,文件在2.1代码标签里继续添加添加如下代码,新文件命名为dd_robot2.urdf,保存路径与2.1同。
<!-- Right Wheel -->
<link name="right_wheel">
<visual>
<origin xyz="0 0 0" rpy="1.570795 0 0"/>
<geometry>
<cylinder length="0.1" radius="0.2"/>
</geometry>
</visual>
</link>
<joint name="joint_right_wheel" type="continuous">
<parent link="base_link"/>
<child link="right_wheel"/>
<origin xyz="0 -0.30 0" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
</joint>
<!-- Left Wheel -->
<link name="left_wheel">
<visual>
<origin xyz="0 0 0" rpy="1.570795 0 0"/>
<geometry>
<cylinder length="0.1" radius="0.2"/>
</geometry>
</visual>
</link>
<joint name="joint_left_wheel" type="continuous">
<parent link="base_link"/>
<child link="left_wheel"/>
<origin xyz="0 0.30 0" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
</joint>
轮子绕x轴旋转 pi/2。
轮子的旋转轴为y轴
关节组件基于父关节和子关节进行定义。
在终端运行rviz的roslaunch命令:
roslaunch ros_robotics ddrobot_rviz.launch model:=dd_robot2.urdf
以下步骤大同小异。
2.4添加小脚轮
在机器人的前方添加一个小脚轮来保证机器人底座的平衡于稳定,小脚轮为一个圆球。
在<!-- Base Link -->中添加下面代码,新文件名为dd_robot3.urdf
<!-- Caster -->
<visual name="caster">
<origin xyz="0.2 0 -0.125" rpy="0 0 0" />
<geometry>
<sphere radius="0.05" />
</geometry>
</visual>
2.5添加颜色
在<!-- Base Link -->下的<link><visual>里添加<material>标签
<material>标签代码示例,新文件名为dd_robot4.urdf
<material name="blue">
<color rgba="0 0.5 1 1"/>
</material>
<material>标签<color>的格式:红/绿/蓝/alpha每个取值范围均为[0,1],alpha表示透明度,alpha为0时透明,为1时不透明。
指定标签的内容和名字后标签可以复用。
2.6添加碰撞属性
为机器人模型中每一个<link>元素添加<collision>属性。新文件名为dd_robot5.urdf
代码示例
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="0.5 0.5 0.25"/>
</geometry>
</collision>
添加碰撞属性不会改变机器人的可视化模型。
2.6移动轮子
ddrobot_rviz.launch文件启动了3个ROS节点:joint_state_publisher,robot_state_publisher,rviz。
joint_state_publisher节点找到所有非固定关节组件并将其通过JointState消息发布。消息中有转动轮子的常量值。
节点robot_state_publisher订阅了JointState消息,将机器人状态消息发布给tf坐标变换库。该节点以机器人关节角度为输入,计算出机器人连接杆组件的3D位姿,并将该姿态结果发布出去。该节点采用基于机器人URDF的动力学树状模型。
将gui添加到roslaunch命令中,弹出的gui窗口可以改变JointState消息的值
(对应改变urdf代码中关节组件的p值)
roslaunch ros_robotics ddrobot_rviz.launch model:=dd_robot5.urdf gui:True
tf功能包 是ROS的一个核心功能包,用来建立3D模拟环境中机器人模型以及各元素的坐标系之间的联系。
2.7添加物理学属性
添加完物理属性后,机器人才可以在Gazebo模拟器中启动,因为Gazebo物理引擎需要物理属性。这里用的物理属性有质量和惯性。
每一个要模拟的<link>元素都需要一个<inertial>的标签,其包含两个子元素:
- <mass> 单位为千克
- <inertia> 3 * 3的转动惯量框架,有6个元素值 ixx,ixy,ixz,iyy,iyz,izz
标签与<visual>、<collision>标签同级,在每个<collison>标签下方插入<inertial>
<inertial>代码示例,新文件名为dd_robot6.urdf
<inertial>
<mass value="5"/>
<inertia ixx="0.13" ixy="0.0" ixz="0.0" iyy="0.21" iyz="0.0" izz="0.13"/>
</inertial>
添加物理学属性不会改变机器人的可视化信息。
2.8 URDF工具
用ROS的命令行工具检查URDF的信息
安装
sudo apt-get install liburdfom-tools
check_urdf:检查URDF文件语法是否正确,正确则输出运动链的结果描述。
urdf_to_graphiz:生成URDF文件对应的graphviz图表(.gv)以及一个pdf文件。
Gazebo中模型文件为SDF格式。URDF文件通过增加一些特定的Gazebo信息转换为SDF格式。
3.Gazebo
gazebo对显卡有一定要求
3.1启动
gazebo命令运行两个程序:Gazebo服务器和Gazebo客户机。服务器是Gazebo的核心,负责物理属性和传感器数据,gzserver运行模拟进程。客户机是GUI,gzclient运行。
标准启动命令,启动一个空的环境。
roslaunch gazebo_ros empty_world.launch
3.2 使用
Gazebo界面由四部分组成:中部窗口,左侧的World、Layers、Insert面板,右侧的Joints面板、底部的Simulation面板。
工具栏按钮:选择模式(selection mode)、变换模式(translation mode)、旋转模式(rotation mode)、缩放模式(scale mode);箱形、球形、圆柱形;点光源、聚光灯光源、直射光源。
太阳光源的属性:位姿,散射特性,反射特性,距离,衰减特性。
3.3 URDF的修改
在URDF文件中添加<gazebo>标签。该标签在URDF下不能被识别,在SDF下能被识别。<gazebo>标签和reference=" "属性一起使用。
要在Gazebo中指定颜色,需要为每一个连接杆组件指定一个gazebo <material>标签,置于</robot>结束标签之前。
若<gazebo>标签没有reference,则该标签会应用到整个机器人模型中。
若没有为连接杆指定<visual>和<collision>,则在Gazebo中把相关组件视为不可见、碰撞不可检测。
3.4在Gazebo中查看URDF
通过launch文件在Gazebo中查看URDF
通过下面代码生成ddrobot_gazebo.launch文件
<launch>
<!-- We resume the logic in gazebo_ros package empty_world.launch, -->
<!-- changing only the name of the world to be launched -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(find ros_robotics)/worlds/ddrobot.world"/>
<arg name="paused" default="false"/>
<arg name="use_sim_time" default="true"/>
<arg name="gui" default="true"/>
<arg name="headless" default="false"/>
<arg name="debug" default="false"/>
</include>
<!-- Spawn dd_robot into Gazebo -->
<node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" output="screen"
args="-file $(find ros_robotics)/urdf/dd_robot.gazebo -urdf -model ddrobot" />
</launch>
ddrobot_gazebo.launch文件继承了empty_world.launch的大部分功能。empty_world.launch来自gazebo_ros功能包
在ros_robotics下建立文件目录/worlds,放入ddrobot.world文件,在urdf下存放修改后的urdf文件:dd_robot.gazebo。
输入下面命令启动机器人模型dd_robot
roslaunch ros_robotics ddrobot_gazebo.launch
代码下载
https://github.com/PacktPublishing/ROS-Robotics-By-Example/tree/master/Chapter_2_code/ros_robotics