构建模拟的两轮ROS机器人

本次构建一个名为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

rviz界面截图
以下步骤大同小异。

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

通过Joints面板控制机器人
代码下载
https://github.com/PacktPublishing/ROS-Robotics-By-Example/tree/master/Chapter_2_code/ros_robotics

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值