Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
zhujinwen0924 opened this issue Jun 10, 2021 · 5 comments
Open

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

zhujinwen0924 opened this issue Jun 10, 2021 · 5 comments

Comments

@zhujinwen0924
Copy link

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

@lh9171338
Copy link
Owner

  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
Copy link
Author

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

@lh9171338
Copy link
Owner

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

@TTkane
Copy link

TTkane commented Jan 7, 2023

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

@lh9171338
Copy link
Owner

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants