基础算法
1. Topic话题和Message消息
1.2 Publish发布者
1.召唤ROS大管家rospy
2.向ROS大管家申请初始化节点
3.告诉ROS大管家rospy需要发布的话题名称,并向他索要能够发送消息包的发布对象pub。
4.开启一个whie循环,不停的使用pub对象发布消息包。
1 | #!/usr/bin/env python3 |
1.2 Subscriber订阅者
1.召唤ROS大管家rospy
2.向ROS大管家rospy申请初始化节点。
3.构建一个回调函数,用于处理从话题中接收到的消息包数据
4.告诉ROS大管家 rospy需要订阅的话题名称,并设置接收消息包的回调函数。
5.调用ROS的spin()函数。
1 | #!/usr/bin/env python3 |
1.3 launch启动多个ROS节点
格式:![image-20241018142606686](C:\Users\yulong wang\AppData\Roaming\Typora\typora-user-images\image-20241018142606686.png)
1 | <launch> |
2. 标准消息包std_msgs
![image-20241017195340608](C:\Users\yulong wang\AppData\Roaming\Typora\typora-user-images\image-20241017195340608.png)
结构体类型:
ColorRGBA(表示像素)
Duration/Time (相对时间/绝对时间)
Header(时间戳和坐标)
MultiArrayDImension/MultiArrayLayout(描述数组内容)
3. 常用消息包common_msgs
![image-20241017200414874](C:\Users\yulong wang\AppData\Roaming\Typora\typora-user-images\image-20241017200414874.png)
常用消息包:geometry_msgs/sensor_msgs
3.1 几何消息包geometry_msgs
![image-20241017200601343](C:\Users\yulong wang\AppData\Roaming\Typora\typora-user-images\image-20241017200601343.png)
3.2 传感器消息包sensor_msgs
![image-20241017200628634](C:\Users\yulong wang\AppData\Roaming\Typora\typora-user-images\image-20241017200628634.png)
3.3 自定义消息类型
生成自定义消息的步骤:
- 创建新软件包,依赖项message_generation、message_runtime
- 软件包添加msg目录,新建自定义消息文件,以.msg结尾。
- 在CMakeLists.txt中,将新建的.msg文件加入add message_files()
- 在CMakeLists.txt中去掉generate_messages()注释符号,将依赖的其他消息包名称添加进去。
- 在CMakeLists.txt中,将message_runtime 加入 catkin_package()的CATKIN DEPENDS。
- 在package.xml中,将message_generation、message_runtime加入
和 - 编译软件包,生成新的自定义消息类型
3.4 自定义消息类型的应用
- 在节点代码中,先 import 新定义的消息类型。
- 在发布或订阅话题的时候,将话题中的消息类型设置为新的消息类型。
- 按照新的消息结构,对消息包进行赋值发送或读取解析。
- 在CMakeLists.txt文件的find_package()中,添加新消息包名称作为依赖项。
- 在package.xml中,将新消息包添加到
和 中去。 - 重新编译,确保全歼包进入ROS的包列表。
4.栅格地图
4.1栅格地图格式
- 地图数据格式
![image-20241018164710650](C:\Users\yulong wang\AppData\Roaming\Typora\typora-user-images\image-20241018164710650.png)
- 地图描述信息
![image-20241018164834735](C:\Users\yulong wang\AppData\Roaming\Typora\typora-user-images\image-20241018164834735.png)
4.2发布地图
- 构建一个软件包map_pkg,依赖项里加上nav_msgs
- 编译软件包,让其进入ROS的包列表。
- 在map_pkg里创建一个节点map_pub_node.py。
- 在节点中发布话题/map,消息类型为OccupancyGrid。
- 构建一个OccupancyGrid地图消息包,并对其进行赋值。
- 将地图消息包发送到话题/map。
- 为节点map_pub_node.py添加可执行权限
- 运行map_pub_node.py节点
- 启动RViz,订阅话题/map,显示地图
5.slam
同步定位与建图(Simultaneous Localization and Mapping,简称SLAM)问题可以描述为:机器人在未知环境中从一个未知位置开始移动,在移动过程中根据位置和地图进行自身定位,同时在自身定位的基础上建造增量式地图,实现机器人的自主定位和导航。
5.1Hector_Mapping
6.ROS的TF系统
地图坐标系(/map):原点在机器人建图的初始位置,坐标轴方向遵循ROS的右手法则
机器人坐标系(/base_footprint):原点在机器人底盘中心位置,坐标轴方向遵循ROS的右手法则
地图坐标系作为父坐标系,机器人坐标系为子坐标系。
TF(Transform):用于描述子坐标系关于父坐标系的位置和角度偏移量