学习ros_tutorial笔记

前言

这篇文章在于记录我学习ros初级教程,算是个人的一个总结,如果您需要了解全部的教程,请直接访问官方tutorial,里面讲解很详细,称得上是手把手教学。

初级教程

安装并配置ROS环境

安装

根据installation进行

管理环境

检测是否配置好环境变量

1
export | grep ROS

创建ROS工作空间

  • 创建catkin工作空间

    1
    2
    mkdir -p ~/catkin_ws/src
    cd ~/catkin_ws/src
  • 刚建立为空,也可以进行编译

    1
    2
    cd ~/catkin_ws
    catkin_make

编译之后得到
catkin_make

一个需要的命令行:

1
source ./devel/setup.bash

ROS文件系统介绍

ROS文件系统是有package组成,里面会包含各种源码,脚本等等。同时,Manifest是以package.xml表现,描述各个package之间的依赖关系。
与文件系统相关的命令行工具:

  • rospack
  • roscd
  • rosls
  • 使用tab
    以上命令的意义跟Linux中去掉ros之后的命令非常像,比如roscd跟cd的意义很想,只是roscd可以直接cd到ros相关的目录下。

    ROS程序包

    这个程序包需要的架构大致如下:
    package structure
    以上的架构希望可以记住在心中,因为后面在尝试自己构建的程序包的时候,是很基本的概念。
    包的依赖可以分为一级依赖和间接依赖,依赖项分为build_depend、buildtool_depend、run_depend、test_depend。查看依赖包可以使用
    1
    rospack depends1 [程序包]

创建程序包之后,可以使用catkin_make进行编译。

理解ROS节点

首先了解一下概念:

  • Nodes:节点,一个节点即为一个可执行文件,它可以通过ROS与其它节点进行通信。
  • Messages:消息,消息是一种ROS数据类型,用于订阅或发布到一个话题。
  • Topics:话题,节点可以发布消息到话题,也可以订阅话题以接收消息
  • Master:节点管理器,ROS名称服务 (比如帮助节点找到彼此)
  • rosout: ROS中相当于stdout/stderr。
  • roscore: 主机(Master)+ rosout + 参数服务器 (参数服务器会在后面介绍)
  • 客户端库:可以是Python也可以是C++。可以允许使用不同编程语言的节点进行通信。
    接下来看到roscore,在上面的概念中提到的,它包括主机,输出以及参数服务器,所以它会包含一个比较特殊的node(节点),输出,同时它需要在运行所有ROS程序之前先运行。
    关于ROS节点可以使用的命令行工具可以有:
  • roscore
  • rosnode
  • rosrun

    ROS话题

    ROS节点是通过话题相互通信。而这种通信是通过发送消息(messages)实现。使用messages注意发布的数据类型必须相同。尝试使用rostopic pub进行广播的话题。

    ROS服务与参数

    服务(services)是节点之间通讯的另一种方式。服务允许节点发送请求(request)并获得一个响应(response)。rosservice可以很轻松的使用 ROS 客户端/服务器框架提供的服务。rosservice提供了很多可以在topic上使用的命令:
  • rosservice list 输出可用服务的信息
  • rosservice call 调用带参数的服务
  • rosservice type 输出服务类型
  • rosservice find 依据类型寻找服务find services by service type
  • rosservice uri 输出服务的ROSRPC uri
    以上指令后面可以带出一系列命令。比如:rosservice list clear。
    参数可以是整型、浮点、布尔、字符串、字典和列表等数据类型。参数可以使用:rosparam进行操作:
  • rosparam set 设置参数
  • rosparam get 获取参数
  • rosparam load 从文件读取参数
  • rosparam dump 向文件中写入参数
  • rosparam delete 删除参数
  • rosparam list 列出参数名

    使用 rqt_console 和 roslaunch

    这两个是非常有用的工具。
  • rqt_console属于ROS日志框架(logging framework)的一部分,用来显示节点的输出信息。rqt_logger_level允许我们修改节点运行时输出信息的日志等级(logger levels)(包括 DEBUG、WARN、INFO和ERROR)。
  • roslaunch可以用来启动定义在launch文件中的多个节点。
    1
    roslaunch [package] [filename.launch]

创建消息和服务

  • 消息(msg): msg文件就是一个描述ROS中所使用消息类型的简单文本。它们会被用来生成不同语言的源代码。msg文件存放在package的msg目录下。
  • 服务(srv): 一个srv文件描述一项服务。它包含两个部分:请求和响应。srv文件则存放在srv目录下。
    上面提到过,消息使用相同的数据类型。消息的数据类型可以有哪些呢?可以包含:
  • int8, int16, int32, int64 (plus uint*)
  • float32, float64
  • string
  • time, duration
  • other msg files
  • variable-length array[] and fixed-length array[C]
    还有一个特殊的数据类型:Header。而在msg文件中,每一行都包含一个:类型以及变量名。
    1
    2
    3
    4
    Header header
    string child_frame_id
    geometry_msgs/PoseWithCovariance pose
    geometry_msgs/TwistWithCovariance twist

而对于srv文件,则是分为请求和响应两部分,由’—‘分隔。

1
2
3
4
int64 A
int64 B
---
int64 Sum

在使用的时候需要相应的修改package.xml以及CMakelists.txt。

编写消息发布器以及订阅器(使用官网上的一个例子)

在src文件夹下,新建发布器talker以及订阅器listener 并且相应的修改CMakelists.txt (点击可以查看源代码)
编译运行之后,可以看到效果:
talker
listener

编写service和client(使用官网上的一个例子)

在src中添加add_two_ints_server.cpp和add_two_ints_client.cpp,可以在官网查看源代码
编译运行之后,可以得到:
service
client

至此

至此,对于ROS当中一些非常基本的概念以及关系已经了解了。之后还可以结合我在Start Guide这篇blog中提到的途径进行进一步的学习。

关于一只龟的故事

在tutorial中有一只关于龟的模拟。

  • 开启