ros基础


1. 介绍

ROS(Robot Opearting System)是一套开源的机器人操作系统(并不直接跑在裸机上,需要依附ubuntu),对各种硬件设备进行了抽象,提供了方便二次开发的基础环境,包括底层设备控制、消息传递机制、常用函数和接口、包管理。相当于提供了一整套控制机器人的开发框架,用户通过ros提供的各种基础设施,方便的实现自己的功能。主要提供python和C++接口。

这里是ROS的官方教程,很详细: http://wiki.ros.org/ROS/Tutorials

2. 安装

ubuntu16.04+kinetic 版本
按照这一页安装就可以,会在 /opt/ 目录下安装整套ros环境。

3. 基础概念

3.1. 静态结构

  • workspace: 开发目录,包含各种模块自己源码安装的、新写的模块,自己二次开发主要是在这个目录中进行。
  • package: 一个独立的模块,完整功能的单元,比如一个实现从摄像头取流、转换成mp4文件保存到本地功能的模块。
  • node: package中的一个执行程序,完成消息的接收、处理、发送等功能,传递给下一个node。

三者的关系是:1个workspace会包含多个package,多个package之间可以是依赖关系,也可以不存在依赖关系,一个package可以包含多个node,每个node提供一个具体功能。运行起来之后,最常打交道的是node。

3.2. 消息机制

  • message: node之间通过消息来通信,node1发送message给node2,node2收到后,进行处理,再发送给node3。
  • topic: 类似kafka中的topic。1个topic表示这里会中转一种类型的message。node可以从topic订阅消息,或者发布消息到这个topic。
  • service: node之间可以通过消息来通信,也可以通过service来直接通信,这样需要1个 node 提供服务,另一个node去调用相应的接口。与消息不同的是,消息发送出去,不需要回复;而服务需要明确的一问一答。

ros提供了基础的消息机制,将多个 node 动态组织起来,共同完成1个大的任务。比如 node1 从摄像头取出原始的 BGR 像素点,编码成 JPEG 图像,通过 topic1 发布出去,node2 从 topic1 订阅该消息,使用 opencv 和 ffmpeg 进行处理,编码成H264视频流,再发布到 topic2,另外的node可以通过订阅 topic2 的消息,得到 H264 视频流:

摄像头 --> node1(BGR像素点转换成JPEG图片) --> topic1 --> node2(JPEG转换成H264视频流) --> topic2 --> node3(显示视频图像)

3.3. 管理服务

  • master: ros的中心节点,负责管理各种node、topic、service、parameter等,最重要的还有提供名称服务,帮助各个节点找到彼此。
  • parameter server: 参数管理器,负责统一管理各个node的参数,并给node提供参数动态变更的机制。统一管理参数。

这两个服务相当于ros的基础服务,各个node都依赖他们来运行。

4. 常用命令

ros提供了一些自己的常用命令,需要先加载ros的环境变量才能使用:

source /opt/ros/kinetic/setup.bash

常用命令有这些:

  • roscd: 类似cd,相当于使用package名字作为相对目录
  • rosls: 类似ls
  • roscore: 启动master,其他部分的运行需要依赖这个
  • rosrun package1 node1: 运行 package1 中的 node1
  • rosservice: 查看ROS服务信息
  • rosnode: 查看node信息
  • rosparam: 查看参数信息
  • rosmsg: 查看消息类型
  • rossrv: 查看服务类型
  • rospack: 查看当前系统中所有 package 的信息

rostopic: 查看ros topic的各种信息

  • rostopic ls: 列出当前运行的topic
  • rostopic hz topic1:查看topic1上消息的频率
  • rostopic bw topic1: 查看topic1上消息的平均数据量,带宽
  • rostopic info topic1: topic1上的消息类型

rosbag: 可以保存、回放消息

  • rosbag record -a: 记录所有的topic的消息
  • rosbag record topic1: 记录 topic1 的消息
  • rosbag play -l bag_file topic1: 重放bag_file中保存的 topic1 的消息,-l 表示循环播放

5. 如何开始自己的开发

# 1. 创建 workspace
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin_init_workspace

# 2. 建立自己的 package
cd ~/catkin_ws/src/
# my_package 依赖 roscpp 等
catkin_create_pkg my_package roscpp

# 3. 在 ~/catkin_ws/src/my_package/ 中放入自己的代码,修改 CMakeLists.txt 等

# 4. 编译
cd ~/catkin_ws/
catkin_make

# 5. 运行
# 先加载自己工作空间的环境,再运行
source ~/catkin_ws/devel/setup.bash
rosrun my_package my_package_node