ROS官網中級教程學習總結(1-6)

教程網址:http://wiki.ros.org/cn/ROS/Tutorials
本博客爲1-6小節。

手動創建ROS package

  1. 添加xml文件。當你的package裏已經包含配置文件(package.xml),ROS能夠找到它。執行:rospack find [包名稱]。應該注意到我們剛纔所創建的package.xml依賴於 roscpp 和 std_msgs.而catkin恰恰是利用這些依賴項來配置所創建的package。
  2. 我們還需要一個 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>

在python中使用C++類

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章