ROS2
ROS2
第一章ROS2介绍
暂无
第二章准备环境与安装ROS2
暂无
第三章动手学ROS2基础
工作空间
工作空间是一个存放项目开发类相关文件的文件夹,是开发过程的大本营
src 代码空间 Install 安装空间 build 编译空间 Log 日志空间
创建工作空间: mkdir -p ~/dev-ws/src
节点:机器人的工作细胞
执行具体任务的进程 独立运行的可执行文件 可使用不同的编程语言 可分布式运行在不同主机 通过节点名称进行管理 节点操作 ros2 node list //当前正在运行的节点信息 ros2 node info //查看该节点信息 ros2 topic //话题 ros2 bag //录制
ros2基本使用
1.Terminal ctrl+alt+t 2.当前终端所在位置 pwd 3.当前路径下所在的文件或文件夹 Ls 4.隐藏文件 ls-A 5.创建文件 Mkdir + 文件名 6.进入路径 Cd 7.创建文件 Touch 8.删除文件 Rm 9.退回上一级目录 cd… 10.递归删除(删除文件夹) rm-R 11.安装功能包 Sudo apt install//提升使用当前用户权限为管理员权限//应用//安装
ros2功能包的相关使用
1.创建功能包
2.列出可执行文件 ros2 pkg executables 列出某个功能包 ros2 pkg executables
3.列出所有功能包 ros2 pkg list
ros2 pkg list | grep vill//过滤 列出vill开头的功能包
4.列出某个包所在的路径前缀
列出包的清单描述文件 每一个功能包都有一个标配的manifest.xml文件,用于记录这个包的名字,构建工具,编译信息,拥有者,干啥用的信息 通过这个信息,就可以自动为该功能包安装依赖,构建时确立编译顺序 ros2 pkg xml
自动安装依赖:
编译工作空间: Colon build //在工作空间的根目录下进行编译 设置环境变量:
安装获取
Sudo apt install ros-
ros2构建工具colcon
作用:功能包构建工具 编译代码 1.安装colcon Sudo apt -get install python3-colcon-common-extensions 2.编译工程 Colcon build 3.运行一个自己编的节点 (1)打开一个终端使用cd colcon_test进入我们刚刚创建的工作空间,先source一下资源 source install/setup.bash (2)运行一个订杂志节点,你将看不到任何打印功能,因为没有发布者 ros2 run examples_rclcpp_minimal_subscriber subscriber_member_function (3)打开一个新的终端,先source,再运行一个发行杂志节点 source install/setup.bash ros2 run examples_rclcpp_minimal_publisher publisher_member_function
colcon常用指令 1.只编译一个包 colcon test –packages-select YOUR_PKG_NAME 2.不编译测试单元 colcon test –packages-select YOUR_PKG_NAME –cmake-args -DBUILD_TESTING=8 3.运行编译的包的测试 colcon test 4.允许通过更改src下的部分文件来改变install(重要) colcon build –symlink-install
第四章ROS2通信机制-话题与服务
ROS2话题介绍
1.话题的发布订阅模型(Topic通信模型)
发布 订阅
Node1——–>话题———->Node2
2.话题通信有哪些需要注意的规则
规则: 话题名字是关键,发布订阅接口类型要相同,发布的是字符串,接受也要用字符串来接收 同一个节点可以订阅多个话题,同时也可以发布多个话题,就像是一本书的作者也可以是另外一本书的读者 同一个话题可以有多个发布者 可以1对n,n对1,n对n
3.相关工具
3.1 RQT工具之rqt_graph
ROS2作为一个强大的工具,在运行过程中,我们是通过命令来看到节点和节点之间的数据关系的 运行第二章你说我听小demo。依次打开三个终端,分别输入下面三个命令 ros2 run demo_nodes_py listener ros2 run demo_nodes_cpp talker rqt_graph
3.2 ROS2话题相关命令行界面(CLI)工具
ros2 topic -h
3.2.1 ros2 topic list返回系统中当前活动的所有主题的列表
ros2 topic list
3.2.2 ros2 topic list -t 增加消息类型
3.2.3 ros2 topic echo 打印实时话题内容
ros2 topic echo /chatter
3.2.4 ros2 topic info 查看主题信息
ros2 topic info /chatter
3.2.5 ros2 interface show 查看消息类型
ros2 interface show std_msgs/msg/String 3.2.6 ros2 topic pub arg手动发布命令 ros2 topic pub /chatter std_msgs/msg/String ‘data: “123”’ 编写话题发布者:见实战案例 编写话题订阅者:见实战案例
4.接口介绍与自定义接口
4.1ROS2通信接口介绍
接口:interface
1.什么是接口
接口其实是一种规范 字符串:std_msgs/msg/String 32位二进制的整型数据:std_msgs/msg/String
使用接口的好处 不同语言对字符串的定义是不同的,接口可以抹平这种语言差异 方便程序的适配
2.ROS2接口介绍
使用ros2 interface package sensor_msgs 命令可以查看某一个接口包下所有的接口 比如传感器类的消息包:sensor_msgs
3.ROS2自定义接口
ROS2的四种通信方式 话题-Topics 服务-Services 动作-Actions 参数-Parameters 除了参数之外,话题,服务和动作(Action)都支持自定义接口,每一种通信方式所适用的场景各不相同,所定义的接口也被分为话题接口,服务接口,动作接口三种
话题接口格式:xxx.msg int64 num//发布的话题组合
服务接口格式:xxx.srv int64 a int64 b//请求
int64 sum//发布
动作接口格式:xxx.action int32 order//目标
int32[] sequence//反馈
int32[] partial_sequence//结果
转换过程 msg,srv,action ———> ROS2-IDL转换器 —————-> python的py,C++的.h头文件
4.ROS2接口常用CLI命令
4.1查看接口列表 ros2 interface list 4.2查看所有接口包 ros2 interface packages 4.3查看某一个包下的所有接口 ros2 interface package std_msgs 4.4查看某一个接口详细的内容 ros2 interface show std_msgs/msg/String 4.5输出某一个接口的所有属性 ros2 interface proto sensor_msgs/msg/Image
4.2 ROS2自定义话题接口
话题是一种单向通信的接口,同一个话题只能由发布者将数据传递给订阅者,所以定义话题接口也只需要定义发布者所要发布的类型即可.在实际的工程中为了减少功能包之间的互相依赖,通常会将接口定义在一个独立的功能包中 有了功能包之后,我们就可以新建话题接口了,新建方法如下: 新建msg文件夹,并在文件夹下新建xxx.msg(大写字母开头) 在xxx.msg下编写消息内容并保存 在CmakeList.txt添加依赖和msg文件目录 在package.xml中添加xxx.msg所需要的依赖 编译功能包即可生成python与C++头文件
2.1新建功能空间
ros2 pkg create village_interfaces –build-type ament_cmake
2.2新建msg文件夹和Novel.msg(小说类型)
cd village_interface mkdir msg touch Novel.msg
2.3编写Novel.msg内容
我们的目的是给李四的小说的每一章增加一张图片,原来李四写小说是对外发布一个 std_msgs/msg/String字符串类型的数据.而发布图片的格式,我们需要采用ros自带的传感器消息接口中的图片 sensor_msgs/msg/Image 数据类型,所以我们新的消息文件的内容就是将两者合并,在ROS2中可以写做这样:
方法一 在msg文件中可以使用#号添加注释
#标准消息接口std_msgs下的String类型 std_msgs/String content #图像消息,调用sensor_msgs下的Image类型 sensor_msgs/Image image
方法二 #直接使用ROS2原始的数据类型 String content #图像消息,调用sensor_msgs下的Image类型 sensor_msgs/Image image
说明 通过下面的指令查看std_msgs/String是由基础数据类型string组成的 ros2 interface show std_msgs/msg/String
ROS2中的原始数据类型 bool byte字节类型 char字符类型 float32,float64 int8,uint16 int32,uint32 int64,uint64 string
2.4修改CMakeList.txt
完成代码编写还不够,我们还需要在CmakeLists.txt中告诉编译器,你要给我把Novel.msg转换成python库和C++库
#添加对sensor_msg的 find_package(sensor_msgs REQUIRED) find_package(rosidl_default_generators REQUIRED) #添加消息文件和依赖 rosidl_generate_interfaces(&{PROJECT_NAME} “msg/Novel.msg” DEPENDENCIES sensor_msgs )
find_package用于查找rosidl_default_generators位置,下面rosidl_generate_interfaces就是声明msg文件所属的工程名字,文件位置以及依赖的DEPENDENCIES 踩坑报告:重点强调一下依赖部分DEPENDENCIES ,我们消息中用到的依赖这里必须写上,即使不写编译器也不会报错,知道运行的时候才会报错
4.4ROS2服务介绍(序号乱了不知道为什么就这样没有改)
服务通信介绍与体验 1.启动服务端 这个命令用于运行一个服务节点,这个服务的功能是将两个数字相加,给定a,b两个数返回sum就是ab之和 ros2 run examples_rclpy_minimal_service service 2.使用命令查看列表 ros2 service list 3.3手动调用服务 再启动一个终端,输入下面的命令 ros2 service call /add_two_ints example_interfaces/srv/AddTwoInts “{a: 5,b: 10}”
服务相关CLI工具 1.查看服务列表 ros2 service list 2.手动调用服务 ros2 service call /add_two_ints example_interfaces/srv/AddTwoInts “{a: 1,b: 5}” 3.查看服务接口类型 ros2 service type /add_two_inits 4.查找使用某一接口的服务 ros2 service find example_interfaces/srv/AddTwoInts
4.5自定义服务接口
话题是发布订阅模型,主要是单向传输数据,只能由发布者发布,接收者接收(同一话题,发布者接收者都可以有多个) 服务是客户服务端(请求响应)模型 由客户端发送请求,服务端处理请求,然后返回处理结果(同一服务,客户端可以有多个,服务端只能有一个)
如何创建自己的服务接口 新建srv文件夹,并在文件夹下新建xxx.srv 在xxx.srv下编写服务接口内容并保存 在CmakeLists.txt添加依赖和srv文件目录 在package.xml中添加xxx.srv所需依赖 编译功能包即可生成python与C++头文件
4.5.2python服务通信实现(李三借钱) 服务端: 1.导入服务接口 2.创建服务端回调函数 3.声明并创建服务端 4.编写回调函数逻辑处理请求
4.6.3创建客户端李三节点 1.导入服务接口 2.创建请求结果接收回调函数 3.声明并 创建客户端 4.编写结果接收逻辑 5.调用客户端发送请求
4.6话题服务对比
1.话题 1.话题是单向的,而且不需要等待服务端上线,直接发就行,数据的实时性比较高 频率高,实时性强的传感器数据的传递一般使用话题实现
2.服务 服务是双向的,客户端发送请求后,服务端有 响应,可以得知服务端的处理结果 频率较低,强调服务特性和反馈的场景一般使用服务实现
Git 安装git Sudo apt install git //下载别人的代码 Git clone 地址
第五章
2.参数是节点的一个配置,你可以任务参数是一个节点的设置 3.论参数组成成分 参数是由键值对组成,键值对指的就是名字和数值.
1.ros2查看节点有哪些参数(设置)
ros2 param list
2.详细查看一个参数的信息
ros2 param describe <node_name> <param_name>
3.查看参数值
例子: ros2 param get /turtlesim background_b
4.设置参数
例子: ros2 param set /turtlesim background_b 83
5.保存参数值
ros2 param dump /turtlesim
6.启动节点时加载参数快照
ros2 run <package_name> <executable_name> –ros-args –param-file <file_name>
ros2相关代码
函数名称 描述 declare_parameter 声明和初始化一个参数 declare_parameters 声明和初始化一堆参数 get_parameter 通过参数名字获取一个参数 get_parameter 通过多个参数名字获取多个参数 set_parameters 设置一组参数的值
编写CPP参数
声明参数
获取并设置参数
Action通信介绍
话题适用于节点间单向的频繁的数据传输, 服务则适用于节点间双向的数据传输, 而参数则适用于动态调整节点的设置
Action的组成部分
目标:Action客户端告诉服务端要做什么,服务端针对该目标要有响应,解决了不能确认服务端接收并处理目标的问题 反馈:Action服务端告诉客户端此时做的进度如何(类似工作汇报).解决了执行过程中没有反馈问题 结果:Action服务端最终告诉客户端执行结果,结果最后返回,用于表示任务最终执行情况
参数是由服务构建出来了,而Action是由话题和服务共同构建出来的(一个Action = 三个服务+两个话题)
三个服务分别是: 1.目标传递服务 2.结果传递服务 3.取消执行服务
两个话题: 1.反馈话题(服务发布,客户端订阅) 2.状态话题(服务端发布,客户端订阅)
Action的CLI工具
action list 获取目前系统中的action列表
action info 查看action信息
action send_goal 发送请求到服务端
ros2通信机制的总结
1.话题 话题是单向的而且不需要等待服务器上线,直接发就行,数据的实时性比较高. 频率高,实时性强的传感器数据的传递一般使用话题实现
2.服务 服务是双向的,客户端发送请求后,服务端有响应,可以得知服务端的处理结果,频率较低,强调服务特性和反馈的场景一般使用服务实现
3.参数 参数是节点的设置,用于配置节点,原理基于服务
4.动作 动作适用于实时反馈的场景,原理基于服务
第六章-ROS2工具介绍
1.launch
1.ros2节点管理之launch文件
为什么需要launch文件 1.1需要启动的节点太多 1.2节点之间有依赖关系 launch文件类似于一个脚本文件来管理节点的启动 launch文件允许我们同时启动和配置多个包含ros2节点的可执行文件
2.编写ros2的launch文件
ros2中可以使用python文件来编写launch文件 1.导入头文件 2.定义函数 3.创建节点函数 4.launch文件描述
3.测试launch文件
ros2 launch 节点(启动launch文件)
python略
cmake编译类型功能包的launch文件安装 install(DIRECTORY launch DESTIMATION share/${PROJECT_NAME} )
4.通过launch修改参数
例子: parameters=[{“writer_timer_period” : 1}]
2.rosbag2
rosbag2介绍与安装
CLI工具:命令行接口工具 ros2中常用的一个CLI工具–rosbag2,这个工具用于记录话题的数据 (我们做一个真实机器人的时候非常有用,比如我们可以录制一段机器人发生问题的话题数据,录制完成后可以多次发布出来进行测试和实验,也可以将话题数据分享给别人用于验证算法)
常用指令
1.记录一个话题 ros2 bag record /sexy_girl
2.记录多个话题的数据 ros2 bag record topic-name1 topic-name2
3.记录所有话题 ros2 bag record -a
4.其他选项 -o name 自定义输出文件的名字 ros2 bag record -o fille-name topic-name -s存储格式 目前仅支持sqlite3,其他还带扩展
查看录制出话题的信息 (比如话题记录的时间,大小,类型,数量) ros2 bag info bag-file
播放话题数据 ros2 bag play xxx.db3
3.RQT工具
RQT是一个GUI框架,通过插件的方式实现了各种各样的界面工具
命令行: rqt
4.数据可视化工具RVIZ2
数据:各种调试机器人时常用的数据,比如:图像数据,三维点云数据,地图数据,TF数据,机器人模型数据 可视化:可视化就是让你直观的看到数据,比如说一个三维的点(100,100,100),通过RVIZ可以将其显示在空间中
注意:RVIZ强调将数据可视化出来,是已有数据的情况下,把数据显示出来而已,而后面讲的gazebo仿真软件是通过真实环境产生数据,两者用途并不一样
Gazebo集成ROS2 Gazebo是一个独立的应用程序,可以独立于ros2或ros使用 Gazebo与ros版本的集成通过一组叫做gazebo_ros_pkgs的包完成的,gazebo_ros_pkgs将Gazebo和ROS2连接起来
gazebo_dev:开发Gazebo插件可以用的API gazebo_msgs:定义的ROS2和Gazebo之间的接口(Topic/Service/Action) gazebo_ros:提供方便的C++类和函数,可供其他插件使用,例如转换和测试使用程序.他还提供一些通常有用的插件 gazebo_plugins:一系列Gazebo插件,将传感器和其他功能暴露给ROS2
gazebo_ros_camera 发布ROS2图像 gazebo_ros_diff_drive 通过ROS2控制和获取两轮驱动机器人的接口
5.ros2命令行工具总结
第七章
1.miniconda
退出conda conda deactivate
2.jupyter安装
pip3 install jupyter -i https://pypi.tuna.tsinghua.edu.cn/simple
激活ros_venv环境 source ros_venv/bin/activate
然后在这里面: 启动jupyter jupyter-notebook
3.Numpy
Numpy是一个功能强大的python库,主要用于对多维数组执行计算。
使用numpy定义矩阵
1.创建单位矩阵 np.identity(3)
2.创建零矩阵 np.zeros([3,3])
3.创建随机矩阵 np.random.rand(3,5)
4.从已有的数组创建矩阵 np.asarray([1,2,3,4]).reshape(2,2)
5.判断两个矩阵是否相等 numpy的allclose方法,比较两个array是不是每一个元素都相等,默认在1e-05的误差范围内
numpy进行矩阵运算
矩阵加法/减法 加法使用np.add 减法使用np.subtract
矩阵乘法 np.dot
矩阵求逆 np.linalg.inv
矩阵转置 矩阵转置在矩阵后使用.T即可
4.空间位置姿态
描述三维空间中的姿态——旋转矩阵 旋转矩阵与位置矢量概念——略
1.平移矩阵—-略
2.旋转矩阵—-坐标变换 image.png
3.平移旋转复合矩阵 拆分 例如:可以将坐标变换拆分成先绕参考坐标系旋转,再绕参考坐标系平移,这样就得到了复合变换方程
左右手坐标系的区别
5.使用numpy表示位置和姿态
3*3单位矩阵表示没有姿态变换(注意不是零矩阵)
常见问题即解决方案
死锁
1.检查进程状态 如果进程存在且正常运行,等待它完成(尤其是系统更新时) 如果进程无响应或已结束但仍占用锁继续下一步
2.终止占用锁的进程(谨慎操作) 强制终止进程:
sudo kill -9 4800 使用-9强制终止卡死进程 注意:确保没有关键系统进程被误杀
3.检查并删除锁文件 查找并删除软件包管理锁文件: sudo rm/var/lib/dpkg/lock sudo rm/var/lib/apt/lists/lock sudo rm/var/cache/apt/archives//lock 删除前建议检查是否有进程占用锁
4.修复软件包管理状态 //修复中断的dpkg操作 Sudo dpkg –configure -a //修复依赖关系 sudo apt-get install -f //清理并更新缓存 sudo apt-get clean sudo apt-get update
5.重新运行原命令 附加说明 预防措施:避免同时运行多个包管理命令 系统日志:若问题反复出现,检查日志 //实时查看dpkg日志 Tail -f/var/log/dpkg.log
linux大小写敏感
全屏虚拟机
Ctrl + alt + enter
vscode切分终端
Ctrl + shift + 5
综合案例
1.手撸一个节点
python版
1.创建工作空间 mkdir -p town_ws/src cd town_ws/src code ./ 当前目录下打开vscode 2.创建功能包 创建一个名字叫village_li pythpn版本的功能包 ros2 pkg create village_li –build-type ament_python –dependencies rclpy pkg create 是创建包的意思 –build-type 用来指定该包的编译类型, 一共三个可选项 ament_python,ament_cmake,cmake –dependencies 指的是这个包的依赖,这里小鱼给一个ros2的python客户端接口rclpy build-type什么都不写,ros2会默认为ament_cmake 3.创建节点文件 在__init__.py同级别目录下创建一个叫做li4.py的文件(在vscode中右击新建就行) 编写ROS2节点的一般步骤 1.导入库文件 2.初始化客户端库 3.新建节点 4.spin循环节点 5.关闭客户端库 import rclpy from rclpy.node import Node
源代码见vscode 配置 在setup.py console_scripts里面添加 “li4_node=village_li.li4:main”
在工作空间下编译: colcon build 为了让系统找到功能包和节点:source install/setup.bash 最后在工作空间下运行节点: ros2 run village_li li4_node
ros2 node list ros2 node info /li4
import rclpy from rclpy .node import Node from std_msgs.msg import String
""" 导入消息类型
声明并创建发布者
编写发布逻辑发布数据 """
class WriterNode(Node): def __init(self,name): super().init(name) self.get_logger.info(“大家好,我是%s,我是一名作家!"%name) self.pub_novel = self.create_publisher(String,“sexy_girl”,10)
self.count = 0
self.timer_period = 5
self.timer = self.create_timer(self.timer_period,self.timer_callback)
def timer_callback(self):
msg = String()
msg.data = "第%d回连掩胡 %d 次偶遇呼延娘" % (self.count,self.count)
self.pub_novel.publish(msg) #让发布者发布消息
self.get_logger().info("发布了一个章节的小说内容是%s" % msg.data)
self.count += 1
def main(args=None): "”" 入口函数 1.ros2运行该节点的入口函数 2.编写ROS2的一般步骤 3,新建节点对象 4.spin循环节点 5.关闭客户端库 """ rclpy.init(args=args) #初始化rclpy li4_node = WriterNode(“li4”) #新建一个节点 rclpy.spin(li4_node) #保持节点运行,检测是否收到退出指令 rclpy.shutdown() #关闭客户端库
C++版
1.创建王家村功能包 王二居住在王家村,王家村和李家村不一样,是使用ament_cmake作为编译类型 所以王家村建立指令像下面这样,依赖变成rclcpp 新建工作空间(新建功能包) ros2 pkg create village_wang –build-type ament_cmake –dependencies rclcpp 2.创建节点 在village_wang/src下创建一个wang2.cpp文件
配置rclcpp/rcpcpp.hpp路径
源代码见vscode
修改CMakeList.txt文件 在CMakeList.txt最后一行加入下面两行代码 add_executable(wang2_node src/wang2.cpp) ament_target_dependencies(wang2_node rclcpp)
添加两行代码的目的是让编译器编译wang2.cpp这个文件,不然不会主动编译.接着在上面两行代码下面添加下面代码 install(TARGETS wang2_node DESTINATION lib/${PROJECT_NAME} ) 这个是C++比python更麻烦的地方,需要手动将编译好的文件安装到install/village_wang/lib/village_wang
编译运行节点 在工作空间下 colcon build –packages-select village_wang
ros2 pkg list | grep vill
source install/setup.bash
ros2 run village_wang wang2_node
2.编写python话题发布者
1.导入消息类型 2.声明并创建发布者 3.编写发布逻辑发布数据 编写cpp话题发布者
3.编写python话题订阅者
1.导入订阅的话题接口类型 2.创建订阅回调函数 3.声明并创建回调者 4.编写订阅回调处理逻辑
4.编写cpp话题发布者
1.创建一个话题订阅者的能力,用于拿到艳娘传奇的数据 2.创建一个话题发布者的能力,用于给李四送稿费 3.获取日志打印器的能力
5.编写cpp话题订阅者

点赞数据加载中
文档修订记录 8 次修订
- 197fd12 修复大小标题显示失败的bug
- 9a00af8 Fix: apply heading heuristic to 44 existing posts (26+18) - TOC now shows real sections
- edc8d79 博客界面更换 一些笑哦bug维修
- bce812d 6_28飞书文档同步更新
- 8c0c2ac 飞书同步test
- 7d34298 Add manual and sortable library
- 9402175 Improve blog layout and pinned posts
- 98d0f15 Create Hugo blog