本次构建一个名为dd_robot的机器人,为机器人建立URDF文件后构建可视化模型,在rviz中能直观地看到。之后对URDF做些许修改后,机器人模型可以在Gazebo的模拟3D环境中移动。
名词解释:
dd 差分驱动 (differential drive)
URDF 统一的机器人描述格式(Unified Robot Description Format),描述机器人的主要组成部分,URDF文件能够被ROS的相关工具进行可视化和控制。
rviz:可视化工具。(ROS可视化,ROS visualization)
Gazebo:模拟工具,提供机器人移动的外部环境,模拟机器人的物理学特性。
rviz,以点云或深度图的形式显示3D传感器的数据;以图片数据的形式显示2D传感器的数据。3D设备:立体摄像机,激光扫描仪,Kinect;2D设备:网络摄像机,RGB摄像机,2D激光测距仪。
rviz提供提供一个可配置的GUI。
rviz 是ros-kinetic-desktop-full的组成部分,之前安装ROS时已经安装。
若尚未安装rviz,则输入下列命令从Debian软件进行安装
sudo apt-get install ros-kinetic-rviz
启动ROSmaster:
roscore
第二个终端启动rviz
rosrun rviz rviz
主界面分为四个显示区域:中心窗口、左侧的Displays控制面板、右侧的Views控制面板以及底部的Time控制面板
轨道视图:rviz默认的摄像机视图,在该视图下摄像头围绕一个焦点旋转。
在display面板中点击add按钮添加可视化元素
生成ROS功能包,catkin_create_pkg要求一个唯一的功能包名,同时提供功能包可选项依赖表,依赖表示功能包所需要的软件包。
格式为:caking_create_pkg
cd ~/catkin_ws/src
catkin_create_pkg ros_robotics
构建(编译)上述功能包
cd ~/catking_ws
catkin_make
构建完毕后,子目录~/catkin_ws/devel的结构和目录/opt/ros/kinetic下的结构相似
URDF是一种XML格式,专门对机器人硬件进行抽象的模型描述。
复杂的机器人系统,URDF文件会变得繁杂。一种XML宏命令语言Xacro(XML Macros)能够减少重复信息
自行编写源代码,需要在ros_roborics功能包目录下生成一个/urdf 目录
对机器人模型进行描述时通常由两个基本的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代码如下:
"dd_robot">
"base_link">
"0 0 0" rpy="0 0 0"/>
"0.5 0.5 0.25"/>
roslaunch是ros的一个启动工具,命令格式: roslaunch [options] [package] <filename> [arg_name:=value…]
它能够使得启动 多个ROS节点的过程变得简单,同时也 简化了ROS参数服务器进行参数设置的过程。
roslaunch配置文件使用XML语言编写,文件以.launch为扩展名。
在分布式环境下,.launch文件为节点指定了运行的处理器。
roslaunch文件的功能:
在ros_robotics功能包生成launch目录,在launch下生成ddrobot_rviz.launch文件,其XML代码如下:
"model" />
"gui" default="False" />
"robot_description" textfile="$(find ros_robotics)/urdf/$(arg model)" />
"use_gui" value="$(arg gui)"/>
"joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
"robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
"rviz" pkg="rviz" type="rviz" args="-d $(find ros_robotics)/urdf.rviz" required="true" />
若在rviz中查看机器人模型,需要在终端输入命令:
roslaunch ros_robotics ddrobot_rviz.launch model:=dd_robot.urdf
设置主界面的盒子三个步骤:
若在退出时不保存 (文件名为urdf.rviz),则每次都要执行上面三个步骤。
为URDF文件添加连接杆组件时,需要添加关节组件以描述连接杆组件之间的关系。
关节有柔性关节(可移动的)和非柔性关节(固定的)之分。
在URDF中有6种可能的关节类型:
连续关节能无限制旋转,所以机器人的轮子选择连续关节。
下面XML代码为机器人的轮子添加形状和组件。
,文件在2.1代码标签里继续添加添加如下代码,新文件命名为dd_robot2.urdf,保存路径与2.1同。
<!-- Right Wheel -->
"right_wheel">
"0 0 0" rpy="1.570795 0 0"/>
"0.1" radius="0.2"/>
</geometry>
</visual>
</link>
"joint_right_wheel" type="continuous">
"base_link"/>
"right_wheel"/>
"0 -0.30 0" rpy="0 0 0"/>
"0 1 0"/>
</joint>
<!-- Left Wheel -->
"left_wheel">
"0 0 0" rpy="1.570795 0 0"/>
"0.1" radius="0.2"/>
</geometry>
</visual>
</link>
"joint_left_wheel" type="continuous">
"base_link"/>
"left_wheel"/>
"0 0.30 0" rpy="0 0 0"/>
"0 1 0"/>
</joint>
轮子绕x轴旋转 pi/2。
轮子的旋转轴为y轴
关节组件基于父关节和子关节进行定义。
在终端运行rviz的roslaunch命令:
roslaunch ros_robotics ddrobot_rviz.launch model:=dd_robot2.urdf
在机器人的前方添加一个小脚轮来保证机器人底座的平衡于稳定,小脚轮为一个圆球。
在中添加下面代码,新文件名为dd_robot3.urdf
"caster">
"0.2 0 -0.125" rpy="0 0 0" />
"0.05" />
在下的
"blue">
"0 0.5 1 1"/>
指定标签的内容和名字后标签可以复用。
为机器人模型中每一个元素添加
代码示例
"0 0 0" rpy="0 0 0" />
"0.5 0.5 0.25"/>
</geometry>
</collision>
添加碰撞属性不会改变机器人的可视化模型。
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模拟环境中机器人模型以及各元素的坐标系之间的联系。
添加完物理属性后,机器人才可以在Gazebo模拟器中启动,因为Gazebo物理引擎需要物理属性。这里用的物理属性有质量和惯性。
每一个要模拟的元素都需要一个
"5"/>
"0.13" ixy="0.0" ixz="0.0" iyy="0.21" iyz="0.0" izz="0.13"/>
</inertial>
添加物理学属性不会改变机器人的可视化信息。
用ROS的命令行工具检查URDF的信息
安装
sudo apt-get install liburdfom-tools
check_urdf:检查URDF文件语法是否正确,正确则输出运动链的结果描述。
urdf_to_graphiz:生成URDF文件对应的graphviz图表(.gv)以及一个pdf文件。
Gazebo中模型文件为SDF格式。URDF文件通过增加一些特定的Gazebo信息转换为SDF格式。
gazebo对显卡有一定要求
gazebo命令运行两个程序:Gazebo服务器和Gazebo客户机。服务器是Gazebo的核心,负责物理属性和传感器数据,gzserver运行模拟进程。客户机是GUI,gzclient运行。
标准启动命令,启动一个空的环境。
roslaunch gazebo_ros empty_world.launch
Gazebo界面由四部分组成:中部窗口,左侧的World、Layers、Insert面板,右侧的Joints面板、底部的Simulation面板。
工具栏按钮:选择模式(selection mode)、变换模式(translation mode)、旋转模式(rotation mode)、缩放模式(scale mode);箱形、球形、圆柱形;点光源、聚光灯光源、直射光源。
太阳光源的属性:位姿,散射特性,反射特性,距离,衰减特性。
在URDF文件中添加
要在Gazebo中指定颜色,需要为每一个连接杆组件指定一个gazebo
若
若没有为连接杆指定
通过launch文件在Gazebo中查看URDF
通过下面代码生成ddrobot_gazebo.launch文件
"$(find gazebo_ros)/launch/empty_world.launch">
"world_name" value="$(find ros_robotics)/worlds/ddrobot.world"/>
"paused" default="false"/>
"use_sim_time" default="true"/>
"gui" default="true"/>
"headless" default="false"/>
"debug" default="false"/>
"spawn_urdf" pkg="gazebo_ros" type="spawn_model" output="screen"
args="-file $(find ros_robotics)/urdf/dd_robot.gazebo -urdf -model ddrobot" />
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