教程網址:http://wiki.ros.org/cn/ROS/Tutorials。
本博客爲1-6小節。
手動創建ROS package
- 添加xml文件。當你的package裏已經包含配置文件(package.xml),ROS能夠找到它。執行:
rospack find [包名稱]
。應該注意到我們剛纔所創建的package.xml依賴於 roscpp 和 std_msgs.而catkin恰恰是利用這些依賴項來配置所創建的package。 - 我們還需要一個 CMakeLists.txt 文件。這樣 catkin_make才能夠利用 CMake 強大的跨平臺特性來編譯所創建的package。
cmake_minimum_required(VERSION 2.8.3)
project(foobar)
find_package(catkin REQUIRED roscpp std_msgs)
catkin_package()
管理系統依賴項
System Dependencies
ROS packages有時會需要操作系統提供一些外部函數庫,這些函數庫就是所謂的“系統依賴項”。ROS提供了一個工具rosdep來下載並安裝所需系統依賴項。ROS packages必須在配置文件中聲明他們需要哪些系統依賴項。
rosdep
rosdep 是一個能夠下載並安裝ROS packages所需要的系統依賴項的小工具 使用方法:rosdep install [package]
Roslaunch在大型項目中的使用技巧
Introduction
我們希望launch文件能夠儘可能的重用,這樣在不同的機器人平臺上就不需要修改這些launch文件就能使用。即使是從真實的環境轉到模擬環境中也只要稍微修改即可。
高層級的結構
利用指令 “rospack find 2dnav_pr2/move_base/2dnav_pr2.launch”可以找到 一個高層級的launch文件。
<launch>
<group name="wg">
<include file="$(find pr2_alpha)/$(env ROBOT).machine" />
<include file="$(find 2dnav_pr2)/config/new_amcl_node.xml" />
<include file="$(find 2dnav_pr2)/config/base_odom_teleop.xml" />
<include file="$(find 2dnav_pr2)/config/lasers_and_filters.xml" />
<include file="$(find 2dnav_pr2)/config/map_server.xml" />
<include file="$(find 2dnav_pr2)/config/ground_plane.xml" />
<!-- The navigation stack and associated parameters -->
<include file="$(find 2dnav_pr2)/move_base/move_base.xml" />
</group>
</launch>
這個文件引用了其他的文件。在這些被引用的文件中都包含有與系統有關的node和parameter(甚至是嵌套引用),比如定位、傳感器處理和路徑規劃。
編寫技巧: 高層級的launch文件應該簡短,利用include指令將系統的組成部分和ROS parameter引用過來即可。
Machine tags and Environment Variables
爲了平衡負載和管理帶寬,我們需要控制哪些節點在哪個機器上運行。同時,考慮到重用性,我們不希望把具體的機器名寫入launch文件。roslaunch使用machine tags來解決這個問題。
第一個引用如下:
<include file="$(find pr2_alpha)/$(env ROBOT).machine" />
這個文件使用 env 置換符來使用ROBOT變量的值。例如,在roslaunch指令前執行:export ROBOT=pre
,將會使得pre.machine 被引用。
編寫技巧: 使用 env 置換符可以使得launch文件的一部分依賴於環境變量的值。
Parameters, namespaces, and yaml files
看一下被引用的 move_base.xml文件:
<node pkg="move_base" type="move_base" name="move_base" machine="c2">
<remap from="odom" to="pr2_base_odometry/odom" />
<param name="controller_frequency" value="10.0" />
<param name="footprint_padding" value="0.015" />
<param name="controller_patience" value="15.0" />
<param name="clearing_radius" value="0.59" />
<rosparam file="$(find 2dnav_pr2)/config/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam file="$(find 2dnav_pr2)/config/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam file="$(find 2dnav_pr2)/move_base/local_costmap_params.yaml" command="load" />
<rosparam file="$(find 2dnav_pr2)/move_base/global_costmap_params.yaml" command="load" />
<rosparam file="$(find 2dnav_pr2)/move_base/navfn_params.yaml" command="load" />
<rosparam file="$(find 2dnav_pr2)/move_base/base_local_planner_params.yaml" command="load" />
</node>
這一小段代碼負責啓動move_base節點。 第一個引用元素是 remapping.
編寫技巧: 當一個給定類型的信息在不同的情況下發布在不同的topic上,我們可以使用topic remapping
文件有好幾個標籤。這些參數是節點的內部元素(因爲它們都寫在之前),因此它們是節點的私有參數。
在元素之後,還有一些元素,它們將從yaml文件中讀取參數。yaml是一種易於人類讀取的文件格式,支持複雜數據的結構。
編寫技巧: Yaml文件允許複雜的嵌套域名的參數,相同的參數值可以在多個地方重複使用。
launch文件的重用
參數重載
ROS在多機器人上的使用
概述
在多個機器人上使用ROS是一件很簡單的事,你只需要記住一下幾點:
- 你只需要一個master,只要在一個機器上運行它就可以了。
- 所有節點都必須通過配置 ROS_MASTER_URI連接到同一個master。
- 任意兩臺機器間任意兩端口都必須要有完整的、雙向連接的網絡。
- 每臺機器都必須向其他機器廣播其能夠解析的名字。
跨機器運行的 Talker / listener
啓動 master
啓動 listener
啓動 talker
運行出錯
譯者注
自定義消息
自定義消息
不要忘記選擇相應的編譯構建系統。
引用和輸出消息類型
消息類型都被歸屬到與package相對應的域名空間下,例如:
C++
#include <std_msgs/String.h>
std_msgs::String msg;
Python
from std_msgs.msg import String
msg = String()
依賴項
如果你要使用在其他package裏定義的消息類型,不要忘記在 package.xml添加<build_depend>
和<run_depend>
。