ROS-3DSLAM --开篇:综述

2021SC@SDUSC

ROS-3DSLAM --开篇:综述

一、项目简介

​ ROS是一个开源的元操作系统,适用于您的机器人。它提供了你所期望的操作系统的服务,包括硬件抽象、底层设备控制、常用功能的实现、进程间的消息传递和包管理。它还提供工具和库,用于获取、构建、编写和在多台计算机上运行代码。ROS在某些方面类似于 “机器人框架”,如Player、YARP、Orocos、CARMEN、Orca、MOOS和Microsoft Robotics Studio。

​ ROS运行时的 "图 "是一个点对点的进程网络(可能分布在机器上),使用ROS通信基础设施松散地耦合在一起。ROS实现了几种不同的通信方式,包括通过服务的同步RPC式通信,通过主题的异步数据流,以及在参数服务器上的数据存储。这些在我们的概念概述中都有更详细的解释。

​ ROS不是一个实时框架,尽管有可能将ROS与实时代码集成。Willow Garage PR2机器人使用了一个名为pr2_etherCAT的系统,该系统将ROS消息传送到实时进程中,并将其传送出去。ROS还可以与Orocos实时工具包无缝集成。

​ 虽然题目中含有3DSLAM,但和老师交流后,本次要分析的代码中,还是更侧重在整个ROS的源代码分析,不涉及3DSLAM的内容。

二、项目目录

  • 1-ros-noetic-devel:roscore相关实现,roslib的实现。
  • 2-ros_comm-noetic-devel:ros相关通信机制的实现,rospy与roscpp接口。
  • 3-geometry-noetic-devel:ros相关的各种几何变换实现。包括了tf的实现与kdl的实现。
  • 4-geometry2-noetic-devel:tf2相关的实现。选做
  • 5-navigation-noetic-devel:定位与导航相关的包实现。包括AMCL定位,代价地图,各种路径规划器等。推荐
  • 6-navigation_msgs-ros1:与导航有关的相关消息和服务的构建。
  • 7-robot_pose_ekf-master:EKF滤波器在位姿估计上的实现。
  • 8-map_store-hydro-devel:地图储存与加载。
  • 9-rviz-noetic-devel:神器rviz的实现。
  • 10-moveit-master:move it 运动框架,用来给机械臂之类的。选做
  • 11-moveit_msgs-master:与moveit有关的相关消息和服务的构建。
  • 12-rosserial-noetic-devel:ROS串口通信的实现,以及一些给arduino之类的小板子提供的ROS通信库。
  • 13-usb_cam-develop:一些常见摄像头的节点实现。选做
  • 14-video_stream_opencv-master:一些常见摄像头的节点实现。选做
  • 15-gscam-master:一些常见摄像头的节点实现。选做
  • 16-ros_controllers-noetic-devel:ros控制器库
  • 17-ros_control-noetic-devel:一组包,包括控制器接口、控制器管理器、传输和硬件_接口。

三、目标规划和分工

  1. 完成所有必做的项目分析。尽量以每周一个项目的时间进行推进。每个项目拆分成3个部分,每个人负责1个部分。每个人分析好自己负责的部分,然后每周会有一次交流和汇总,每个人负责讲解自己分析的部分,然后,其他人提问学习,最后把自己的心得记录下来。
  2. 尽量学习tf2,navigation的代码,以及摄像头节点的实现。
  3. 最后,在学有余力的情况下,尝试学习moveit运动框架,因为这个实在是太难了…

四、部分项目的核心代码分析

本人负责项目为:图、rviz和tf相关(3、4、7、8、9、11)

3-geometry-noetic-devel

ros相关的各种几何变换实现。

1、geometry:

整个程序包的引导包,无实际代码。

2、eigen_conversions:

eigen(线性代数、矩阵、向量操作等运算)与KDL(运动学和动力学信息)、geometry几何信息之间的一组转换函数。

包内有两个cpp文件:eigen_kdl.cpp和eigen_msg.cpp,实现了包括点、向量、位置、角速度、线速度等信息之间的相互转换。

3、kdl_conversions:

KDL与几何图形类型之间的转换函数。

相关函数的实现与eigen_conversions包内的函数类似。

4、tf(重点):

TF是让用户跟踪多个坐标系随着时间的推移的包。TF保持树结构中的坐标系之间的关系,并允许用户在任意时间点上转换任意两个坐标系之间的点、向量等。

tf能实现的功能包括:某个坐标系相对于其他坐标系的位姿关系;处于某个坐标系的物体,在另一个坐标系中的位姿关系;

5、tf_conversions:

此包包含一组转换函数,用于将常见TF数据类型(点、向量、姿态等)转换为其他库使用的语义相同的数据类型。转换函数使用户更容易使用他们选择的数据类型。目前,该软件包支持运动学和动力学库(KDL)和eigen矩阵库。

注:

  • Eigen是可以用来进行线性代数、矩阵、向量操作等运算的C++库
  • 由于 tf2 具有包含依赖项子集的 tf 功能的超集,因此 tf 实现已被删除并替换为对 tf2 的调用。 这意味着所有用户都将与 tf2 兼容。 建议新工作直接使用tf2。
  • KDL:Kinematics and Dynamics Library

4-geometry2-noetic-devel

自从Ros Hydro以来,已经推荐使用TF2来代替TF。TF2是TF上的迭代,通常提供相同的特征集,效率更高。以及添加一些新功能。

1、geometry2:

整个程序包的引导包,无实际代码。

2、test_tf2:

提供了一些测试函数,用来测试tf2功能包是否已经配置完成。

3、tf2(重点):

TF2是转换库的第二代,它允许用户在一段时间内跟踪多个坐标系。TF2保持树结构中的坐标系之间的关系,并允许用户在任何时间点上转换任意两个坐标帧之间的点、向量等(是geometry里的tf的迭代版本

4、tf2_bullet:

转换包,用于将TF2数据转换为bullet数据结构。这些函数是template的。

5、tf2_eigen:

转换包,用于将TF2数据转换为eigen数据结构。这些函数是template的。

6、tf2_geometry_msgs:

此包将ros消息转换为TF2消息,并从ros消息中检索数据。

7、tf2_kdl:

转换包,用于将TF2数据转换为KDL数据结构。这些函数是template的。

8、tf2_msgs:

这是对TF2和TF2_ros使用的转换和错误消息进行分组的包。

message类型包括:TF2Error, TFMessage。

service类型包括:FrameGraph

action类型包括:LookupTransform

9、tf2_py

此包允许将TF2和几何_msgs数据转换为PyObjects。还将TF2函数和异常绑定到python

10、tf2_ros(重点)

此包包含用于Python和C++的TF2库

11、tf2_senor_msgs

此包允许通过geometry_msgs::Transform转换为pointcloud 2消息。

用于TF转换sensor_msgs的库。其中最主要的msge为PointCloud 2

12、tf2_tools

提供可视化工具

7-robot_pose_ekf-master

基于不同来源(partial pose measurements)的(部分)姿态测量,利用机器人姿态EKF软件包对机器人的三维姿态进行估计。它采用扩展卡尔曼滤波的6D模型(三维位置和三维方向)结合wheel odometry, IMU sensor and visual odometry。其基本思想是提供与不同传感器的松散耦合集成,其中传感器信号作为ROS消息被接收。

EKF节点的默认启动文件可以在robot_pose_ekf包目录中找到。启动文件包含许多可配置的参数:
Freq:过滤器的更新和发布频率。请注意,随着时间的推移,更高的频率会给您提供更多的机器人姿态,但它不会提高每个估计机器人姿态的准确性。
sensor_timeout:当传感器停止向过滤器发送信息时,过滤器在没有传感器的情况下应该等待多长时间才能继续工作。
Odom_use,imu_use,vo_use:启用或禁用输入。

robot_pose_ekf包内的主要内容是3个cpp文件(重点)和相关的配置文件:

1、odom_estimation_node.cpp

对整个传感器融合过程进行ROS包装。

OdomEstimationNode实例化过程中声明了许多变量,比较重要的是它为系统、里程计、imu等声明了概率密度函数(简写为pdf)、模型,然后声明了滤波器为扩展卡尔曼滤波器(EKF)。

2、odom_estimation.cpp

构造函数为各个传感器以及系统本身创造pdf以及模型。系统模型和传感器模型模型分为两种。其中系统模型中声明属于robot_pose_ekf包自身设定的概率密度函数NonLinearAnalyticConditionalGaussianOdo

3、nonlinearanalyticconditionalgaussiannodo.cpp

提供了用于自身设定的概率密度函数

8-map_store-hydro-devel

Occupancy Grid map的存储管理器。支持命名最新地图、获取地图名称列表和发布特定地图。

1、add_map.py

脚本,启动map store的相关功能

2、map_manager.cpp(重点)

在main函数中启动map_manager节点

地图管理器,包含一些列对地图操作的函数:

-list_maps -查询所有地图。

-delete_map -删除给定的映射

-rename_map -重命名给定的地图

-publish_map -查询仓库中给定id的地图 -在/map上发布地图 -设置动态地图以加载

-dynamic_map- 返回动态地图

3、map_saver.cpp(重点)

在main函数中启动map_saver节点 。

接收地图信息,将信息处理后保存。

9-rivz-noetic-devel

rviz是ROS官方提供的一款3D可视化工具,几乎我们需要用到的所有机器人相关数据都可以在rviz中展现。

软件的主要实现集中在src目录下的rivz包内。

11-moveit_msgs

在实现机械臂的自主抓取中机械臂的运动规划是其中最重要的一部分,其中包含运动学正逆解算、碰撞检测、环境感知和动作规划等。在本课题中,采用ROS系统提供的MoveIt!完成在操作系统层的运动规划。

该包与10 moviet配合实现,内含若干.msg文件,定义了moviet中的消息类型。

五、参考资料

ROS Wiki

六、环境配置和代码下载

具体的环境安装中遇到的问题见ubuntu安装ros系统及遇到的问题总结_handsome_hhh的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/qq_38170211/article/details/120554567
今日推荐