ROS 编程

从本章开始,我们就要正式地接触 ROS 编程了。在之前的章节,你了解到用命令行启动 ROS程序、发送指令消息,或使用可视化界面来调试机器人。你可能很想知道,这些工具到底是如何实现这些功能的。其实这些工具本质上都是基于 ROS 的客户端库(Client Library)实现的,所谓客户端库,简单理解就是一套接口,ROS 为机器人开发者提供了不同语言的接口,比如 roscpp 是C++语言的 ROS 接口,rospy 是 Python 语言的 ROS 接口,我们直接调用它所提供的函数就可以实 现 topic、service 等通信功能。

本章分为两大节,分别介绍 roscpp 和 rospy。第一节介绍 roscpp 的基本函数和用 C++开发 ROS的基本方法。本节的内容需要有 C++的基础,如果你对 C++比较陌生,建议先学习 C++编程。第二节学习 ROS 的另一个接口 rospy,也即 Python 语言的接口。客户端库(Client Library)不仅仅指的是 C++、Python 语言的接口,其实是各种语言的接口统称。rospy 中函数的定义、函数的用法都和 roscpp 不相同。结合这些内容,本章还给出了 topic demo 和 service demo 的具体格式和写法,方便读者更直观地学习 roscpp 和 rospy 编程。

简介

ROS 为机器人开发者们提供了不同语言的编程接口,比如 C++接口叫做 roscpp,Python 接口叫做 rospy, Java 接口叫做 rosjava。尽管语言不同,但这些接口都可以用来创建 topic、 service、param,实现 ROS 的通信功能。Client Library 有点类似开发中的 Helper Class,把一些常用的基本功能做了封装。目前 ROS 支持的 Client Library 如表 4.1 所示。目前最常用的只有 roscpp 和 rospy,而其余的语言版本基本都还是测试版。

表 4.1 Client Library

Client Library 介绍
roscpp ROS 的 C++库,是目前应用最广泛的 ROS 客户端库,执行效率高
rospy ROS 的 Python 库,开发效率高,通常用在对运行时间没有太大要求的场合,例如配置、初始化等操作
roslisp ROS 的 LISP 库
roscs Mono/.NET.库,可用任何 Mono/.NET 语言,包括 C#、Iron Python、Iron Ruby 等
rosgo ROS Go 语言库
rosjava ROS Java 语言库
rosnodejs Javascript 客户端库

从开发客户端库的角度看,一个客户端库,至少需要包括节点管理器注册、名称管理、消息收发等功能。这样才能给开发者提供对 ROS 通信架构进行配置的方法。

ROS 的整体框架如图 4.1 所示。你可以看到整个 ROS 包括的 package,还可以看到 roscpp、 rospy处于什么位置。

图 4.1 ROS 整体框架

roscpp

roscpp 位于/opt/ros/noetic 之下,用 C++实现了 ROS 通信。在 ROS 中, C++的代码是通过 catkin这个编译系统(扩展的 CMake)来进行编译构建的。所以简单地理解,也可以把 roscpp 就当作一个 C++的库,我们创建一个 CMake 工程,在其中调用了 roscpp 等 ROS 的库,这样就可以在工程中使用 ROS 提供的函数了。

通常我们要调用 ROS 的 C++接口,首先就需要包含 #include ,具体可见 http://docs.ros.org/api/roscpp/html/index.html。

roscpp 的主要部分包括:

① ros::init() 解析传入的 ROS 参数,创建节点第一步需要用到的函数。

② ros::NodeHandle 和 topic、service、param 等交互的公共接口

③ ros::master 包含从节点管理器查询信息的函数

④ ros::this_node 包含查询这个进程的函数

⑤ ros::service 包含查询服务的函数

⑥ ros::param 包含查询参数服务器的函数,而不需要用到 NodeHandle

⑦ ros::names 包含处理 ROS 图资源名称的函数

以上功能可以分为以下的类别:

① Initialization and Shutdown 初始与关闭节点

② Publisher and Subscriber 发布和订阅

③ service 服务

④ parameter server 参数服务器

⑤ Timer 定时器

⑥ NodeHandle 节点句柄

⑦ Callback and Spinning 回调与轮询

⑧ Logging 日志

⑨ Names and Node Information 名称管理

⑩ Time 时钟

rospy

rospy 与 roscpp 的比较

rospy 是 Python 版本的 ROS 客户端库,提供了 Python 编程需要的接口,可认为 rospy 就是一个 Python 的模块(module)。这个模块位于/opt/ros/kinetic/lib/python2.7/dist-packages/rospy(ROS Kinetic/Melodic)或/opt/ros/noetic/lib/python3/dist-packages/rospy(ROS Noetic)之中()。

rospy 包含的功能与 roscpp 相似,都有关于节点、topic、service、param、Time 相关的操作。但同时 rospy 和 roscpp 也有一些区别:

① rospy 没有 NodeHandle,例如创建 Publisher、Subscriber 等操作都被直接封装成了 rospy 中的函数或类,调用起来简单、直观。

② rospy 一些接口的命名和 roscpp 不一致,需要开发者注意,避免调用错误。

相比于 C++的开发,用 Python 来写 ROS 程序开发效率大大提高,诸如显示、类型转换等细节不再需要我们注意,可以节省时间成本。但 Python 的执行效率较低,同样一个功能用 Python运行的耗时会高于 C++。因此,我们开发 SLAM、路径规划、机器视觉等方面的算法时,往往优先选择 C++。ROS 中绝大多数基本指令,例如 rostopic、roslaunch,都是用 Python 开发的,简单、轻巧。

results matching ""

    No results matching ""