amcl原理:
amcl将激光传感器数据与从地图预估的传感器数据相比较,给出可能的位姿。如果传感器数据和某个候选位姿处的预测数据相同,amcl就会给这个位姿一个较高的概率,反之,就会降低这个概率。概率较低的位姿就会被删除,替换成与现存的较高概率位姿相接近的位姿。随着时间的推进,候选位姿就会聚集在真实位姿的周围。
导航工具包:
首先创建一个global costmap(全局评价地图),描述了机器人在地图中的某个位置出现的“好处”有多大。电机Global Planning勾选框,展开选中Costmap选项,然后就能看到全局评价地图。
图像消息订阅:
我们可以直接订阅image_raw话题,如果操作在WIFI等带宽等受限环境下进行,则可能需要修改image_raw/compressed话题,其中的图像在发送之前经过了压缩。计算机视觉算法还是在压缩图像上效果最好。
image_sub = rospy.Subscriber('camera/rgb/image_raw', Image, imaghe_callback)
使用下面的命令可以看到camera/rgb/image_raw在以每秒20Hz的频率发布
rostopic hz camera/rgb/image_raw
特别注意,当使用usb摄像头的时候,订阅的话题应该是 /usb_cam/image_raw
ROS中使用OpenCV:
需要使用cv_bridge包来将ROS的sensor_msgs/Image消息转换成OpenCV格式。例如:
#!/usr/bin/env python # coding=utf-8 import rospy from sensor_msgs.msg import Image import cv2, cv_bridge class Follower: def __init__(self): self.bridge = cv_bridge.CvBridge() cv2.namedWindow("window", 1) # 摄像头以每秒20HZ的频率发布消息,不需要手动发布了 # 订阅usb摄像头 # self.image_sub = rospy.Subscriber("/usb_cam/image_raw", Image, self.image_callback) self.image_sub = rospy.Subscriber("cv_bridge_image", Image, self.image_callback) # 订阅深度相机 # self.image_sub = rospy.Subscriber("/camera/rgb/image_raw", Image, self.image_callback) # self.image_sub = rospy.Subscriber("/camera/depth/image_raw", Image, self.image_callback) def image_callback(self, msg): image = self.bridge.imgmsg_to_cv2(msg, desired_encoding='bgr8') cv2.imshow("window", image) cv2.waitKey(3) rospy.init_node("opencv") follower = Follower() rospy.spin()
可视化Rviz:
对Rviz进行一些配置之后,退出时选择保存,这样就不用在下一次打开时重新配置一遍