lh9171338 / Astar

ROS package of A star algorithm
127 stars 21 forks source link

地图变化的情况下能用吗? #2

Open zhujinwen0924 opened 3 years ago

zhujinwen0924 commented 3 years ago

你好,请问这个算法在地图变化的情况下能用吗,我在做主动建图的时候,地图随着gmapping建图更新,用 A导航,貌似mask在rviz上面显示不出来:rviz mask报错 Map Data size doesn't match widthheight: width = 1984, height = 1984, data size = 295219200(这个值在不断变大),请问这是为什么呢?应该从哪里改呢.

lh9171338 commented 3 years ago
  1. 这套代码编写时是基于静态地图的,但是在地图变换的情况下也可以用,因为代码中订阅了栅格地图消息,可以实时获取最新的地图;
  2. 针对动态地图,可能需要修改的点,a) 地图回调与main函数加上互斥锁同步,防止astar.PathPlanning(startPoint, targetPoint, PathList)执行过程中,进入回调执行astar.InitAstar(Map, Mask, config); b) 修改PathPlanning执行的条件,使得地图更新后自动重新进行路径规划;
  3. 你的报错可能是因为获取的地图不是CV_8UC1格式的,代码中计算的Mask数据是CV_8UC1格式的(即单通道),但info字段是复制的地图的,(即OccGridMask.info = msg.info),这里可能导致实际数据大小与info中的不一致;
  4. 在实际的建图+导航的应用中,一般不会直接使用裸A*算法,而会使用ros::navigation导航包,或其他高级的导航算法
zhujinwen0924 commented 3 years ago

非常感谢您这么详细的解答,刚刚查阅源代码解决了算法不适配动态更新的地图的问题.主要原因是main.cc里面 OccGridMask.data.push_back(OccProb);这句代码会随着地图的更新而不断的往里面pushback数值,因此会出现错误.解决办法是往第72行后面加上一句 OccGridMask.data.clear();即可,这样每次更新地图就会清除历史累积数据.

lh9171338 commented 3 years ago

感谢您细致的检查,根据您的反馈已经对代码进行了修正

TTkane commented 1 year ago

你好,想请问下,这个输入换成nav_msgs::GridCells这种格式可以吗,需要做哪些修改呢?激光雷达检测的数据通过nav_msgs::GridCells动态的输入,cells里面的内容是栅格相对于雷达原点的xy坐标,z坐标用来记录栅格是否有障碍物。

lh9171338 commented 1 year ago

有障碍物信息就可以,修改的话可以参考main.cpp中的void MapCallback(const nav_msgs::OccupancyGrid& msg)函数,重新实现一个void MapCallback(const nav_msgs::GridCells& msg)函数,计算Map