moveTo()方法抛出VerifyException异常的排查与解决求助
解决AGV随机移动时的VerifyException问题
从你提供的异常栈和代码来看,这个VerifyException是RinSim的CollisionGraphRoadModelImpl在计算可移动距离时触发的验证失败,通常是因为AGV的当前状态(比如处于移动途中的connection上)和你生成的路径/目标点不匹配导致的。结合你提到的doFollowPath中的bug注释,我给你几个可行的workaround和代码调整建议:
1. 避免在AGV移动途中切换目标
你的代码在AGV还处于某个connection(即正在从一个节点移动到另一个节点的途中)时,就直接用connection的to()点作为起点生成新路径,但AGV的实际位置是在这个connection的中间位置,这会导致后续移动时,模型验证路径起点和实际位置不匹配,触发异常。
你可以修改tickImpl逻辑,先让AGV完成当前的connection移动,再生成新的随机目标:
CollisionGraphRoadModelImpl model = (CollisionGraphRoadModelImpl) getRoadModel(); if (!randomDestination.isPresent()) { nextRandomDestination(model); } // 先处理未完成的connection移动 if (model.getConnection(this).isPresent()) { final Connection<?> currentConn = model.getConnection(this).get(); getRoadModel().moveTo(this, currentConn.to(), time); // 到达connection终点后,清空当前连接状态并重置目标 if (model.getPosition(this).equals(currentConn.to())) { model.leaveConnection(this, currentConn); randomDestination = Optional.empty(); } } else { // 正常移动到随机目标 getRoadModel().moveTo(this, randomDestination.get(), time); if (model.getPosition(this).equals(randomDestination.get())) { nextRandomDestination(model); } }
2. 用AGV实际位置计算路径
你的nextRandomDestination方法中,当AGV处于connection上时,强行将路径起点设为connection的to()点,这和AGV的实际位置不符。应该直接使用AGV的当前实际位置作为路径起点:
void nextRandomDestination(CollisionGraphRoadModelImpl model) { randomDestination = Optional.of(model.getRandomPosition(rng)); Point end = randomDestination.get(); // 直接使用AGV当前的实际位置作为路径起点 Point start = model.getPosition(this); randomPath = new LinkedList<>(model.getShortestPathTo(start, end)); }
3. 路径跟随的额外检查(如果使用followPath)
如果你选择用followPath而不是moveTo,每次tick前要确保路径的有效性:
- 检查路径是否为空
- 检查AGV当前位置是否能到达路径的第一个节点
- 如果路径无效,立即重新生成新路径
比如:
if (randomPath.isEmpty()) { nextRandomDestination(model); } else { // 检查当前位置到路径第一个节点的可达性 Point firstPathNode = randomPath.getFirst(); if (!model.canMoveTo(this, firstPathNode)) { randomPath = new LinkedList<>(model.getShortestPathTo(model.getPosition(this), randomDestination.get())); } model.followPath(this, randomPath, time); // 到达目标后重置 if (model.getPosition(this).equals(randomDestination.get())) { nextRandomDestination(model); } }
这些调整应该能避免触发验证异常,核心思路是确保AGV的移动状态和路径/目标点始终保持一致,不要在未完成当前移动的情况下强行切换目标或使用错误的路径起点。
内容的提问来源于stack exchange,提问作者Damcios
相关产品推荐
相关产品推荐

