🥬Cpp或Python(ROS2)有限状态机-行为树数学模型及虚拟力场本地导航算法避障
Last updated
Last updated
C++解释ROS2细节:节点初始化、自定义和接口连接代码片段
回调示例:订阅回调,定时器,服务包括参数调用,接收客户端响应
执行器示例:创建一个具有两个节点应用,一个节点启动一个计时器,并每秒两次询问第二个节点是否正在使用服务,一个节点将仅托管在线服务;
接口:数据分发服务,单个服务器和客户端示例:A.对所传送的数据进行自查,并用 CLI 工具可视化交换的消息。B.在发布者和订阅者间,插入节点侦听主题
ROS2实体任务组织:几种有限状态机转换(C++和Python工具);行为树的机器人和人工智能应用示例,适用于ROS2 的行为树(C++和Python库);行为建模为分层状态机(Python工具);拓展行为树模型(Python工具);任务规划(C++工具)
ROS2 控制器:机器人关节闭环控制模拟(Python无延迟比例控制示例)。
测试ROS2代码:C++和Python测试框架,基于测试的模拟器;示例代码:工业界机器人Gazebo模拟器。
ROS2 参数管理:ROS2参数第三方(C++或Python)编辑YAML工具,C++示例代码:驻留ROS2中参数守护服务器。
ROS2 消息记录:C++示例代码:ROS2 主题发布器,使用命令行在运行时修改节点记录器的日志级别,以不同的日志记录级别将消息打印到屏幕上。
使用C++,XML
编辑ROS2节点,使其能够发布和订阅信息,在Gazebo中使用虚拟机器人模拟节点,使用RViz2观察感官和几何信息。
C++和Python分别实现有限状态机数学计算模型避免障碍物:定义消息格式,激光扫描获取几何位置数据并转换,计算发布和订阅主题之间关系图数据,代码片段解释,执行代码后,打开终端运行模拟器观察机器人如何避障。制作CMake编译清单。
C++节点变换计算:ROS2 几何变换子系统,在RViz中查看虚拟机器人几何变换子系统;对ROS2节点发布几何变换广播;使用基于速度的驱动模型,虚拟机器人激光检测到障碍物后几何变换;制作RViz中可视化节点的3D视觉元素;分析“障碍物检测器节点”,“障碍物监测节点”从几个变换子系统提取检测对象几何变换,执行“障碍物检测器节点”,“障碍物监测节点”,在固定模拟框中发布“障碍物检测器节点”,“障碍物监测节点”。ROS 2 中使用动作捕捉系统
C++算法和节点实现:使用虚拟力场本地导航算法,使用二维矢量:“吸引力矢量”,“排斥向量”和“结果矢量”,避开障碍物;查看基于摄像头信息的反应性跟踪行为,在Gazebo中模拟观察;使用生命期节点并创建自定义信息。
C++实现:代码编辑行为树数学模式,执行行为树控制子系统(感应信息和发送速度);行为树控制Nav2导航子系统和主动视觉子系统:Gazebo 模拟机器人房屋巡视。
ROS1 对比 ROS2
ROS1有自己的中间件,它使用网络堆栈将信息从节点发送到正确的套接字,中间件再次接收该信息以将信息发送到正确的节点(过于简化)。 ROS2放弃了中间件,现在使用数据分发服务(DDS),这是一种第三方中间件,是可靠的行业标准。
Rosmaster 是一项促进两个节点相互查找的服务(如果它们希望通信)。 接下来,它们直接相互连接。 如果在此过程中rosmaster死亡,这些节点仍然会保持连接,但没有新的节点可以加入通信网络。在ROS1中,每个节点都需要知道master的位置(即使系统运行在多台机器上)。 ROS2取消了rosmaster,节点可以直接找到对方。
ROS支持C++和Python两种语言,底层实现也有所不同。 例如,在 Python 中每个订阅者都有自己的线程,但在 C++ 中则没有。 这对于 ROS1 来说是正确的,但 ROS2 具有相同的共享 C 实现。 通用代码库通过 C++ 和 Python 语言的 ROS 客户端库 API 公开。
ROS1不允许一个进程中有多个ROS节点,而 ROS2 中改变了。
在 ROS1 中更改 python 文件不需要您构建项目,ROS2 需要您再次构建项目。
Action Services 不是核心 ROS1 库的一部分(而是 actionlib),而 ROS2核心库有动作服务器。
Windows支持ROS2,但是建议使用 Linux。
ROS1 主要使用基于 XML 的启动文件。 ROS2有一个支持排序约束的python启动系统。
应用案例:创建发布者和订阅者
创建名为“ros2_ws”的工作区:
编译工作区:
ROS1使用catkin,但ROS2使用colcon构建包
此时,您将在终端中看到“0 个包已完成”(因为还没有包)。此外,您现在将在 ros2_ws.txt 文件中拥有构建、安装和日志文件夹。
创建一个新的发布者包(Python实现)
同样,我们也可以制作一个cpp包。请查看ROS2官方指南。
输出结果:
我们现在有一个空包。
导航到代码目录(我们将在其中放置节点文件):
注意:该目录与包同名
制作 talker 节点
使用VSCode编辑代码:
rclpy 有 API 可以在 ROS 中使用底层 C 代码库,如上述所示。rclpy 有 API 和类来抽象我们在 ROS1 中自己做的很多东西。 Node 类抽象节点初始化,创建发布者、订阅者、服务、客户端。在这里,我们继承了 Node 的所有方法和属性。
我们不自己初始化节点
我们使用 Node 中的“create_publisher”方法(第 11 行)来创建发布者
我们使用 Node 中的 create_timer 方法(第 13 行)来使用其计时器并设置回调方法。我们在ROS1中使用rate来做类似的事情
我们只需spin节点,我们的计时器就会根据设置的周期进行回调
注意:rclpy.spin 被阻塞
添加依赖项:
返回找到 package.xml 并添加以下行
我们的包依赖于 rclpy 和 std_msgs。