ROS—杰哥教学

1、Package包与Node节点——包相当于购物袋,节点就是商品。

rospy和roscpp是对python和C++语言的支持;

std_msgs是String消息类型所在的软件包;

src文件夹是存放C++代码文件的,而scripts文件夹是存放py代码文件的;

2、node节点的运行

2a9135451c124a7297e0e65a0e891339.png

3、包与包之间的联系:话题与消息

e0de218e555e4b738cab2e4c38016801.jpeg

f96847f67c8a49f1b0a6d5ce45ff34f7.png

不同节点进入不同的话题进行消息发送(即进入不同的群,一个节点一个群,然后接收方需要哪个节点的消息就去订阅那个);7fbcda0880624c788b1cfca125e17112.png

补充:

f38d9e7b5055454cb3fe8eba40f5ddc8.png

4、C++编写Publisher发布者节点

注:话题名称不能使用中文名称;

102a13368f4f4a51ae82db4ba9ffc886.png

常用工具:

f79e3f650c654254b31dbb7249cb7ac4.png

5、C++编写Subscriber订阅者节点

d82d51a29ac949aab92989b3a91e4b6b.png

注:

1、Topic不属于话题发布者和订阅者,而是ROS系统创建管理的,相当于一个容器,发布者和订阅者都在其中;和上图点3对应。

2、ros::spinOnce是让订阅者往后瞟一眼,看后面来的消息包;

ef15059e975e411d936ee670e3f4ed85.png

5、使用launch文件一次启动多个节点

39ca1973a28642fe8bda144d03c3ba22.png

或者这样写:

d2379181321943b5b36154c3e2223915.png

fd2ae98e15654b5c9362b1a7b391ebef.png

注:

1、launch文件里有节点,那roscore指令会自动开启;

2、可根据陌生软件包launch文件中的文件名来发现陌生软件包的功能;

6、用C++实现机器人运动控制

365a3c9b0a6546b1bc654069ba7c21b4.png

4401884bff084f43a19f09ed3eb4252b.png

7、使用RViz观测传感器数据

负责发:Gazebo是一个开源的机器人模拟器,旨在为机器人开发者提供一个高效的工具,用于模拟物理环境和测试机器人的行为。它支持多种传感器和物理引擎,可以创建复杂的3D环境,以便进行仿真和验证。

负责收:RViz是一个用于可视化机器人状态和环境的开源工具,常与ROS一起使用。它允许用户在三维空间中查看传感器数据、机器人的位置、路径规划、地图等信息。通过RViz,开发者可以监测和调试机器人系统。

8、用C++实现获取激光雷达数据

169434cd56484e9098a709a8ed14b294.png

7e77673a762746148ce91f4e5305a73b.png

9、用C++实现激光雷达避障

发布者和订阅者缝合实验:即节点node既做发布者又做订阅者;

47e2512269844a10856e4f4ffe61a41d.png

3bfdf0a587004c608bab1c05e21fbe8f.png

10、IMU 惯性测量单元消息包

IMU是惯性测量单元(Inertial Measurement Unit)的缩写,它是一种用于测量和跟踪物体姿态(如方向、角度和速度)的传感器。

  • 提到的时间戳:

时间戳是指数据库、软件系统或文件记录中用来表示某一具体时刻的日期和时间的数据。

  • 其中IMU数据读取与解析:
  1. 数据格式:IMU在ROS中发布的数据通常遵循标准的sensor_msgs/Imu消息格式,该格式包含了加速度、角速度、方向四元数以及相关的协方差矩阵等信息。
  2. 数据读取:在ROS中,可以通过创建订阅节点来读取IMU发布的数据。订阅节点会监听IMU发布的话题(如/imu/data),并在接收到新数据时调用回调函数进行处理。
  3. 数据解析:回调函数会对接收到的IMU数据进行解析,提取出加速度、角速度等关键信息,并根据需要进行进一步的处理或转换(如将四元数转换为欧拉角)。

acdeaac9ffa64bfd81a8f55e4b29a72d.png

11、使用C++实现IMU数据获取

imu话题包:

0e6042d7957745a3bf3ec59ab34f806b.png

37f781953a344ffe8c56c3726d2ddb46.png

延伸:

在C++中,包含头文件时可以使用尖括号<>或双引号"",它们之间的区别主要在于编译器搜索头文件的路径不同。

<>: 当使用尖括号包含头文件时,编译器会在标准库路径和指定的系统路径中搜索头文件。

"": 当使用双引号包含头文件时,编译器首先会在当前文件所在的目录(即源文件的目录)中搜索头文件。如果未找到,编译器会继续在标准库路径和指定的系统路径中搜索。

12、用C++实现IMU航向锁定

5efceb42deba41c0a7f1eab8c0b8103a.png

13、消息包messages

e46eb6da22bf449c96969d6fe50e337f.png795abe30d8904951984e7bd796001ad6.png

14、ROS中生成自定义消息类型

1206b009acab446c9ae597a5b0c770d0.png

15、在ROS中使用自定义消息类型(C++节点)

27fea989c3f744b7962201daf86f6e6b.png

16、使用C++发布自定义地图

4469e58d6c154a97a5fcec52a538c3b1.png

17、年轻人的第一次SLAM建图:hector mapping

Hector Mapping是一种无需里程计数据的SLAM(Simultaneous Localization and Mapping,即同时定位与地图构建)方法,它主要利用激光雷达(LIDAR)来获得二维姿态估计。

42f4ad260b884f2f8858980fa8367c0d.png

009ebc0dd0dd4cfa9602f23ca80a6405.png

运行rosrun hector_mapping hector_mapping出现错误:(不过不影响后续操作)

【ERROR】 【1729134229.813782651, 376.079000000】: Transform failed during publishing of map_odom transform: Lookup would require extrapolation into the past. Requested time 375.578000000 but the earliest data is at time 375.605000000, when looking up transform from frame 【base_link】 to frame 【odom】;

18、通过.launch文件启动Hector_Mapping/Gmapping建图的建图功能

Hector:

ead2b999d2474d70a7d32ae0df022b79.png

gmapping:

6897ea66a4d7413e900017601e571874.png

两个建图方法的参数设置在ros index中查看:

hector:

0d9cfd3184fc4ccdb6662bc57c5b57a7.png

gmapping:

e08fb83066f849488f5452d1bf401d39.png

f8748840b36348a4b6b44b5d71180fc5.png

19、TF系统

TF(Transform)系统是一个用于处理不同坐标系之间变换关系的工具,它允许用户记录、查询和监听各种坐标系之间的变换关系。这些坐标系可能代表机器人的不同部分(如头部、手臂、底盘等)、不同的传感器位置或环境中的其他物体。TF系统通过发布和订阅消息的方式,在ROS网络中传递这些坐标系的变换信息。

0aa0364e7b9a49cc832a9ad946416310.png

20、里程计(odometry)

里程计记录的是机器人在某一时间段内的运动轨迹,即位姿变换过程。这种变换过程包含了机器人的位置(通常表示为x、y坐标)和姿态(通常表示为绕垂直轴的旋转角度θ,也称为航向角)。

6588d215db324ce38901c4ee062909cc.png

920cb35f30ed4b29ab14df9cac553b3a.png

  • Hector Mapping建图:不依赖于里程计数据,它主要通过激光雷达扫描的点云数据与已有地图进行匹配,从而估计机器人的位置和姿态。这使得Hector Mapping在不平坦或轮式里程计数据不准确的环境中更具优势。
  • Gmapping建图:依赖于里程计数据,利用粒子滤波器(Particle Filter)对机器人的运动和传感器测量进行融合,从而实时估计机器人的位置并构建地图。因此,在里程计数据准确的情况下,Gmapping能够构建出更精确的地图。

21、ROS的Navigation导航系统

e6371d73e0a840cda5d8c6dc67766e35.png

22、全局规划器

88397009dd184cae9ecde70d248501c9.png

Global_planner和Navfn功能一样,包含两种算法,不过前者是对后者的优化,A*算法没有bug;

7df153cd68a04002b4c671955c5043c9.png

第三种规划器,简单,可以作为自定义规划器,一般不用。

23、AMCL 定位算法(自适应的蒙特卡洛定位算法)

AMCL算法基于蒙特卡洛定位(MCL)算法,并对其进行了增强和自适应性的提升。它采用粒子滤波器来跟踪已知地图中机器人的位姿,对于大范围的局部定位问题具有良好的工作效果。AMCL算法通过结合里程计数据和传感器数据(如激光雷达数据),能够更准确地估计机器人在地图中的位置。

b97917c4c48645e084661769054ab0e8.png

24、代价地图 Costmap

代价(掉血区域):类似于沼泽,碰到就掉血;

5b14f3dbbb6147758205fde47282ca52.png

代价地图:即碰到可能就撞墙;

a4bcde5081ca4c94860c4ee160ecb030.png

d04a3da39535499eab50503f48c3e90e.png

全局代价地图和局部代价地图(实时避让),分别给全局规划器和局部规划器服务;

25、代价地图的参数设置

52c2bf25854c49bd9cfa0b70ab6b301f.png

  • 代码前两行分别是全局和局部代价地图的形状,为保证其一致,故放在一个.yaml文件中,后面的ns即命名空间name space的缩写,相当于在第一行加上其名字。
  • 代码后两行是其区分,计算范围和频率,故放在不同的.yaml文件中。

26、恢复行为 | Recovery Behaviors

564a3f321f49446987d8f8cd5649956e.png

906a974e060347d2a48eec5efdf37c68.png

动态障碍物的存在,需要恢复行为,比如门口放了一个方块,机器人走不了,后面方块移开了,但是方块在机器人后面,在激光雷达盲区,扫描不到,所以障碍物影子还存在即无法通过,此时需要进行恢复行为的流程,然后就可以导航。

dbf6b0b268344b86b82f6346d63925e6.png

其上述恢复行为流程可以自定义设置,例如

2d9c7f3fd21e4947b40c5b78821f8b51.png

地图的分层结构:

7dfae6a5a839441a9f2dd7f90b920e82.png

其中从下往上分别是:静态地图、障碍物地图、膨胀地图、有下面三层合并的代价地图。

29、局部规划器

af3a0c48353d4620967233d0a2530725.png

  • DWA规划器

全称为Dynamic Window Approach(动态窗口法)规划器,一种基于速度的局部路径规划方法。

DWA规划器的工作原理主要是在速度空间(v, ω)中进行采样,其中v代表线速度,ω代表角速度。它会在一定的速度范围内,按照一定的步长或分辨率,采样多组速度组合。然后,根据这些速度组合,模拟机器人在一定时间内的运动轨迹。接着,通过一个评价函数对这些轨迹进行打分,选取最优的轨迹对应的速度组合作为机器人的控制输入。

904dc4b561ae4c758de9e89df64769a1.png

  • TEB规划器

全称为Timed Elastic Band(时间弹性带)规划器,一种高效的局部路径规划算法,特别适用于动态环境中的实时导航。

TEB规划器的核心思想是将路径表示为一个弹性带(elastic band),这个带由一系列离散的位姿(位置和方向)组成。通过调整这些位姿的位置和时间参数,TEB规划器可以优化路径,使其满足各种约束条件,如路径长度、运行时间、障碍物避让、机器人动力学和运动学约束等。

de6feb71f89a4db6b05866f90ab0a68c.png

便捷调参:057ab70597714f7d908faee730defc76.png

点开move_base,进行调参。

30、Action 编程接口

5d39c44893014285b32d94288427423a.png

20a6e73455e1464f8e2dedbbe3ab54d4.png267302c7859b4336bc7b1616e1974e3f.png

5c91293a9b0b4841aecff811fd6f9481.png

31、ROS 坐标导航的 C++ 编程实现

52b075664b1c4faea36f99ee2749e3b8.png

ROS 航点导航插件:e20e004f7c7747dd8db0f76dde459f0d.png

32、ROS 航点导航插件的集成和启动

2dae31f7b3ea4f158365f840a4a11c8e.png

33、ROS 中的相机话题与C++实现

9e140370765a4b2b8c1cd0f366cca2fd.png

1f5af36c29454d96997288c513513ab5.pngfcdceb00b7a2475699f6f40a7a61c8a8.png

34、ROS 颜色目标识别与定位的 C++ 实现

d9a5480fc35c41d6a8ccd6f61ea828ed.png

0fc683a0e80c41fe8b2c1ea14389dc13.png

  • 颜色空间转换

ec2062d6ddcb46fd9d1918989262718f.png

H色调-S饱和度-V亮度

  • 二值化

da32830e76374c41889e4a714064ad81.png

7921f98c9ea341b69bd211b6703a6264.png

  • 计算质心坐标

17b9cfdf574842fe80e9d5f062937d6b.png

35、ROS 人脸检测的 C++ 实现

498364a525e44f069e5d1aa6e6ab0a54.png

级联分类器:引入static CascadeClassifier face_cascade;

更新中......

注意事项:

以上素材均来自于B站机器人工匠阿杰!!!

1、Ubuntu18.04对应的ros版本:Melodic

遇到问题与解决方法:

  • 没有WiFi适配器,没有无线连接:

2、ros index(官方市场)| | GitHub(自由市场)上克隆下代码,即安装软件包

在Github上寻找安装ROS软件包_哔哩哔哩_bilibili

3、两个市场index和GitHub网站打开速度太慢,需要+tizi或者使用对应镜像网站;
dbe01e8501f3468882c3cd06761e83d6.png

这里推荐一个Microsoft edge的扩展商店里的ilink加速器,更方便。

4、出现的一个RVIZ中map丢失的问题。

问题现象:无法正常显示rviz里面的各个参数,例如机器人模型和地图等;如下图:

f4a6402754c44600a0803884339642a6.png

问题原因:因为.launch文件中的map未能正确加载,如下图所示:

a616282012d1466dae4c3a1f344e85b4.png解决方法:将第一行代码中的args=改为args="$(find wpr_simulation)/maps/map.yaml"/,加载出地图即可。

5、酒店走廊、商场走廊,办公室走廊都是机器人常碰到的场景,这些长廊没有明显的特征,会造成机器人在长走廊上运动的时候,难以形成有效的全局匹配参考,从而很容易导致局部区域累计误差无法及时清除,出现建图和定位错误,影响机器人移动能力。针对这种情况,仅凭借雷达,恐怕难以形成有效的闭环,需要借助SLAM算法才能更好的达到效果。或者采用视觉定位算法。

6、小鱼一键安装(鱼香ros):

wget http://fishros.com/install -O fishros && . fishros

一行代码把ros基本使用的库都下载了,下载库之前可以查看一下计算机usr/include/中是否存在需下载的库文件;

robot简要知识点:

1、ros::spin():在ROS(机器人操作系统)中,ros::spin() 是一个非常重要的函数,它的作用是进入一个循环,不断地调用回调函数以处理接收到的消息和服务请求。这个函数通常用于节点(Node)的主函数中,以保持节点持续运行并响应来自其他节点的通信。

2、雷达的扫描点云是指通过雷达系统获取到的离散的三维空间数据点集合。以下是对雷达扫描点云获取的详细解释:雷达系统利用电磁波或激光等方式发射信号,并通过接收信号的回波来测量目标物体的距离、位置和形状等信息。当雷达系统扫描周围环境时,会发射信号并接收来自目标物体的回波信号。这些回波信号经过处理后,会形成一组离散的三维坐标点,即雷达点云。

3、WPR(Wheeled Perception Robot)通常指代一种轮式移动的机器人平台,具备环境感知能力。它可以使用各种传感器(如激光雷达、摄像头等)来感知其周围的环境,进行地图构建、导航和障碍物避让等任务。WPR通常用于研究、教育和实际应用中,以测试和开发机器人算法和应用。

WPB(Wheeled Perception Bot)是WPR的一个特定实现或框架,通常用于开发和模拟轮式移动机器人。WPB平台支持ROS,使开发者能够利用其丰富的库和工具进行机器人应用的开发、仿真和测试。WPB通常集成了导航、路径规划和传感器融合等功能。

WPR_Simulation是一个用于仿真WPR或WPB机器人的工具或包。它允许开发者在虚拟环境中测试机器人算法,而不必在实际硬件上运行。这种仿真环境通常与Gazebo或其他仿真软件结合使用,可以模拟机器人的移动、传感器数据以及环境互动,帮助开发者进行调试和优化。

wpb_home 通常指的是一个软件包或工作空间,专门用于支持和开发与 Wheeled Perception Bot (WPB) 相关的项目。wpb_home 是一个用于支持WPB机器人的工作空间,包含配置、仿真和导航等功能,旨在简化机器人开发和测试过程。

4、在CMake软件包中导入一个第三方函数库,基本操作为:先find_package,

7da2730bf3bb46338343325ec2958a9a.png

然后添加include头文件路径,

4517273bbbb74ab0a6918cf099702f00.png

在最后为节点程序添加编译规则时多加一条库文件列表

7c4d7ad26d0e42339bab350a46e44b10.png

5、API:API 是“应用程序编程接口”(Application Programming Interface)的缩写。它是一组定义了软件组件之间如何交互的规则和协议。API 允许不同的软件系统、应用程序或服务相互通信,简化了开发过程。例如节点node,发布者publisher,订阅者Subscriber

网站:

6、CMakeLists.txt 是 CMake 构建系统中用于定义项目构建配置的文件。CMake 是一个跨平台的构建工具,广泛用于管理软件构建过程。CMakeLists.txt 文件中包含了项目的源文件、依赖库、编译选项等信息,指示 CMake 如何构建项目。

8829f07d30fc46e5aed1ef063f8e3306.png

7、录包:rosbag record

1. rosbag record -o xxx.bag topic-name
2. rosbag record -O xxx.bag topic-name

这个命令后面的xxx就是指定文件存储位置和文件名称的,不同之处在于小写的-o(第一行)是会自动的在你的文件名称后加上当前的时间戳如:xxx_2020-06-22-21-00.bag。而-O(第二行)则不会加这个时间戳,直接为:xxx.bag。注意现在生成的bag包都在你只定的文件目录下哦。

好了,有了这个就可以开始编写一个脚本文件来代替每次在终端输入那么长的一串命令的,毕竟实验不是一次就能成功的。所以我们选择用小写的-o来记录,毕竟每次文件名不同不会覆盖之前的,防止突然发现以前的很有用而被替换的尴尬场景。

在roslaunch里面写下如下语句就可以实现用launch实现录制了,并且每次录制结果不会覆盖:

<launch>
	<node pkg="rosbag" type="record" name="bag_record" args="topic-name1 topic-name1 -o xxxx“/>
                                                                                                               
</launch>

注意,这里的xxx和上面的xxx都是包含路径和文件名称的,比如/home/xx/rosbag-name
(原文链接:https://blog.csdn.net/The_Dream_Runner/article/details/106922495)

8、CMakeLists.txt 文件是 CMake 构建系统的配置文件,用于管理和自动化软件项目的构建过程。通俗地说,它就像一个项目的“说明书”,里面详细描述了如何编译和链接项目中的代码。

CMake的工作流程

  1. 编写CMakeLists.txt文件,指定项目的构建规则和依赖。
  2. 在项目根目录中运行cmake .或者cmake <path-to-source>,生成Makefile或其他构建系统文件。
  3. 使用生成的构建系统文件(例如make命令)来编译和构建项目。

主要内容:

  1. 项目名称和版本

    • 你可以在文件中指定项目的名称和版本号。
  2. 源文件和头文件

    • 列出项目中所有的源代码文件和头文件,CMake 会根据这些文件来构建项目。
  3. 编译选项

    • 指定编译器的选项,比如调试信息、优化级别等。
  4. 依赖库

    • 如果你的项目依赖于其他库(比如第三方库),你可以在这里指定它们,以便在构建时正确链接。
  5. 目标和可执行文件

    • 定义要生成的可执行文件或库,以及它们的构建规则。

例如:

cmake_minimum_required(VERSION 3.10)  # 最小 CMake 版本要求
project(MyProject VERSION 1.0)        # 项目名称和版本

set(CMAKE_CXX_STANDARD 11)             # 设置 C++ 标准

# 指定源文件
add_executable(MyExecutable main.cpp)  # 生成可执行文件


9、source devel/setup.bash 是一个常用的命令,用于设置工作空间的环境变量,使你能够访问和使用该工作空间中的包和节点。

  • 更新环境变量:让 shell 知道新构建的包的位置,以便可以直接调用。
  • 加载 ROS 功能:使 ROS 工具(如 roscorerosrunroslaunch 等)能够正确工作。
  • 访问工作空间中的节点:可以直接运行工作空间中编写的节点和工具,而无需指定完整路径。

10、sudo make install:

make:是一个自动化构建工具,读取 Makefile 文件并根据其中的指令来编译源代码、链接程序,最终生成可执行文件或库。make 主要用于从源代码编译和构建软件

make install:是 make 工具中的一个常见目标,用来将编译后的文件复制到系统的标准安装路径(比如 /usr/local/bin,/usr/local/lib 等)。这意味着,make install 会把程序或库文件安装到系统中,供其他程序或用户使用。

sudo:是 "superuser do" 的缩写,用来以超级用户权限执行命令。在安装程序时,由于需要写入系统的特定目录(如 /usr/local/bin 或 /usr/bin),通常需要超级用户权限。因此,需要使用 sudo 来执行 make install,以便具有足够的权限来进行系统级别的修改。

11、并行编译

  • make -j:启动并行编译,默认尽可能多的作业。
  • make -jN:指定并行编译的最大作业数 N,通常通过指定一个与 CPU 核心数相匹配的数字来加速编译。
  • nproc:查看乌班图有多少线程。

12、rqt(ROS QT) 是 ROS(Robot Operating System)中的一个图形用户界面工具,它提供了一个基于 Qt 的框架,用于可视化和调试机器人系统。rqt 本身并不是单一的应用,而是一个插件化的工具,可以加载各种插件来执行不同的功能。通过 rqt,用户可以实时查看 ROS 系统中的各种信息,例如话题(topics)、服务(services)、参数(parameters)等,或者进行图形化调试和配置。

  • rqt_topic:查看 ROS 话题的订阅与发布。
  • rqt_param:显示和修改 ROS 参数。
  • rqt_plot:绘制实时图形,比如显示传感器数据。
  • rqt_image_view:显示图像流。
  • rqt_console:查看 ROS 日志信息,帮助调试。
  • rqt_logger_level:调整 ROS 日志级别。
  • rqt_robot_monitor:监控机器人各个组件的状态。
  • rqt_bag:播放和查看 ROS bag 文件。
  • rqt_publisher:发布消息到 ROS 话题,适用于测试。

启动 rqt 并加载插件

1、启动 roscore

roscore

2、启动 rqt

rqt

3、在 rqt 中加载插件。例如,如果你想查看当前系统中的话题数据,可以通过以下步骤操作:

  • 在菜单栏中选择 Plugins > Topics > Topic Monitor
  • 选择你感兴趣的 ROS 话题并查看实时数据。

13、.sh文件通常是Shell脚本文件,用于自动化一些命令行操作,例如设置环境变量、编译代码、启动节点或运行ROS工作空间。

类似于:

echo "Building ROS nodes"

cd Examples/ROS/ORB_SLAM2
mkdir build
cd build
cmake .. -DROS_BUILD_TYPE=Release
make -j
 

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐