从零入门激光SLAM(三)——什么是ROS

大家好呀,我是一个SLAM方向的在读博士,深知SLAM学习过程一路走来的坎坷,也十分感谢各位大佬的优质文章和源码。随着知识的越来越多,越来越细,我准备整理一个自己的激光SLAM学习笔记专栏,从0带大家快速上手激光SLAM,也方便想入门SLAM的同学和小白学习参考,相信看完会有一定的收获。如有不对的地方欢迎指出,欢迎各位大佬交流讨论,一起进步。

目录

roslib - ROS Wiki

1、什么是ROS

1.1 什么是ROS

1.2 ROS特点

1.3 ROS基本概念

1.4 控制小海龟

2、ROS编程基础

2.1 ROS通信流程

2.2 ROS编程流程

2.3 ROS常用命令



roslib - ROS Wiki

ROS官方教程链接 

1、什么是ROS

1.1 什么是ROS

     ROS的原型源自斯坦福大学的STanford Artificial Intelligence Robot (STAIR) 和 Personal Robotics (PR)项目。ROS是用于编写机器人软件程序的一种具有高度灵活性的软件架构。它包含了大量工具软件、库代码和约定协议,旨在简化跨机器人平台创建复杂、鲁棒的机器人行为这一过程的难度与复杂度。ROS设计者将ROS表述为“ROS = Plumbing + Tools + Capabilities + Ecosystem”,即ROS是通讯机制、工具软件包、机器人高层技能以及机器人生态系统的集合体。

        我通常这样解释ROS:

        1. 通道:ROS提供了一种发布-订阅式的通信框架用以简单、快速地构建分布式计算系。

        2. 工具:ROS提供了大量的工具组合用以配置、启动、自检、调试、可视化、登录、测试、终止分布式计算系统。

        3. 强大的库:ROS提供了广泛的库文件实现以机动性、操作控制、感知为主的机器人功能。

        4. 生态系统:ROS的支持与发展依托着一个强大的社区。ros.org尤其关注兼容性和支持文档,提供了一套“一站式”的方案使得用户得以搜索并学习来自全球开发者数以千计的ROS程序包。

 ROS广泛应用在机器人领域,应用功能:SLAM、导航、定位、图像处理、机械臂控制等。

怎么安装ROS网上教程很多这里不再赘述。

1.2 ROS特点

        ROS Wiki对于 机器人操作系统(ROS) 的解释是:ROS是一个适用于机器人的开源的元操作系统。它提供了操作系统应有的服务,包括硬件抽象,底层设备控制,常用函数的实现,进程间消息传递,以及包管理。它也提供用于获取、编译、编写、和跨计算机运行代码所需的工具和库函数。它的目的是为了提高机器人研发中的软件复用率,简化跨机器人平台创建复杂、鲁棒的机器人行为这一过程的难度与复杂度。

 

 

 

 

1.3 ROS基本概念

1、node: 节点. 节点就是一些直行运算任务的进程。节点之间是通过传送消息进行通讯的,一个节点可以有多个话题;ROS中,通常来讲我们写的c++程序主函数所在的程序称为一个节点;

2、message: 消息.机器人需要传感器,传感器采集到的信息,即这儿的message.(如:位置消息,温度、湿度等);消息以一种发布/订阅的方式传递;

3、topic: 话题.node交换Messages的命名总线异步通讯机制,传输消息; 

4、package: 包 是组织ROS代码的最基本单位,每一个Package都可以包括库文件,可执行文件,脚本及其它的一些文件。

5、workSpace: 工作空间 用来存放很多不同package的。

6、roslaunch: 启动文件,其目的是一次性启动多个节点s。

7、Master: 节点管理器,ROS名称服务,帮助节点找到彼此。

8、publish : 发布器,把相关的信息发送到topic

9、subscribe: 订阅器,订阅相应的topic,接收话题的信息

ROS分为两层,底层是操作系统层,上层则是广大用户编写提供的各种功能不同的软件包,比如定位导航,行动规划等等。所以ROS实际上可以看成是一个中间层,提供和重新封装了底层硬件调用的API,这些重新封装的API称为客户端库,运用这些库可是实现硬件调用,以此实现各种不同的功能,如使用激光雷达扫描生成周围环境的2D地图。ROS框架基于集中式拓扑图结构,它的进程(即节点,ROS以节点形式进行通信,以此实现功能)是分布式的,进程分布在各个功能不同的功能包里面。

1.4 控制小海龟

通过上述的讲解,你应该知道了ROS系统是用于机器人开发的,有很多功能包且开源免费,但可能对ROS中概念还是不太理解,下面我们一起运行个小例子。

1.控制小海龟

2.Rqt_graph查看节点

 可以看到启动了两个节点,/teleop_turtle和/turtleslm,他们之间传递的topic是/turtle1/cmd_vel。什么意思呢?比如你和你女神发微信表白,节点就是你和你女神,topic就是表白的题目,message就是具体内容。由于你是发信息的,所以你有一个publish发布器,你女神有一个subscribe接收器,但女神必须要订阅你的消息你才能发送成功,怎么算订阅呢?就是你发的topic和她收的topic名字一样。

3.查看节点和订阅话题及信息

就是查看你给女神发了多少信息

4.监听话题信息具体内容

查看你发的信息内容具体是什么

 

5.Rqt_plot可视化工具

2、ROS编程基础

2.1 ROS通信流程

ROS编程是在一个工作空间内(先理解就是一个特殊的文件夹)进行的,通常一个工作空间具有如下4个内容:

常用到的概念如下:

在我的学习过程中,常用到的ROS编程主要分为一下3种:

1.话题通信流程:你给女神发消息,女神对消息查看

2.服务器通信流程:你发完消息,女神执行动作,比如把你拉黑了

3.参数通信流程:一个公用的参数空间,谁都可以订阅和发布参数,比如朋友圈

以上不管是哪种通信机制,都需要在工作空间建立功能包,下面将讲述如何初始化工作空间和功能包。

2.2 ROS编程流程

我们可以通过上述的三种通信流程实现各种各样的功能,实现的过程就是ROS编程。

1.创建ROS工作空间流程

盖楼先开地,写代码也是,先创建一个名为catkin_ws的工作空间用于我们编程

#1、创建工作空间
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace

#2、编译工作空间
$ cd ~/catkin_ws
$ catkin_make
对于ROS Melodic和早期版本的Python 3用户:注意,如果你从源代码构建ROS来实现Python 3的兼容性,并适当地设置您的系统(即:安装所有必需的ROS Python包的Python 3版本,例如catkin),那么在干净的catkin工作区中的第一个catkin_make命令必须是:
catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3

#3、设置环境变量添加ROS环境
$ source devel/setup.bash

#4、检查环境变量
$ echo $ROS_PACKAGE_PATH
/home/<username>/catkin_ws/src:/opt/ros/<distro>/share

 2.创建功能包

有了地之后,你想盖什么都行了。

一个包要想称为catkin软件包,必须符合以下要求:

  • 这个包必须有一个符合catkin规范的package.xml文件
  • 这个包必须有一个catkin版本的CMakeLists.txt文件
  • 每个包必须有自己的目录,这意味着在同一个目录下不能有嵌套的或者多个软件包存在

下面是一个catkin软件包的结构,一个package为一个整体。

workspace_folder/        -- WORKSPACE
  src/                   -- SOURCE SPACE
    CMakeLists.txt       -- 'Toplevel' CMake file, provided by catkin
    ————————————————————————————————
    package_1/
      CMakeLists.txt     -- CMakeLists.txt file for package_1
      package.xml        -- Package manifest for package_1
    ...
    package_n/
      CMakeLists.txt     -- CMakeLists.txt file for package_n
      package.xml        -- Package manifest for package_n

现在使用catkin_create_pkg命令创建一个名为beginner_tutorials的新软件包,这个软件包依赖于std_msgsroscpprospy,CMakelists和package.xml将会被自动创建

$ cd ~/catkin_ws/src
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
$ rospack depends1 beginner_tutorials  #查看功能包的直接依赖
    std_msgs
    rospy
    roscpp
$ rospack depends beginner_tutorials  #查看所有依赖

  3.启动功能包

$ roscore   #启动节点管理器
$ rosrun [package_name] [node_name] #运行ROS节点

经过上述操作,我们就得到了一个名为 beginner_tutorials在catkin工作空间下的软件包。现在你大概知道了一个ROS功能包的建立过程,到底怎么建立后面会详细讲解。现在先熟悉一下全部的流程。

2.3 ROS常用命令

再真正的写一个完整的ROS包之前,先掌握一些常用的命令

  • Rospack 找功能包位置
$ rospack find [package_name]
/opt/ros/<distro>/share/roscpp
  • Roscd 移动到功能包位置
$ roscd realsense2_camera
/opt/ros/noetic/share/realsense2_camera
$ pwd #输出当前路径
  • Rosnode 节点查询
$ rosnode list #查看当前所有节点
$ rosnode ping [node] #查看节点是否连通
$ rosnode kill [node] #杀死节点
$ rosnode cleanup #杀死僵尸节点
$ rosnode info /image_enhance_node #查看该节点的信息
(base) cxl@cxl-Lenovo-ThinkBook-16p-Gen-2:~/workspace/image_enhance$ rosnode info /image_enhance_node 
--------------------------------------------------------------------------------
Node [/image_enhance_node]
Publications: 
 * /image_enhancement [sensor_msgs/Image]
 * /rosout [rosgraph_msgs/Log]
Subscriptions: 
 * /pub_t [unknown type]
Services: 
 * /image_enhance_node/get_loggers
 * /image_enhance_node/set_logger_level
contacting node http://cxl-Lenovo-ThinkBook-16p-Gen-2:42247/ ...
Pid: 8680
Connections:
 * topic: /rosout
    * to: /rosout
    * direction: outbound (53451 - 127.0.0.1:59978) [11]
    * transport: TCPROS
  • Rostopic 话题编程中查看话题
rostopic list #查看当前所有消息
$ rostopic list -v #查看当前所有消息的具体信息
Published topics:
 * /rosout_agg [rosgraph_msgs/Log] 1 publisher
Subscribed topics:
     * /rosout [rosgraph_msgs/Log] 1 subscriber
$ rostopic echo [topic] #查看节点信息
$ rostopic type [topic] #查看消息类型
$ rostopic hz [topic] #查看速率
$ rostopic echo /livox/imu | grep frame_id #查看当前消息的frame_id
$ rostopic pub [topic] [msg_type] [args] #rostopic pub可以把数据发布到当前某个正在广播的话题上。
$ rostopic info /image_enhance  #查看与/image_enhance话题相关的信息
$ rostopic pub -1 /turtle1/command_velocity turtlesim/Velocity  -- 2.0  1.8
以上命令会发送一条消息给turtlesim,告诉它以2.0大小的线速度和1.8大小的角速度移动。
  • Rosservice  服务编程中查看服务
rosservice list         输出活跃服务的信息
rosservice call         用给定的参数调用服务
rosservice type         输出服务的类型
rosservice find         按服务的类型查找服务
rosservice uri          输出服务的ROSRPC uri
rosservice type [service]
rosparam set            设置参数
rosparam get            获取参数
rosparam load           从文件中加载参数
rosparam dump           向文件中转储参数
rosparam delete         删除参数
rosparam list           列出参数名

小例子:改变背景颜色

可以在不用重新启动代码或roslaunch的情况下对参数进行修改

$ rosparam get /turtlesim/background_r  #获取颜色
$ rosparam set /turtlesim/background_r  #设置颜色
$ rosservice call /clear  #初始化修改参数
  • Rosmsg 显示消息类型信息
rosmsg list           #列出ros中所有的msg
rosmsg packages      #列出有msg的所有包
rosmsg package public_massage  #列出public_massage下的msg
rosmsg show 包名/数据名 #显示消息 

cn/ROS/Tutorials/WritingPublisherSubscriber(c++) - ROS Wiki

到这里你已经知道什么是ROS了,如果你想亲自从头编写请看上述官方教程的小例子,已经十分详细了。博主将直接带你在LIO-SAM代码工程中学习ROS怎么使用和编写,详细解读每个ROS自定义文件如何编写,会是一个提升。

猜你喜欢

转载自blog.csdn.net/HUASHUDEYANJING/article/details/129805075