ROS官网中级教程学习总结(1-6)

Posted NodYoung

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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++类

以上是关于ROS官网中级教程学习总结(1-6)的主要内容,如果未能解决你的问题,请参考以下文章

ROS官网中级教程学习总结(1-6)

ROS官网初级教程学习总结(1-4)

ROS官网初级教程学习总结(1-4)

ROS官网初级教程学习总结(10-16)

ROS官网初级教程学习总结(10-16)

ROS官网初级教程学习总结(5-9)