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:一组包,包括控制器接口、控制器管理器、传输和硬件_接口。
三、目标规划和分工
- 完成所有必做的项目分析。尽量以每周一个项目的时间进行推进。每个项目拆分成3个部分,每个人负责1个部分。每个人分析好自己负责的部分,然后每周会有一次交流和汇总,每个人负责讲解自己分析的部分,然后,其他人提问学习,最后把自己的心得记录下来。
- 尽量学习tf2,navigation的代码,以及摄像头节点的实现。
- 最后,在学有余力的情况下,尝试学习moveit运动框架,因为这个实在是太难了…
四、部分项目的核心代码分析
本人负责项目为:
- 1-ros-noetic-devel
- 5-navigation-noetic-devel
- 6-navigation_msgs-ros1
- 10-moveit-master
- 13-usb_cam-develop
1-ros-noetic-devel
- core
- mk: 大多数软件包的作者应该使用cmake .mk,它调用CMake来构建软件包。这个软件包中的其他文件是为了在特殊情况下使用的,这些情况大多是在导入第三方代码时出现的。
- rosbuild: rosbuild包含用于管理基于CMake的ROS构建系统的脚本。
- roslang: roslang是所有ROS客户库依赖的一个通用包。这主要是用来寻找客户端库(通过’
rospack depends-on1 roslang’)。 - roslib(重点): roslib是所有ROS客户端库和工具的基础依赖。它包含了常见的工具,如消息和服务的生成器,以及常见的消息定义,如Header和Log。它还包含了ROS Python节点和工具的通用路径启动代码。
- tools
- rosbash: 在bash中使用ros的各种shell命令。
- rosbash_cfg: 包含rosboost-cfg工具所使用的脚本,用于确定你系统上boost的cflags/lflags/等等。
- rosclean: rosclean:清理文件系统资源(如日志文件)。
- roscreate: roscreate包含一个协助创建ROS文件系统资源的工具。它提供roscreate-pkg,它创建了一个新的软件包目录。包括适当的构建和清单文件。
- rosmake: rosmake是一个ros依赖性提醒的构建工具,可以用来以正确的顺序构建所有的依赖项。
- rosunit: ROS的单元测试包。它是rostest的一个低级库,处理单元测试,而rostest处理集成测试。
5-navigation-noetic-devel
一个二维导航堆栈,从测距仪、传感器流和目标姿势中获取信息,并输出安全速度指令,发送到要移动的物体。
-
amcl(重点): amcl是一个在二维移动的机器人的概率定位系统。它实现了自适应(或KLD-采样)蒙特卡洛定位方法(如Dieter Fox所描述的),该方法使用粒子过滤器来跟踪机器人的姿势与已知地图。
-
base_local_planner(重点): 该软件包提供了轨迹滚动和动态窗口方法的实现,用于机器人在平面上的局部导航。给出一个要遵循的计划和一个成本图,控制器产生速度指令,并发送给移动的物体。该软件包支持整体机器人和非整体机器人,支持任何可表示为凸多边形或圆的机器人足迹,并将其配置暴露为可在启动文件中设置的ROS参数。这个包的ROS包装器坚持使用nav_core包中指定的
BaseLocalPlanner接口。 -
carrot_planner: 这个规划器试图找到一个合法的地方来放置一个目标(类似胡萝卜),让机器人跟随。它通过沿着机器人和目标点之间的矢量向后移动来实现这一目标。
-
clear_costmap_recovery: 这个包为导航堆栈提供了一个恢复行为,它试图通过将导航堆栈使用的代价地图恢复到特定区域外的静态地图来清除空间。
-
costmap_2d:(重点) 这个包提供了一个二维代价地图的实现,它从世界中获取传感器数据,建立数据的二维或三维占用网格(取决于是否使用基于体素的实现),并根据占用网格和用户指定的膨胀半径在二维成本地图中膨胀成本。这个软件包还提供了对基于map_server的成本图初始化、基于滚动窗口的成本图以及基于参数的传感器主题订阅和配置的支持。
-
dwa_local_planner(重点): 该软件包提供了动态窗口法在平面上进行局部机器人导航的实现。给定一个要遵循的全局计划和代价地图,局部规划器产生速度指令,并发送给移动基地。该软件包支持任何机器人,其足迹可以表示为凸多边形或圆锥体,并将其配置暴露为可在发射文件中设置的ROS参数。这个规划器的参数也是可动态重新配置的。这个包的ROS包装器遵守了nav_core包中指定的
BaseLocalPlanner接口。 -
fake_localization: fake_localization包提供了一个单一的节点,即fake_localization,它替代了定位系统,提供了amcl使用的ROS API的一个子集。这个节点在模拟过程中最常被使用,作为一种以计算成本低廉的方式提供完美定位的方法。具体来说,fake_localization将测距数据转换为amcl发布的姿势、粒子云和变换数据的形式。
-
global_planner(重点): 一个路径规划器库和节点。
-
map_server: map_server提供了"map_server" ROS节点,它将地图数据作为ROS服务提供。它还提供了"
map_saver"命令行工具,它允许将动态生成的地图保存到文件。 -
move_base(重点中的重点):

move_base包提供了一个动作的实现(见actionlib包),该动作在给定图上的一个目标后,将尝试用一个移动物体到达该目标。move_base节点将全局和局部规划器联系起来,以完成其全局导航任务。它支持任何遵守nav_core包中指定的
nav_core::BaseGlobalPlanner接口的全局规划器和任何遵守nav_core包中指定的nav_core::BaseLocalPlanner接口的本地规划器。move_base节点还维护着两个成本图,一个用于全局规划器,一个用于局部规划器(见costmap_2d包),用于完成导航任务。 -
move_slow_and_clear:
move_slow_and_clear::MoveSlowAndClear是一个简单的恢复行为,它清除costmap中的信息,然后限制机器人的速度。注意,这种恢复行为并不是真正安全的,机器人可能会撞到东西,它只是以用户指定的速度发生。另外,这种恢复行为只与允许通过dynamic_reconfigure设置最大速度的本地规划器兼容,如dwa_local_planner。 -
nav_core(重点): 这个包提供了用于导航特定机器人动作的通用接口。目前,这个包提供了BaseGlobalPlanner、BaseLocalPlanner和RecoveryBehavior接口,这些接口可以用来构建行动,这些行动可以很容易地将其规划器、本地控制器或恢复行为换成遵守相同接口的新版本。
-
navfn: navfn提供了一个快速插值的导航功能,可以用来为移动基地创建计划。该规划器假设一个圆形机器人,并在成本图上操作,以找到一个从网格中的起点到终点的最小成本计划。导航函数是用Dijkstra算法计算的,但在不久的将来也可能增加对A*启发式算法的支持。navfn还为navfn规划器提供了一个ROS包装器,它遵守nav_core中指定的nav_core::BaseGlobalPlanner接口。
-
navigation: 一个二维导航堆栈,从测距仪、传感器流和目标姿势中获取信息,并输出安全速度指令,发送到要移动的物体。
-
rotate_recovery: 这个软件包为导航堆栈提供了一个恢复行为,试图通过对机器人进行360度旋转来清理空间。但是对阿克曼运动控制的小车没有用。
-
voxel_grid: voxel_grid提供了一个高效的三维体素网格的实现。占用网格可以支持3种不同的单元状态的表示:标记、自由或未知。由于底层实现依赖于位操作和或整数操作,体素网格只支持每个体素列的16个不同层次。然而,这种限制产生的光线跟踪和单元标记性能可与标准的2D结构相媲美,使其与大多数3D结构相比相当快。
6-navigation_msgs-ros1
这个资源库包含的信息由Navigation在ROS Jade之前,这些消息是该库的一部分。
这个分支(ros1)是为ROS Kinetic及以上版本使用的。
- map_msgs: 这个包定义了映射包中常用的消息。
- move_base_msgs: 保存move_base包的动作描述和相关信息。
10-moveit-master
易于使用的开源机器人操作平台,用于开发商业应用、原型设计和基准算法。

-
moveit: 元包,包含了Moveit的所有基本包
-
moveit_commander: 基于终端的控制界面,使用类似Python的语法.
-
moveit_core(重点): MoveIt使用的核心库, 核心功能包括RobotModel、RobotState、collision checking。
- Robot Model/State: 表示机器人的规划模型。
- collision checking: 碰撞检查方法的插件API.
- 这个包还包含了很多其他功能模块,大家可以浏览上面的图,就不一一列举。涉及运动学的约束,规划器等的调用。吧。
-
moveit_experimental: moveit的一些实验包
-
moveit_kinematics(重点): 用于MoveIt中所有逆运动学求解器的软件包.
- kdl_kinematics_plugin: kdl运动学求解器。
- ikfast_kinematics_plugin: 一种基于解析算法的运动学插件,可以保证每次求解的一致性。
- cached_ik_kinematics_plugin: 缓存的IK运动学插件创建了一个持久的IK解决方案的缓存。这个缓存可以用来加快任何其他IK求解器的速度。对一个IK求解器的调用将使用缓存中的类似状态作为IK求解器的种子。如果不能返回一个解决方案,则会用用户指定的种子状态再次调用IK求解器。与缓存中的状态有足够差异的新的IK解决方案被添加到缓存中。缓存会定期被保存到磁盘。
- lma_kinematics_plugin: 使用KDL的Levenberg-Marquardt(LMA)求解器实现运动学。这个版本支持任何没有模拟关节的运动学链。
- srv_kinematics_plugin: 运动学的具体实现,使用ROS服务调用与外部IK求解器通信。这个版本可以用于任何机器人。支持非链式运动学组。
-
moveit_planners(重点): MoveIt中使用的运动规划库的接口
- chomp (Covariant Hamiltonian Optimization for Motion Planning 运动规划的协变哈密顿优化 ): 运动规划的共变哈密顿优化(CHOMP)是一种新型的基于梯度的轨迹优化程序,使许多日常运动规划问题变得简单和可训练(Ratliff等人,2009c)。虽然大多数高维运动规划器将轨迹生成分为不同的规划和优化阶段,但该算法利用优化阶段的协变梯度和函数梯度方法来设计一个完全基于轨迹优化的运动规划算法。给定一个不可行的天真轨迹,CHOMP对周围环境作出反应,迅速将轨迹拉出碰撞,同时优化动态量,如关节速度和加速度。它迅速收敛到一个平滑的无碰撞轨迹,可以在机器人上有效执行。整合到最新版本的MoveIt中的工作正在进行中。
- moveit_planners: 安装MoveIt的所有可用规划器的元数据包。
- ompl ( Open Motion Planning Library开放运动规划库 ) : OMPL是一个开源的运动规划库,主要实现了随机化的运动规划器。MoveIt直接与OMPL集成,并使用该库中的运动规划器作为其主要/默认的规划器集。OMPL中的规划器是抽象的;也就是说,OMPL没有机器人的概念。相反,MoveIt配置了OMPL,并为OMPL提供了处理机器人学问题的后端。MoveIt完全支持。
- pilz_industrial_motion_planner ( Pilz 工业运动规划器 ): Pilz工业运动规划器是一个确定性的圆形和线性运动发生器。此外,它还支持使用MoveIt功能将多个运动段混合在一起。
- pilz_industrial_motion_planner_testutils: 用于测试pilz工业运动生成的辅助脚本和功能
- sbpl ( Search-Based Planning Library 基于搜索的规划库 ): 一套通用的运动规划器,使用基于搜索的规划,将空间离散化。
- trajopt ( TrajOpt规划器 ) : TrajOpt是一种用于运动规划问题的顺序凸优化算法,其中非凸、非affine平等和非平等约束被放松、近似线性化和凸化,以创建一个目标函数。
-
moveit_plugins: 一个非常基本的控制器管理器插件。可以连接到
FollowJointTrajectoryAction和GripperCommandAction服务器。 -
moveit_ros(重点):
使用ROS的MoveIt组件
- benchmarks(重点): 增强了MoveIt中的基准工具。
- manipulation(重点): MoveIt中用于操作的组件.
- move_group: MoveIt的move_group节点.
- moveit_ros: 使用ROS的MoveIt组件,是该包的元数据包.
- moveit_servo(重点): 提供实时的操纵器笛卡尔和关节伺服功能.
- occupany_map_monitor(重点): MoveIt连接到占用地图的组件.
- perception(重点): MoveIt连接到感知的组件.
- planning(重点): 使用ROS的MoveIt的规划组件.
- planning_interface: 为计划和执行提供更简单界面的MoveIt组件.
- robot_interaction(重点) : MoveIt中通过互动标记提供互动的组件
- visualization(重点): MoveIt中提供可视化的组件.
- warehouse: MoveIt连接到MongoDB的组件.
-
moveit_runtime: moveit_runtime元包包含了MoveIt的包,这些包对于它的运行时间是必不可少的(例如,在机器人上运行MoveIt)。
-
moveit_setup_assistant: 生成一个配置包,使其易于使用MoveIt.
13-usb_cam-develop
用于V4L USB摄像机的ROS驱动程序
usb_cam_node使用libusb_cam与标准USB摄像头(例如罗技Quickcam)接口,并将图像作为sensor_msgs::Image发布。使用image_transport库以允许压缩的图像传输。
只有一个cpp文件,这就是重点代码了。
本文介绍了使用ROS-3DSLAM项目的开篇,涵盖了ROS的核心组件(如roscore, roslib, 通信机制等)、导航包(如AMCL, costmap_2d, move_base)和关键代码分析,包括moveit运动框架和USB摄像头驱动。通过项目目录和分工,读者将逐步深入ROS源码的学习。

938

被折叠的 条评论
为什么被折叠?



