如何为各种移动机器人来配置导航功能包集?

在本节中,我们将讨论各种坐标系的变换和转换树的查看,然后介绍如何在Gazebo和真实的机器人中发布传感器和里程信息。我们还会讨论如何创建一个用来控制移动机器人的基础控制器。

最后,我们将研究使用一个使用ROS导航功能包集的移动机器人创建的环境地图。

图7-1 ROS导航功能包集的组织架构

1.创建变换

正如我们在上一节中讨论的,导航功能包集需要关于传感器、轮子和关节在机器人主体固定框架(也被称作base_link)中的位置以及它们坐标框架之间关系数据的信息。

我们可以回忆第3章中学习到的有关转换框架(TF)软件库的知识,可以利用这些知识来管理变移动机器人技术包括哪些换树。

换言之,我们可以为机器人增加更机器人大乱斗多的传感器和部件,而 TF 库将处理所有的关系,其他综合收益并执行所有的数学运算,从而得到一个变换树roseonly,它根据不同参考帧之间的平移和旋转来定义偏移。

我们在第6章机器人编程的好处中开发了移动机器人仿真模型,该模型在其底盘上安装摄像机和激光传感器。此外,导航系统必须知道激光和摄像头在机器人底盘上的位置,以检测碰撞,例如车轮和墙壁之间的碰撞。因此,rose怎么读所有传感器和关节必须正确数据配置 TF 库,以便导航功能包集能够准确知道每个组件的位置,并以一致的方式移动机器人。

对于真正的机器人,我们必须编写代码来配置每个组件并对其进行数据库转换。然而,如果机器人的URDF代表了真实的机器人,我们的仿真将与真实的机器人完全相同,因此实际上不需要配置每个组件。在例子中,为了模拟在URDF文件中指定的机器人的几何图形,不需要再次配置机器人,因为我其他应收款们正在使用robot-state_publisher包发布机器人的坐标变换树。

我们可以使用以下命令查看上一章机器人编程语言开发的移动机器人的坐标变换树。

$roslaunch chapter7_tutorials gazebo_map_robot.launch model:="'rospack find
chapter7_tutorials'/urdf/robot_model_01.xacro"
$rosrun tf view_frames

图7-2显示了我们的模拟移动机器人的坐标变换树。


                                            如何为各种移动机器人来配置导航功能包集?

图7-2 坐标变换树

2.传感器

真实的机器人往往可以使用多个传感器来感知世界。我们可以使用很多节点来接收这些数据并进行处理,但是导航功能包集仅支持使用平面距离传感器。所以传感器必须使用下面的格式来发布数据:/sensor_msgs::Lase系统运维是干嘛的rScan或者/sensor_msgs::PointCloud2。

我们将使用位于模拟移动机器人前面的激光器来实现在Gazebo世界中的导航。这个其他应收款是什么科目激光器是在Gazebo中仿真出来的,它在hoku机器人简笔画yo_link坐标系中以/robot/laser/scan为话题名发布数据。

在这里我们之所以不需要再进行任何配置就能够在导航功能包集中使用激光器,是因为在.urdf文件中已经配置过tf树,而且激光器也能够使用正确的格式发布数据。

在使用真实激光器的案例中移动机器人路径规划,我们需要为其开发一个驱动程序。在第5章中,我们已经讲解过了如何将一个Hokuyo激光器设备连接到机器人股票ROS。

数据漫游们可以使用以下命令在仿真器中查看激光传感器的机器人工程专业工作:

$roslaunch chapter7_tutorials gazebo_xacro.launch model:="'rospack find 
chapter7_tutorials'/urdf/robot_model_04.xacro"

图7-3其他和其它的区别展示了Gazebo中的激光传感器。


                                            如何为各种移动机器人来配置导航功能包集?

图7-3 Gazebo中的激光传感器

图7-4显示了在RVIZ中激光数据传感器的可视化效果。


                                            如何为各种移动机器人来配置导航功能包集?

图7-4 RViz中激光数据传感器的可视化效果

3.里程信息

导航功能包集还需要获取机器人的里程信息,里程信息是指相对某一个固定点或者整个Word坐标系的偏移矢量。在这里,它指的是从base_lirose新歌nk坐标系与odom坐标系中固定点之间的距离。

导航功能包集使用的消息类型是nav_msgs/Odometry中国移动机器人。我们可以使用以下命令查看消息的数据结构,查看的结果如下所示:

$ rosmsg show nav_msgs/Odometry

在图7-5中,我们可以看到这个位姿包含两个结构,一个显示了欧氏坐标系中的位置,另一机器人编程对儿童有什么好处个则使用了一个四元数显示了机器人的方向。同样,速度信息也包含两个机器人编程对儿童有什么好处结构,一个是线速度,另一个是角速度。我们这里所使用的模拟移动机器人只有线性x速度和角z速度,机器人英语因为它被模拟为差速驱动模型。


                                            如何为各种移动机器人来配置导航功能包集?

图7-5 里程信息结构

因为里程其实就是两个坐标系之间的位移,所以我们就有系统运维主要做什么必要发布两个坐标系之间的机器人编程入门坐标变换信息。因轮式移动机器人为我们是在一个虚拟世界中工作,所以就来讨论一下如何在Gazebo中使用里程计。

正如在前面rose怎么读所研究过的那样,我们的机器人在仿真环境中的移动和现实世界中的机器人是相似的。我们使用第6章中配置过的diffdrive_plugin插件来驱动机器人,这个驱动程rose的农村生活序会发布机器人在仿真环境中的里程信息,所以我们并不需要为Gazebo再编写任何代码。

我们将在Gazebo中执行移动机器人,并查看里程计是如何工作的。在两个独立的命令行窗口中输入以下命令:

$ roslaunch chapter7_tutorials gazebo_xacro.launch model:="'rospack find
robot1_description'/urdf/robot_model_04.xacro"
$ rosrun teleop_twist_keyboard teleop_twist_keyboard.py

输出显示的结果如图7rose的农村生活-6所示。

这些指令中使用的是倒引号,而不是简单的单引号。在这里我们要注意这一点,防止指令’rospac移动机器人技术包括k find robot1_description’没有生成所需的输出结果。我们可以执行$ rospack find robot1_description来完成这个输出,例如:

$ roslaunch chapter7_tutorials gazebo_xacro.launch
model:=/home/kbipin/catkin_workspace/src/
robot1_description1/urdf/robot_model_04.xacro


                                            如何为各种移动机器人来配置导航功能包集?

图7-6 Gazebo中的里程计数据

然后,我们可以用键盘移动机器人几秒,以生成关于里程计话题的新数据。

在和图7-6所示相同的Gazebo模拟器屏幕上,我们可以单击模型robot_model1来查看对象模型的属性。其中的一个属性就是机器人的机器人大乱斗位姿(pose)。同样,我们可以单击位姿来查看相应字段的数据,这系统/运维是机器人在虚拟世界中的位置。当我们移动机器人时,这些数据将不断变数据漫游化,详见图7-6中框内的数据变化。

Gazebo不数据结构断地发布里程计数据,我们可以通过查看话题来观察这些数据。我们也可以在shel其他应收款是什么科目l中机器人工程专业键入以下命令来查看它发送的数据:

$ rostopic echo /odom/pose/pose

我们将看到图7-7所示的输出。


                                            如何为各种移动机器人来配置导航功能包集?

图7-7 里程计其他综合收益数据

也可以通过查看PublishOdometry(Double Step_Time)函数等来了解Gazebo是如何生成里程测量数据的。

一旦了解了Gazebo如何以机器人大乱斗及在哪里获取里程数据,下一步就是学习它如何发布里程数据和相对于一个真实机器人的坐标变换数据。不过,目前考虑到机器人对平台的依赖性,我们并不会在这里研究真实的机器人。

4.基础控制器

导航功能包集的关键组件之一就是基rose的农村生活础控制器。因为它是通过机器人硬件通信进行有效控制的唯一途径。然而,ROS不提供任何通用的基础控制器,所以必须为移动机器人平台开发一个基础控制器。

基础控制器必数据恢复须订阅名为/Cmd级别的话题,该话题具rose的农村生活有消息类型/Geometry_msgs::Twist。此信息也可用于以前看到的里程计信息。除此之外,基rose的农村生活础控制器必须以正确的线速度和角速度为机器人平台生成正确的命令。

我们可以通过在命令行(shell)中键入以下命令来调用此消息的结构,以查看其内容:

$ rosmsg show geometry_msgs/Twist

这个命移动机器人令的输出结果如图7-8所示。

从图7-8可以看出,两个向量结构分别显示了x、y和z轴的线速度和角速度。考虑到我们所使用的机器人差速驱动平台,驱动它的两个电动机只能够让机器人前进、后退或者转向。因此对于这个实例的机器人,只需要使用线速度x和角速度z。


                                            如何为各种移动机器人来配置导航功能包集?

图7-8 速度指令

因为是在Gaze其他垃圾brosyo这个虚拟环境中对机器人进行仿真,所以用于机器人运动/仿真的基础控制器是在驱动程序中实其他应付款现。这也就意味着在Gazebo中不必为机器人创建一个基础控制器。

接下来数据库,我们需要在Gazebo中运行机器人来理解基础控制器的作用。然后要在不同的命令数据恢复行窗口中运行以下命令:

$ roslaunch chapter7_tutorials gazebo_xacro.launch model:="'rospack find
chapter7_tutorials'/urdf/robot_model_05.xacro"
$ rosrun teleop_twist_keyboard teleop_twist_keyboard.py

当所有节点都已经启动并正常运系统运维工程师行之后,我们就可以使用命令rqt_graph来查看各个节点之间的关系:

$ rqt_graph

输出的结果如图7-9所示。


                                            如何为各种移动机器人来配置导航功能包集?

图7-9 基础控制器

在图7-9中,我们可以看到gazebo自动订阅t移动机器人路径规划eleop节点生成的cmd_vel话题。就像前面讲到的那样,在Gazeborosie仿真环境中,正运行着差动轮式机器人仿真程序插件。仿真程序插件通过c机器人工程专业md_vel话题获取控制命机器人编程令数据并移动机器人。同时,仿真程序插移动机器人件生成里机器人程信息。另外,可以假设我们有足够的背景知识来开发物理机器人的基础控制器。

5.地图

在这一章中,我们将会学习如何使用在Gazebo中创建的移动机器人来创建、保存和加载地图。不过,如果没有使用合适工具的话,构造地图将会是一件非常复杂的工作。而ROS中的工具map_server就能够帮助你使rose新歌用里程计和激光传感器来创建地图。

首先,我们需要在chapter7_tutorials/launch中以gazebo_ma数据pping_robot.系统/运维launch为名创建一个.launch文件,并向其中添加如下代码:rosie

<?xml version="1.0"?>
<launch>
<!-- this launch file corresponds to robot model in ros-
pkg/robot_descriptions/pr2/erratic_defs/robots for full erratic -->
<param name="/use_sim_time" value="true" />
<!-- start up wg world -->
<include file="$(find gazebo_ros)/launch/willowgarage_world.launch"/>
<arg name="model" />
<param name="robot_description" command="$(find xacro)/xacro.py $(arg
model)" />
<node name="joint_state_publisher" pkg="joint_state_publisher"
type="joint_state_publisher" ></node>
<!-- start robot state publisher -->
<node pkg="robot_state_publisher" type="robot_state_publisher"
name="robot_state_publisher" output="screen" >
<param name="publish_frequency" type="double" value="50.0" />
</node>
<node name="spawn_robot" pkg="gazebo_ros" type="spawn_model" args="-urdf -
param robot_description -z 0.1 -model robot_model" respawn="false"
output="screen" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find
chapter7_tutorials)/launch/mapping.rviz"/>
<node name="slam_gmapping" pkg="gmapping" type="slam_gmapping">
<remap from="scan" to="/robot/laser/scan"/>
<param name="base_link" value="base_footprint"/>
</node>
</launch>

有了这个lau轮式移动机器人nch文件,我们就可以在Gazebo仿真环境中启动这个3D模型。在这个仿真环境中,我们能够通过正确ROS地配置RViz和通过slam_mapping来实时地构建地图。我们需要在命令行窗口中运行这个launch文件,猎豹移动机器人并在另一个命令行窗口机器人中运行teleop节点来移动机器人,需要输入的命令如下所示:

$ roslaunch chapter7_tutorials gazebo_mapping_robot.launch
model:="'rospack find chapter7_tutorials'/urdf/robot1_base_04.xacro"
$ rosrun teleop_twist_keyboard teleop_twist_keyboard.py

现在来观察图7-10,当使用键盘来移动机器人时,我们会在RViz屏幕上看到很多空白和未知机器人的空间,也有一部分空间已经被地移动机器人技术包括图覆盖,通常这部分已知的地图被称为覆盖网格地图(Occupancy Grid Map,OGM)。对应的,数据废土每当机器人移动或接rose怎么读收到新信息时,slam_mapping节点就会对地图进行更新。在构建地图之前,节点slam_mapping中国移动机器人需要对机器人的位置有一个很准确的估计,所以它需要使用激光扫描和里程计来构建OGM。


                                            如何为各种移动机器人来配置导航功能包集?

图7-10 已知的地图

当我们按照预期完成了全部地图的构建工作,就可以通过导移动机器人技术包括哪些航功能包集来将地图保存起来,并在下次使用时对其进行调用。我们可其他应收款是什么科目以使用如下命令将地图进行保存:

$ rosrun map_server map_saver -f map

成功执行上面命令之后,会产生两个文件map.pgm和map.yaml。其中第一个文件是以.pgm为格式的地图,而另一个则是该地图的配置文件。图7-11给出了map.yaml的内容:


                                            如何为各种移动机器人来配置导航功能包集?

图7-11 map.yaml

同样,现在我们可以使用自己常用的图像查看工具来打开.pgm图像文件,查看到的内容如图7-rose朴彩英12所示。


                                            如何为各种移动机器人来配置导航功能包集?

图7其他应收款-12 map.prose的农村生活gm

当我们使用机器人所创建的地图时,需要使用map_se中国移动机器人rver功能包来载入它。使用下面的命令就可以加载地图:

$ rosrun map_server map_server map.yaml

另外,我们还需要在chapter7_tutorials/launch目录中创建一个名为gazebo_map_robot. launch的.系统运维主要做什么launch文件,并添加以下代码:

<?xml version="1.0"?>
<launch>
<!-- this launch file corresponds to robot model in ros-
pkg/robot_descriptions/pr2/erratic_defs/robots for full erratic -->
<arg name="paused" default="true"/>
<arg name="use_sim_time" default="false"/>
<arg name="gui" default="true"/>
<arg name="headless" default="false"/>
<arg name="debug" default="false"/>
<!-- start up wg world -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="debug" value="$(arg debug)" />
<arg name="gui" value="$(arg gui)" />
<arg name="paused" value="$(arg paused)"/>
<arg name="use_sim_time" value="$(arg use_sim_time)"/>
<arg name="headless" value="$(arg headless)"/>
</include>
<arg name="model" />
<param name="robot_description" command="$(find xacro)/xacro.py $(arg
model)" />
<node name="joint_state_publisher" pkg="joint_state_publisher"
type="joint_state_publisher" ></node>
<!-- start robot state publisher -->
<node pkg="robot_state_publisher" type="robot_state_publisher"
name="robot_state_publisher" output="screen" >
<param name="publish_frequency" type="double" value="50.0" />
</node>
<node name="spawn_model" pkg="gazebo_ros" type="spawn_model" args="-urdf -
param robot_description -z 0.1 -model robot_model" respawn="false"
output="screen" />
<node name="map_server" pkg="map_server" type="map_server" args=" $(find
chapter7_tutorials)/maps/map.yaml" />
<node name="rviz" pkg="rviz" type="rviz" />
</launch>

现在,我们可以使用以下命令指定要使用的机rosy器人模型并启动文件:

$ roslaunch chapter7_tutorials gazebo_map_robot.launch model:="'rospack
find chapter7_tutorials'/urdf/robot_model_04.xacro"

系统运维主要做什么时,我们可以在RViz中观察到机器人模型机器人编程培训机构排名和地图。导航功能包集会使用地图服务器发布的地图和数据分析激光器的读数完成定位,这个定位是通过例如AMCL之类的扫描匹配系统运维工作内容算法实现的。

我们会在接下来的一节中学习更多关于地图和机器人定位的知识。


                                            如何为各种移动机器人来配置导航功能包集?

ROS(Rorose朴彩英bot Oper其他应收款是什么科目ating System)是一个机器人软rosie件平台,是用于实现机器人编程和开发复杂机器人应用的系统运维主要做什么夏门移动机器人源软件框架,它能为异质计算机集群提供类似操作系统的功能。ROS的前身是斯坦福人工智能实验室为了支系统运维工程师持斯坦福智能机器人STAIR而建立的交换庭(switchyard)项目。

本书包含10章内容,循序渐进地介绍了ROS相关的知识,包括ROS移动机器人技术包括哪些入门、结构与概念、可roseonly视化和调试工具、传感其他应付款器和执行器、建模与仿真、移动机器人、机械臂、微型飞行器、ROS工业软件包等。

本书适合机器人领域的工程师及研究人员阅读,书中涉及许多实用的案例和解决方案,同时涵盖了未来机器人应用开发中可预见的系统运维是干嘛的研究问题。