ROS

2024-10-30

学习笔记, python

基础算法

1. Topic话题和Message消息

1.2 Publish发布者

​ 1.召唤ROS大管家rospy
​ 2.向ROS大管家申请初始化节点
​ 3.告诉ROS大管家rospy需要发布的话题名称,并向他索要能够发送消息包的发布对象pub。
​ 4.开启一个whie循环,不停的使用pub对象发布消息包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python3
# coding=utf-8

import rospy
from std_msgs.msg import String

if __name__=="__main__":
rospy.init_node("chao_node");
rospy.logwarn("我的枪去而复返,你的生命有去无回");
pub = rospy.Publisher("kuai_shang_che_kai_hei_qun",String,queue_size=10)

rate = rospy.Rate(10)

while not rospy.is_shutdown():
rospy.loginfo("我要开始刷屏了");
msg = String()
msg.data = "国服马超带飞"
pub.publish(msg)
rate.sleep()

1.2 Subscriber订阅者

​ 1.召唤ROS大管家rospy
​ 2.向ROS大管家rospy申请初始化节点。
​ 3.构建一个回调函数,用于处理从话题中接收到的消息包数据
​ 4.告诉ROS大管家 rospy需要订阅的话题名称,并设置接收消息包的回调函数。
​ 5.调用ROS的spin()函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python3
# coding=utf-8

import rospy
from std_msgs.msg import String

def chao_callback(msg):
rospy.loginfo(msg.data)

def yao_callback(msg):
rospy.logwarn(msg.data)

if __name__ == "__main__":
rospy.init_node("ma_node")

sub = rospy.Subscriber("kuai_shang_che_kai_hei_qun",String,chao_callback,queue_size=10)
sub_2 = rospy.Subscriber("gie_gie_dai_wo",String,yao_callback,queue_size=10)

rospy.spin()

1.3 launch启动多个ROS节点

格式:![image-20241018142606686](C:\Users\yulong wang\AppData\Roaming\Typora\typora-user-images\image-20241018142606686.png)

1
2
3
4
5
6
7
8
<launch>

<node pkg="ssr_pkg" type="chao_node.py" name="chao_node"/>
<node pkg="ssr_pkg" type="yao_node.py" name="yao_node"/>
<node pkg="atr_pkg" type="ma_node.py" name="ma_node launch-prefix="gnome-terminal -e"/>
<!-- launch-prefix="gnome-terminal -e :单独运行在一个terminal-->

</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 自定义消息类型

生成自定义消息的步骤:

  1. 创建新软件包,依赖项message_generation、message_runtime
  2. 软件包添加msg目录,新建自定义消息文件,以.msg结尾。
  3. 在CMakeLists.txt中,将新建的.msg文件加入add message_files()
  4. 在CMakeLists.txt中去掉generate_messages()注释符号,将依赖的其他消息包名称添加进去。
  5. 在CMakeLists.txt中,将message_runtime 加入 catkin_package()的CATKIN DEPENDS。
  6. 在package.xml中,将message_generation、message_runtime加入
  7. 编译软件包,生成新的自定义消息类型

3.4 自定义消息类型的应用

  1. 在节点代码中,先 import 新定义的消息类型。
  2. 在发布或订阅话题的时候,将话题中的消息类型设置为新的消息类型。
  3. 按照新的消息结构,对消息包进行赋值发送或读取解析。
  4. 在CMakeLists.txt文件的find_package()中,添加新消息包名称作为依赖项。
  5. 在package.xml中,将新消息包添加到中去。
  6. 重新编译,确保全歼包进入ROS的包列表。

4.栅格地图

4.1栅格地图格式

  1. 地图数据格式

![image-20241018164710650](C:\Users\yulong wang\AppData\Roaming\Typora\typora-user-images\image-20241018164710650.png)

  1. 地图描述信息

![image-20241018164834735](C:\Users\yulong wang\AppData\Roaming\Typora\typora-user-images\image-20241018164834735.png)

4.2发布地图

  1. 构建一个软件包map_pkg,依赖项里加上nav_msgs
  2. 编译软件包,让其进入ROS的包列表。
  3. 在map_pkg里创建一个节点map_pub_node.py。
  4. 在节点中发布话题/map,消息类型为OccupancyGrid。
  5. 构建一个OccupancyGrid地图消息包,并对其进行赋值。
  6. 将地图消息包发送到话题/map。
  7. 为节点map_pub_node.py添加可执行权限
  8. 运行map_pub_node.py节点
  9. 启动RViz,订阅话题/map,显示地图

5.slam

​ 同步定位与建图(Simultaneous Localization and Mapping,简称SLAM)问题可以描述为:机器人在未知环境中从一个未知位置开始移动,在移动过程中根据位置和地图进行自身定位,同时在自身定位的基础上建造增量式地图,实现机器人的自主定位和导航。

5.1Hector_Mapping

6.ROS的TF系统

​ 地图坐标系(/map):原点在机器人建图的初始位置,坐标轴方向遵循ROS的右手法则

​ 机器人坐标系(/base_footprint):原点在机器人底盘中心位置,坐标轴方向遵循ROS的右手法则

​ 地图坐标系作为父坐标系,机器人坐标系为子坐标系。

​ TF(Transform):用于描述子坐标系关于父坐标系的位置和角度偏移量