Zen总结: ROS是一个分布式节点通信网络、topic、service的C/S、param服务器、
坐标变换TF
Point:
- 学完ros1先不学ros2;直接学习slam14讲并写一个slam系统
- ROS 是最基础的,一定要掌握其设计思想,工作原理。在此基础上熟练常用操作。不掌握ROS,什么都不可能做,这是SLAM以及机器人相关一切工作的前提。随着实践的增加,掌握ROS这个工具是自然而然容易的一件事。
- ROS目标:共享机器人开发相关软件、方便机器人开发;避免重复造轮子。
- 编程方法:先理清算法思路,写的时候先写方法名称及注释要做的事情。具体coding是个及其简单的体力活,交给AI和搜索引擎做即可。(关注点应该在算法实现思路上) // 提示GPT根据算法思想和注释生成代码即可
- 遇到问题不要瞎自己琢磨,直接将错粘到浏览器搜索即可,百分百开隐患搜索到。别瞎浪费时间自己瞎弄
- 只要明确想要的东西或问题,答案是最简单的一部分
一. ROS资源
二. ROS常用操作
- printenv |grep ROS // 查看环境
- roscd pkg_name //快速进入指定ROS软件包
- rosls pkg_name
- rospack pkg_name(功能包名称) // 用于快速切换进入功能包目录
二. 构建工作空间
- 安装ROS: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-azkb6TV4-1691117104555)(img/ROS_install.png)]
- rosdep可以使用鱼香ROS的rosdepc代替,确保成功
- 脚本快捷安装
- 工作空间构建
对于ROS Melodic和早期版本的Python 3用户:注意,如果你从源代码构建ROS来实现Python 3的兼容性,并适当地设置您的系统(即:安装所有必需的ROS Python包的Python 3版本,例如catkin),那么在干净的catkin工作区中的第一个catkin_make命令必须是:
catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3
另外,如果你查看一下当前目录应该能看到build和devel这两个目录。在devel文件夹里面你可以看到几个setup.*sh文件。source这些文件中的任何一个都可以将当前工作空间设置在环境的最顶层。想要了解更多,请参考catkin文档。接下来首先source一下新生成的setup.*sh文件:
$ source devel/setup.bash
要保证工作区被安装脚本正确覆盖,需确定ROS_PACKAGE_PATH环境变量包含你当前的工作空间目录:
检测当前ROS环境: $ echo $ROS_PACKAGE_PATH
三. ROS基础
- ROS是由结点构成的相互通信的分布式网络结构;节点记录了相关的数据和信息,别的节点可以获取并进行处理,也可以订阅后获取或者保存下来。eg. 各种Sensor的数据就保存在sensor对应的节点中,可以订阅获取或保存。
- 参数服务器:即ROS全局的参数字典,存储所有节点参数供各节点查询使用。
- 通信方式:
- 订阅者模式(同一个话题发布或订阅对象可以多个,属于异步通信),具体如图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lO0vleWZ-1691117104555)(img/publisher_subscriber.png)]
- C/S模式(服务器/客户端,有请求有应答,和TCP/IP方式一样,比较及时,是一种同步通信机制),具体如图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xmz6sJum-1691117104556)(img/client_service.png)]
- 两种方式对比以及适用场景:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CpbDv5au-1691117104556)(img/ps_cs_compare.png)]
- 参数服务器:比较多用于静态参数,即当字典用,但是也可以在动态参数下适用。如图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cLjjZs6j-1691117104556)(img/param_srv.png)]
- ROS文件系统:如图[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LvyFyKQF-1691117104556)(img/file_sys.png)]
四. ROS命令行工具
- 常见命令:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rVnVqT3T-1691117104557)(img/ros_cmd.png)]
- rosrun命令后面跟两参数,即功能包名称、功能包内节点名称。eg. rosrun turtlesim turtlesim_node
- QT工具(一般为可视化工具):基于QT实现的一些常用工具,eg.Ros的节点计算图工具rqt_graph
- ROS常用命令(enter即可获取帮助,tab一次或两次可补全):
- rostopic
- rosnode
- rosservice
- rosmsg
- rossrv
- rosbag(常用且重要)
- rosbag详细说明:常用与数据记录(bag数据包),采集所有话题数据包后方便在离线或二次在实验室等打开复现数据使用
- 话题记录(记录到bag数据包): eg. rosbag record -a -O save_dir/bag_name
- 话题重现(播放记录的数据包,可以使用rviz等查看): eg. rosbag play save_dir/bag_name.bag
II. 创建工作空间
- 步骤如图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NEYoFPdt-1691117104557)(img/workspace.png)]
- 编程创建自己的ROS功能包:
- 创建功能包: catkin_create_pkg 功能包名称 标准信息数据格式(std_msgs) 各种依赖包。eg. catkin_create_pkg test_pkg std_msgs rospy roscpp (如图):[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jai1tMBA-1691117104557)(img/create_pkg.png)]
- 编译功能包&设置包环境为最上层ROS环境
III. 创建发布者或订阅者(程序可以用c++写也可以用python写,c++的话需要catkin_make编译,python无需编译,只有给与执行权限即可)
- 创建步骤:初始化节点 ————> 向ROS master注册节点信息 ————> 创建消息数据 ————> 发布消息。 具体例子如图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5DWDRQeL-1691117104557)(img/create_publisher.png)]
- 创建订阅者:初始化节点 ————> 订阅需要订阅的话题 ————> 循环等待话题消息,接收到则进入回调函数处理
- 话题消息的订阅与使用(自定义消息并发布订阅):[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Uqkhp6n-1691117104557)(img/custom_msgs.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LDWwmLVN-1691117104558)(img/custom_msgs2.png)]
- 每个功能包都有自己的src、package.xml以及CMakeLists.txt,添加新功能一定要修改添加相关文件内容到以上文件再重新编译
- 创建publisher节点:步骤仍然是(初始化节点 ——> 创建节点句柄 ———> 创建发布者<包含所要发布的话题名称以及话题类型以及缓存队列长度> ———> 然后初始化消息循环发布消息即可 )eg. person_publisher.py (python比较简单,也可以用c++写,但需要编译)
- 创建话题订阅者:步骤(初始化节点 ———> 创建节点句柄 ————> 创建订阅者并指明需要订阅的话题 ————> 循环等待话题消息,收到则进入回调函数处理消息)
- 节点计算图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FdXAYwMD-1691117104558)(img/custom_msg_graph.png)]
IV. 客户端 & 服务端编程实现
- Client编程实现: 初始化节点 ———> 创建节点句柄 ———> 查询阻塞等待所需服务 & 创建服务客户端 ———> 初始化请求 ———> 请求服务 ———> 显示请求服务结果。具体如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MiZRAByk-1691117104558)(img/create_client.png)]
- server编程实现:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c5hgSqGH-1691117104558)(img/server_cmd_vel.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wD90eXCc-1691117104558)(img/creat_server.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-48gCNPxW-1691117104559)(img/run_server.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8uUHSjAC-1691117104559)(img/run_server1.png)]
- 自定义服务数据并使用(与上面创建服务生成一个新小乌龟完全一样流程,只是提供服务不同)
整个流程由ROS的API方法实现。eg.初始化节点、创建节点句柄、调用服务等
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sB7gtmCd-1691117104559)(img/custom_service.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LjRoXnsU-1691117104559)(img/custom_service_msg.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fCv9WXgN-1691117104559)(img/create_custom_service.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I2kVdAYP-1691117104560)(img/create_custom_client.png)]
V. 参数服务器(全局的一个参数字典,可以为所有节点服务)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-saDb9KaI-1691117104560)(img/param_service.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U2TT1Gxf-1691117104560)(img/param_use.png)]
- 直接使用get / set即可获取/设置参数值
- 可以使用dump将所有参数保存到yaml文件中,通过保存的文件批量修改参数,修改晚后使用load加载该配置文件即可生效
- 参数就是键值对(即参数名称和对应参数值.即name value),可以写到yaml配置文件中批量修该并导入。
I. [参数配置的代码实现]
编译并运行即可看到背景颜色变为修改的颜色(如图)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lp03DjLg-1691117104560)(img/param_config.png)]
VI. ROS中的坐标系管理系统(ROS提供API功能包实现机器人所有坐标系的管理和操作)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EyTaA9vW-1691117104560)(img/tf.png)]
- 小海龟坐标变换实验
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0w97Vx8Q-1691117104560)(img/turtle_tf.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lJ7qG8cQ-1691117104561)(img/tf_turtle_demo.png)]
tf坐标系广播与监听的编程实现
- 通过广播各个坐标系和世界坐标系的关系,从而得到各个坐标系间转换关系TRS
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OPC4ZxdY-1691117104561)(img/create_tf_transformBroadcaster.png)]
- 创建广播监听器
在实现海龟2追随海龟1的例程中,海龟2通过获取的海龟1的位姿来设置自己的角速度、线速度控制自己不断朝海龟1的位置移动
算法思路如下:
//初始化节点
//创建节点句柄
//请求产生海龟2
//创建控制海龟2运动的发布者
//创建tf监听器
//获取海龟1、海龟2之间的坐标转换数据
//根据海龟1、海龟2的坐标间位姿关系,发布海龟2的运动控制指令
VII. Launch启动文件
- launch文件可以自动启动ROS master,无需手动启动。
- Launch文件语法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uP89Frp6-1691117104561)(img/launch_grammer.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l0c9izkG-1691117104561)(img/launch_grammer002.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R8rQNBVo-1691117104561)(img/launch_grammer003.png)]
3. 例子:简单发布节点;使用launch配置节点参数;remap、include使用案例
VIII. 常用可视化工具(多以rqt开头)
- 如图常见工具
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EINV2ihp-1691117104561)(img/rqt_view.png)]
2.rqt的所有工具包都可以直接使用rqt这个综合工具打开,甚至可以再次开发获得自定义的一个上位机。
- 最常用工具rviz:除各种默认官方支持外,还可以自定义扩展实现自己的需要
- Gazebo:仿真平台,可以用于创建仿真数据。类似Isaac Sim
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WQgnonFc-1691117104562)(img/gazebo.png)]
IX. 进阶攻略
- 课程总结
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e07i6rpp-1691117104562)(img/sum.png)]
SUM
基础ROS已完全掌握,后续根据其设计思想以及需求查询使用学习更高阶内容即可