天天看點

如何為各種移動機器人來配置導航功能包集?

在本節中,我們将讨論各種坐标系的變換和轉換樹的檢視,然後介紹如何在Gazebo和真實的機器人中釋出傳感器和裡程資訊。我們還會讨論如何建立一個用來控制移動機器人的基礎控制器。

最後,我們将研究使用一個使用ROS導航功能包集的移動機器人建立的環境地圖。

如何為各種移動機器人來配置導航功能包集?

圖7-1 ROS導航功能包集的組織架構

1.建立變換

正如我們在上一節中讨論的,導航功能包集需要關于傳感器、輪子和關節在機器人主體固定架構(也被稱作base_link)中的位置以及它們坐标架構之間關系的資訊。

我們可以回憶第3章中學習到的有關轉換架構(TF)軟體庫的知識,可以利用這些知識來管理變換樹。

換言之,我們可以為機器人增加更多的傳感器和部件,而 TF 庫将處理所有的關系,并執行所有的數學運算,進而得到一個變換樹,它根據不同參考幀之間的平移和旋轉來定義偏移。

我們在第6章中開發了移動機器人仿真模型,該模型在其底盤上安裝錄影機和雷射傳感器。此外,導航系統必須知道雷射和攝像頭在機器人底盤上的位置,以檢測碰撞,例如車輪和牆壁之間的碰撞。是以,所有傳感器和關節必須正确配置 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::LaserScan或者/sensor_msgs::PointCloud2。

我們将使用位于模拟移動機器人前面的雷射器來實作在Gazebo世界中的導航。這個雷射器是在Gazebo中仿真出來的,它在hokuyo_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_link坐标系與odom坐标系中固定點之間的距離。

導航功能包集使用的消息類型是nav_msgs/Odometry。我們可以使用以下指令檢視消息的資料結構,檢視的結果如下所示:

在圖7-5中,我們可以看到這個位姿包含兩個結構,一個顯示了歐氏坐标系中的位置,另一個則使用了一個四元數顯示了機器人的方向。同樣,速度資訊也包含兩個結構,一個是線速度,另一個是角速度。我們這裡所使用的模拟移動機器人隻有線性x速度和角z速度,因為它被模拟為差速驅動模型。

如何為各種移動機器人來配置導航功能包集?

圖7-5 裡程資訊結構

因為裡程其實就是兩個坐标系之間的位移,是以我們就有必要釋出兩個坐标系之間的坐标變換資訊。因為我們是在一個虛拟世界中工作,是以就來讨論一下如何在Gazebo中使用裡程計。

正如在前面所研究過的那樣,我們的機器人在仿真環境中的移動和現實世界中的機器人是相似的。我們使用第6章中配置過的diffdrive_plugin插件來驅動機器人,這個驅動程式會釋出機器人在仿真環境中的裡程資訊,是以我們并不需要為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
           

輸出顯示的結果如圖7-6所示。

這些指令中使用的是倒引号,而不是簡單的單引号。在這裡我們要注意這一點,防止指令’rospack 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不斷地釋出裡程計資料,我們可以通過檢視話題來觀察這些資料。我們也可以在shell中鍵入以下指令來檢視它發送的資料:

我們将看到圖7-7所示的輸出。

如何為各種移動機器人來配置導航功能包集?

圖7-7 裡程計資料

也可以通過檢視PublishOdometry(Double Step_Time)函數等來了解Gazebo是如何生成裡程測量資料的。

一旦了解了Gazebo如何以及在哪裡擷取裡程資料,下一步就是學習它如何釋出裡程資料和相對于一個真實機器人的坐标變換資料。不過,目前考慮到機器人對平台的依賴性,我們并不會在這裡研究真實的機器人。

4.基礎控制器

導航功能包集的關鍵元件之一就是基礎控制器。因為它是通過機器人硬體通信進行有效控制的唯一途徑。然而,ROS不提供任何通用的基礎控制器,是以必須為移動機器人平台開發一個基礎控制器。

基礎控制器必須訂閱名為/Cmd級别的話題,該話題具有消息類型/Geometry_msgs::Twist。此資訊也可用于以前看到的裡程計資訊。除此之外,基礎控制器必須以正确的線速度和角速度為機器人平台生成正确的指令。

我們可以通過在指令行(shell)中鍵入以下指令來調用此消息的結構,以檢視其内容:

這個指令的輸出結果如圖7-8所示。

從圖7-8可以看出,兩個向量結構分别顯示了x、y和z軸的線速度和角速度。考慮到我們所使用的機器人差速驅動平台,驅動它的兩個電動機隻能夠讓機器人前進、後退或者轉向。是以對于這個執行個體的機器人,隻需要使用線速度x和角速度z。

如何為各種移動機器人來配置導航功能包集?

圖7-8 速度指令

因為是在Gazebo這個虛拟環境中對機器人進行仿真,是以用于機器人運動/仿真的基礎控制器是在驅動程式中實作。這也就意味着在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來檢視各個節點之間的關系:

輸出的結果如圖7-9所示。

如何為各種移動機器人來配置導航功能包集?

圖7-9 基礎控制器

在圖7-9中,我們可以看到gazebo自動訂閱teleop節點生成的cmd_vel話題。就像前面講到的那樣,在Gazebo仿真環境中,正運作着差動輪式機器人仿真程式插件。仿真程式插件通過cmd_vel話題擷取控制指令資料并移動機器人。同時,仿真程式插件生成裡程資訊。另外,可以假設我們有足夠的背景知識來開發實體機器人的基礎控制器。

5.地圖

在這一章中,我們将會學習如何使用在Gazebo中建立的移動機器人來建立、儲存和加載地圖。不過,如果沒有使用合适工具的話,構造地圖将會是一件非常複雜的工作。而ROS中的工具map_server就能夠幫助你使用裡程計和雷射傳感器來建立地圖。

首先,我們需要在chapter7_tutorials/launch中以gazebo_mapping_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 -->
<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>
           

有了這個launch檔案,我們就可以在Gazebo仿真環境中啟動這個3D模型。在這個仿真環境中,我們能夠通過正确地配置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)。對應的,每當機器人移動或接收到新資訊時,slam_mapping節點就會對地圖進行更新。在建構地圖之前,節點slam_mapping需要對機器人的位置有一個很準确的估計,是以它需要使用雷射掃描和裡程計來建構OGM。

如何為各種移動機器人來配置導航功能包集?

圖7-10 已知的地圖

當我們按照預期完成了全部地圖的建構工作,就可以通過導航功能包集來将地圖儲存起來,并在下次使用時對其進行調用。我們可以使用如下指令将地圖進行儲存:

成功執行上面指令之後,會産生兩個檔案map.pgm和map.yaml。其中第一個檔案是以.pgm為格式的地圖,而另一個則是該地圖的配置檔案。圖7-11給出了map.yaml的内容:

如何為各種移動機器人來配置導航功能包集?

圖7-11 map.yaml

同樣,現在我們可以使用自己常用的圖像檢視工具來打開.pgm圖像檔案,檢視到的内容如圖7-12所示。

如何為各種移動機器人來配置導航功能包集?

圖7-12 map.pgm

當我們使用機器人所建立的地圖時,需要使用map_server功能包來載入它。使用下面的指令就可以加載地圖:

另外,我們還需要在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>
           

現在,我們可以使用以下指令指定要使用的機器人模型并啟動檔案:

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

此時,我們可以在RViz中觀察到機器人模型和地圖。導航功能包集會使用地圖伺服器釋出的地圖和雷射器的讀數完成定位,這個定位是通過例如AMCL之類的掃描比對算法實作的。

我們會在接下來的一節中學習更多關于地圖和機器人定位的知識。

本文摘自《ROS機器人程式設計實戰》,: [印度]庫馬爾·比平(Kumar Bipin)著,李華峰 ,張志宇譯。

如何為各種移動機器人來配置導航功能包集?

ROS(Robot Operating System)是一個機器人軟體平台,是用于實作機器人程式設計和開發複雜機器人應用的開源軟體架構,它能為異質計算機叢集提供類似作業系統的功能。ROS的前身是斯坦福人工智能實驗室為了支援斯坦福智能機器人STAIR而建立的交換庭(switchyard)項目。

本書包含10章内容,循序漸進地介紹了ROS相關的知識,包括ROS入門、結構與概念、可視化和調試工具、傳感器和執行器、模組化與仿真、移動機器人、機械臂、微型飛行器、ROS工業軟體包等。

本書适合機器人領域的工程師及研究人員閱讀,書中涉及許多實用的案例和解決方案,同時涵蓋了未來機器人應用開發中可預見的研究問題。