架构
开发方式 :
1.节点的“编写自己的main函数”的风格 显式编写 main 函数创建节点,然后硬编码初始化逻辑
2.以 Component 形式编写节点。特别是需要动态启停组件、多组件进程共享、生命周期管理时
组件仅能编译为共享库,因此它没有主函数
Component 同样继承自 rclcpp::Node。与普通节点使用相同的基类,使得编写 Component 的代码与普通节点完全兼容。
通过类加载器(Class Loader) 和 组件容器(Component Container),Component 可被动态加载到同一进程
Component 的本质是一种模块化、可插拔的代码单元,既可独立运行为节点,也可动态加载到容器进程中,
这使得向现有代码添加常见概念(如生命周期:继承 rclcpp_lifecycle::LifecycleNode)变得更容易
ros2 launch 可用于通过专门的启动动作自动化
使得一个类成为组件,该类应该使用 rclcpp_components 包中的宏(RCLCPP_COMPONENTS_REGISTER_NODE)在代码中进行自我注册
《在单个进程中组合多个节点》
ROS 2 daemon是一个守护进程作用与 master 在 ROS 1 中的作用类似。
但是,与 ROS 1 不同,它不是必需的,而是一种优化。
ROS 2 节点可以在没有它的情况下运行,这与 ROS 1 节点在没有主节点的情况下无法运行不同。
对于想要启动、快速执行某些任务然后关闭的节点来说-- ROS 2 守护进程。
在后台有一个长期运行的程序,它保存了ROS网络中的信息。这样就可以更加快速的处理请求和提供快速响应
命令结构
ros1命令
roscore rosnode
rosrun roslaunch
rostopic rosmsg rosparam rosservice rosbag
启动主节点:roscore
查看节点状态:rosnode
运行可执行节点:rosrun
启用多个节点:roslaunch
管理话题:rostopic
管理服务:rosservice
查看信息类型:rosmsg
查看服务的类型:rossrv
录制/回放话题数据:rosbag
ros2对应
ros2
node
run launch
topic msg param service srv bag
ros2cli
component:与组件相关的各种子命令
daemon :与守护进程相关的各种子命令
doctor :检查ROS设置和其他潜在问题
security :与安全相关的各种子命令
lifecycle:与生命周期相关的各种子命令
action:与动作相关的各种子命令
interface:显示ROS接口信息
pkg:与包相关的各种子命令
multicast:与多播相关的各种子命令
主题、服务、操作或参数
包名为turtlesim,可执行文件名为turtlesim_node
主题 的发布者-订阅者模型
服务 基于呼叫和响应模型 只是服务类型有两个部分:一个用于请求的消息,另一个用于响应
参数 是节点的配置值 在运行时更改参数 ROS2参数是由键值对组成的
业务原因:
机器人的控制可以分为两种类型:开环控制和闭环控制
控制导航程序,控制机械臂运动,控制小乌龟旋转等
话题 适用于节点间单向的频繁的数据传输,topic
服务 则适用于节点间双向的数据传递,service
参数 则用于动态调整节点的设置 parameter
ROS2针对控制场景,基于原有的话题和服务,设计了动作(Action)这一通信方式
action 动作是ROS 2中的通信类型之一,用于长时间运行的任务。由三部分组成:目标、反馈和结果
动作就像服务一样,允许您执行长时间运行的任务,提供定期反馈,并且可以取消
Action适用于长时的,需要过程反馈的工作。
参数是由服务构建出来了,
而Action是由话题和服务共同构建出来的(一个Action = 三个服务+两个话题)
三个服务分别是:一个用于请求,一个用于响应,一个用于反馈
1.目标传递服务 2.结果传递服务 3.取消执行服务
两个话题:1.反馈话题(服务发布,客户端订阅)
2.状态话题(服务端发布,客户端订阅)
ROS 2 的一个独特通信模式是动作。操作是面向目标的异步通信接口,具有请求、响应、定期反馈和取消功能
.msg / .srv / .action 文件
ROS1 编译开发
Package.xml文件 :引入了package.xml来描述软件包的依赖关系,简化了包管理。
CMakeLists.txt :规范了构建脚本的书写方式,提高了可读性和易用性。
工作空间的概念 :引入了工作空间(Workspace)概念,允许开发者在一个地方编译和管理多个软件包
catkin_package
source /opt/ros/melodic/setup.bash
目录:
分别是 src 、 devel 、和 build 。
$ cd ~/catkin_ws #回到工作空间,catkin_make必须在工作空间下执行
$ catkin_make #开始编译
$ source ~/catkin_ws/devel/setup.bash #刷新坏境
一个 package 下必须包含 CMakeLists.txt 和 package.xml 两个文件
include 和 src 分别存放头文件(*.h)和源程序文件(*.c/*.cpp等);
scripts 存放脚本文件(比如Python文件 *.py,shell文件 *.sh);
launch 存放 launch文件(*.launch),用于批量运行多个可执行文件;
config 存放配置文件(*.yaml等);
build:编译空间
存放CMake和catkin的缓存信息、配置信息和其他中间文件。缓存和中间文件
devel:开发空间
存放编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等
catkin_make install 把install文件夹分享给其他人就可以
ROS2 编译开发
src:代码空间
install:安装空间
build:编译空间
log:日志空间
rosversion -d
`rosdistro`(ROS Distro)是发行版的简称,它是一系列ROS软件包、库和工具的集合,代表了ROS的一个特定版本
ROS_DISTRO
常用工具
rosdeps:检查工程代码的依赖
colcon:编译项目 colcon 是一个构建软件包集合的命令行工具,
是ros构建工具catkin_make、catkin_make_isolated、catkin_tools 和ament_tools的迭代版本,
rqt:以插件的形式实现各种GUI工
功能包
ros2 pkg list 列出所有功能包
ros2 pkg executables <package_name> 列出所指的功能包里的所有可执行文件
ros2 pkg xml <package_name> 列出所指的功能包里的清单描述文件manifest.xml文件
colcon build --packages-up-to example_action_rclcpp
source install/setup.bash
ros2 run example_action_rclcpp action_robot_01
ROS2 安全
DDS-Security定义了以下五个SPI:
● 身份验证(Authentication):对给定域参与者的身份进行验证。
● 访问控制(Access control):对经过身份验证的域参与者能够执行的DDS相关操作强制实行各种限制。
● 加密(Cryptographic):对所有必需的加密、签名和散列操作进行处理。
● 日志记录(Logging):提供审计DDS-Security相关事件的能力。
● 数据标记(Data tagging):提供向数据样本添加标记的能力
ROS 2的安全功能目前仅使用了前三个SPI
身份验证(Authentication)公钥基础设施PKI(Public Key Infrastructure)
访问控制插件 治理(Governance)文件:一个签名的XML文档 权限(Permissions)文件:一个签名的、包含域参与者各项权限的XML文
加密(Cryptographic
enclaves子文件夹内的某个目录中查找安全文件
由六个文件建立。其中三个文件定义了 enclave 的身份,而另外三个文件定义了授予 enclave 的权限
identity_ca.cert.pem permissions_ca.cert.pem
环境变量 “ROS_SECURITY_ENABLE” 充当 enclave 的 ROS 2 安全功能的主“开/关”开关
环境变量 “ROS_SECURITY_STRATEGY” 定义域参与者
SROS2 是 ROS 2 的安全扩展,基于 DDS(Data Distribution Service)的安全功能,
ros-rolling-sros2:SROS2 工具包,用于管理安全配置
生命周期 (Lifecycle, LC) 节点 ros2中加入了一种区别于普通的node节点的管理节点LifecycleNode,这种节点有点像是状态机,会在几种不同的状态中切换。
LifecycleNode 节点的状态主要分为基本状态(Primary States)和切换状态(Transition States
节点使用 rclcpp_lifecycle::LifecycleNode 而不是常用的 rclcpp::Node
ros2 lifecycle nodes - 列出所有 LC 节点
发现机制(Discovery)
ROS2的节点发现通过底层中间件自动完成,
相同ROS域名(ROS domain, 可以通过设置ROS_DOMAIN_ID环境变量来设置)
通信接口主题(topics)、服务(services)或动作(actions),使用一种简化的描述语言来描述这些接口,叫做接口定义语言(IDL)
ROS2底层框架
ROS 2 Client Library)层 client libraries
rclcpp = C++ 客户端程序库 ROS1的UDPROS(只在roscpp里面)
rclpy = Python 客户端程序库
ROS2 client Library <rcl :c implementation >ROS客户端程序库(RCL)
rcl(Common functionality for other ROS Client Libraries)模块
rmw(ROS MiddleWare)模块 rmw软件架构主要由两个核心文件夹构成:rmw和rmw_implementation
rmw (ros middleware interface): 相对底层的接⼝层,直接和DDS交互,C语⾔实现
它负责接收上层client libraries发出的请求,验证其有效性,并通过RMW层与底层中间件进行交互,最终将响应返回给上层client libraries。
默认的 rmw_fastrtps_cpp
其中的adapter ,可以通过这一抽象层,用户可以根据实际需求选择不同的DDS实现组件
插件机制
ROS 2 使用插件机制(基于 pluginlib)来加载不同的 rmw 实现。用户可以通过配置文件或环境变量(如 RMW_IMPLEMENTATION)选择具体的 DDS 实现。
基于eProsima的Fast RTPS库
DDS(Data Distribution Service,数据分发服务)
ros_to_dds组件,该组件主要为⽤⼾直接访问DDS层提供接⼝
参考
https://www.ncnynl.com/ros2docs/cn/humble/Tutorials.html
https://fishros.com/d2lros2/#/
https://github.com/ros2/ros2cli