> 文章列表 > 学习机器人SLAM导航核心技术(二)之ROS

学习机器人SLAM导航核心技术(二)之ROS

学习机器人SLAM导航核心技术(二)之ROS

第1章:ROS入门必备知识

ROS全称Robot Operating System,是一个用于机器人应用开发的开源框架。ROS提供了一系列工具和库,使得机器人开发者可以更轻松地编写软件,从而实现机器人的感知、控制、定位、导航等功能。ROS使用publisher-subscriber模型实现消息传递,支持多种编程语言。由于它拥有方便的模块化设计,可以让开发者更方便地调试和修改程序,大大缩短机器人应用的开发时间。ROS在机器人领域得到了广泛应用,也成为了学术界和工业界的标准工具之一。

ROS概述

  • ROS是适用于机器人的开源元操作系统
  • ROS集成了大量的工具,库,协议,提供类似OS所提供的功能,简化对机器人的控制
  • 提供用于在多台计算机上获取,构建,编写和运行代码的工具和库,ROS在某些方面类似于“机器人框架”
  • ROS设计者将ROS表述为“ROS = Plumbing + Tools + Capabilities +
  • Ecosystem”,即ROS是通讯机制、工具软件包、机器人高层技能以及机器人生态系统的集合体

机器人开发的分工思想,实现了不同研发团队间的共享和协作,提升了机器人的研发效率,为了服务“ 分工”,ROS主要设计了如下目标:

  • 代码复用:ROS的目标不是成为具有最多功能的框架,ROS的主要目标是支持机器人技术研发中的代码重用。

  • 分布式:ROS是进程(也称为Nodes)的分布式框架,ROS中的进程可分布于不同主机,不同主机协同工作,从而分散计算压力

  • 松耦合:ROS中功能模块封装于独立的功能包或元功能包,便于分享,功能包内的模块以节点为单位运行,以ROS标准的IO作为接口,开发者不需要关注模块内部实现,只要了解接口规则就能实现复用,实现了模块间点对点的松耦合连接

  • 精简:ROS被设计为尽可能精简,以便为ROS编写的代码可以与其他机器人软件框架一起使用。ROS易于与其他机器人软件框架集成:ROS已与OpenRAVE,Orocos和Player集成。

  • 语言独立性:包括Java,C++,Python等。为了支持更多应用开发和移植,ROS设计为一种语言弱相关的框架结构,使用简洁,中立的定义语言描述模块间的消息接口,在编译中再产生所使用语言的目标文件,为消息交互提供支持,同时允许消息接口的嵌套使用

  • 易于测试:ROS具有称为rostest的内置单元/集成测试框架,可轻松安装和拆卸测试工具。

  • 大型应用:ROS适用于大型运行时系统和大型开发流程。

  • 丰富的组件化工具包:ROS可采用组件化方式集成一些工具和软件到系统中并作为一个组件直接使用,如RVIZ(3D可视化工具),开发者根据ROS定义的接口在其中显示机器人模型等,组件还包括仿真环境和消息查看工具等
    免费且开源:开发者众多,功能包多

ROS发展历程

ROS是一个由来已久、贡献者众多的大型软件项目。在ROS诞生之前,很多学者认为,机器人研究需要一个开放式的协作框架,并且已经有不少类似的项目致力于实现这样的框架。在这些工作中,斯坦福大学在2000年年中开展了一系列相关研究项目,如斯坦福人工智能机器人(STandford AI Robot, STAIR)项目、个人机器人(Personal Robots, PR)项目等,在上述项目中,在研究具有代表性、集成式人工智能系统的过程中,创立了用于室内场景的高灵活性、动态软件系统,其可以用于机器人学研究。

  • 2007年:ROS的前身“Switchyard”项目开始由斯坦福大学人工智能实验室的Morgan Quigley、Brian Gerkey和William D. Smart开发。
  • 2009年:ROS被正式发布,并且在it-robots Exhibition大会上进行展示。ROS的第一个稳定版本,即ROS 1.0,也在同年发布。
  • 2010年:由Google主办的DARPA Virtual Robotics Challenge中,许多选手都使用了ROS作为他们的机器人控制平台。
  • 2012年:ROS最重要的更新之一,即Groovy Galapagos版本发布。
  • 2013年:ROS的发展迅速,用户数量和软件包数量都有大幅度的增长。
  • 2014年:ROS新版本Indigo Igloo发布,此版本改进了ROS的核心工具,并增加了面向工业的功能。ROS进入了工业界,并在很多项目中得到了应用。
  • 2016年:ROS的新版本Kinetic发布,该版本支持Ubuntu Xenial 16.04 LTS操作系统,将ROS系统的稳定性和可靠性提高到了一个新的水平。
  • 2020年:ROS2的稳定版本Dashing Diademata发布,与ROS1相比,ROS2支持更多的平台和操作系统,并且具有更好的实时性和安全性。

ROS的发行版本(ROS distribution)指ROS软件包的版本,其与Linux的发行版本(如Ubuntu)的概念类似。推出ROS发行版本的目的在于使开发人员可以使用相对稳定的代码库,直到其准备好将所有内容进行版本升级为止。因此,每个发行版本推出后,ROS开发者通常仅对这一版本的bug进行修复,同时提供少量针对核心软件包的改进。
版本特点按照英文字母顺序命名,ROS 目前已经发布了ROS1 的终极版本: noetic,并建议后期过渡至 ROS2 版本。noetic 版本之前默认使用的是 Python2,noetic 支持 Python3。建议版本: noetic 或 melodic 或 kinetic

总的来说,自2007年以来,ROS已经在机器人领域飞速发展,并且成为了最受欢迎的机器人操作系统之一,也得到了学术界和工业界的广泛应用。

ROS简单使用

ROS中涉及的编程语言以C++和Python为主,ROS中的大多数程序两者都可以实现,在本系列教程中,每一个案例也都会分别使用C++和Python两种方案演示,大家可以根据自身情况选择合适的实现方案。

ROS中的程序即便使用不同的编程语言,实现流程也大致类似,以当前HelloWorld程序为例,实现流程大致如下:

在ROS中实现HelloWorld程序,可以采取以下大致流程:

  • 创建ROS工作空间(ROS workspace):首先需要创建ROS工作空间来承载本次工程。

  • 创建一个ROS功能包(ROS package):在工作空间中创建一个新的ROS包,这个包将包含我们的代码和依赖包。

  • 编写ROS节点:在ROS包中创建ROS节点,这个节点将会发送Hello World消息。

  • 编译和构建(build)ROS包:将ROS节点打包成一个可执行的二进制文件。

  • 运行ROS节点:在终端中运行ROS节点,此时ROS节点将会发送Hello World消息。

详细实现流程可以参考官方文档或者教程,这里只是一个大致的流程概述。虽然实现同一功能时,C++和Python可以互换,但是具体选择哪种语言,需要视需求而定,因为两种语言相较而言:C++运行效率高但是编码效率低,而Python则反之,基于二者互补的特点,ROS设计者分别设计了roscpp与rospy库,前者旨在成为ROS的高性能库,而后者则一般用于对性能无要求的场景,旨在提高开发效率。

创建工作空间并初始化

创建一个工作空间以及一个 src 子目录,然后再进入工作空间调用 catkin_make命令编译。

mkdir -p 自定义空间名称/src
cd 自定义空间名称
catkin_make

进入 src 创建 ros 包并添加依赖

在工作空间下生成一个功能包,该功能包依赖于 roscpp、rospy 与 std_msgs,其中roscpp是使用C++实现的库,而rospy则是使用python实现的库,std_msgs是标准消息库,创建ROS功能包时,一般都会依赖这三个库实现

cd src
catkin_create_pkg 自定义ROS包名 roscpp rospy std_msgs

HelloWorld(C++版)

假设你已经创建了ROS的工作空间,并且创建了ROS的功能包,那么就可以进入核心步骤了,使用C++编写程序实现:

进入 ros 包的 src 目录编辑源文件后,C++源码实现(文件名自定义)

// 导入ROS的头文件
#include "ros/ros.h"int main(int argc, char *argv[])
{// 初始化ROS节点ros::init(argc, argv, "hello_world");// 创建句柄ros::NodeHandle nh;// 输出Hello World!ROS_INFO("Hello World!");return 0;
}

编辑 ros 包下的 Cmakelist.txt文件

add_executable(步骤3的源文件名src/步骤3的源文件名.cpp
)
target_link_libraries(步骤3的源文件名${catkin_LIBRARIES}
)

进入工作空间目录并编译

cd 自定义空间名称
catkin_make生成 build devel ....

执行
先启动命令行1:

roscore

再启动命令行2:

cd 工作空间
source ./devel/setup.bash
rosrun 包名 C++节点

HelloWorld(Python版)

假设你已经创建了ROS的工作空间,并且创建了ROS的功能包,那么就可以进入核心步骤了,使用Python编写程序实现:

进入 ros 包添加 scripts 目录并编辑 python 文件

cd ros包
mkdir scripts

新建 python 文件: (文件名自定义)

#! /usr/bin/env python"""Python 版 HelloWorld"""
import rospyif __name__ == "__main__":rospy.init_node("Hello")rospy.loginfo("Hello World!!!!")

为 python 文件添加可执行权限

chmod +x 自定义文件名.py

编辑 ros 包下的 CamkeList.txt 文件

catkin_install_python(PROGRAMS scripts/自定义文件名.pyDESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

进入工作空间目录并编译

cd 自定义空间名称
catkin_make

进入工作空间目录并执行
先启动命令行1:

roscore

再启动命令行2:

cd 工作空间
source ./devel/setup.bashrosrun 包名 自定义文件名.py

输出结果:Hello World!!!