序言
书接上文(哈哈哈,已经过了好久才又继续做这个,一会贴个上文链接)
保存栅格地图
通过map server来保存地图
两个需要注意的参数
map:=后面放ros中topic的名字,在octomap生成的栅格地图就叫/projected_map
-f 后面接的是保存成的yaml和pgm文件名字与地址
rosrun map_server map_saver map:=/projected_map -f map
发布栅格地图
rosrun map_server map_server map.yaml /map:=/gobal_map
依然是map server
/map:=/gobal_map 是话题重映射,你们可加可不加,我是因为**/map**话题本身已经发布了,所以换个名字
同时需要注意,map server 发布的地图的frame id是map
frame id是map!!!
这很重要
注意事项
注意,使用octomap保存的地图,有可能会出现
MongoDB_"Error parsing YAML config file: yaml-cpp: error at line 3, column34
啥啥啥的问题
解决方案是** line 3, column34**这个位置
注意到原点坐标的z轴坐标是-nan,怎么看都不对劲,所以手动给了0
自动修改frame id
rosrun map_server map_server map.yaml /map:=/gobal_map _frame_id:="/world"
手动修改frame id(懒得删了)
目前还没去看map server 的 frame id 如何设置,所以先手动加个代码修改frame id
(我为什么要修改frame id)因为autoware 的map坐标系是局部地图的cost map,我这里发布的是全局的栅格地图,全局的栅格地图对应的是/points_map的world,所以需要修改frame id为world
import rospy
from nav_msgs.msg import OccupancyGrid
import time
class Transfer():
def __init__(self):
#初始化节点
rospy.init_node('transfer_frameid_of_gobal_map')
self.map_pub = rospy.Publisher('/new_gobal_map', OccupancyGrid, queue_size=100)
rospy.Subscriber('/gobal_map', OccupancyGrid, self.callback_lidar)
def callback_lidar(self,data):
#重设frame_id
data.header.frame_id="/world"
self.map_pub.publish(data)
if __name__ == '__main__':
Transfer()
rospy.spin()