【问题标题】:Collision behaviour of vehicles in rinsimrinsim中车辆的碰撞行为
【发布时间】:2018-05-30 18:31:26
【问题描述】:

我们在 rinsim 中模拟多辆车时发现了以下行为: 车辆可以像我们预期的那样相互行驶而不会发生碰撞,但有时我们会遇到以下异常:

出租车 eda0940 正在连接 (30.0,22.0)-(30.0,26.0)

出租车 3578436e 与该连接方向相反 (30.0,26.0)-(30.0,22.0)

两辆出租车似乎都发生了碰撞,并获得了无法跳跃或改变方向的异常。他们都朝着正确的方向前进,也是他们想要继续追随的方向。有人可以解释这种行为吗?

如果真的是两辆出租车相撞,我们预计会有不同的例外情况。还有为什么这些冲突只会在某些情况下发生。

taxi.Taxi@2eda0940: Current intended path: [(30.0,26.0), (30.0,30.0), (34.0,30.0), (38.0,30.0), (42.0,30.0), (46.0,30.0), (50.0,30.0), (54.0,30.0), (58.0,30.0)]
taxi.Taxi@2eda0940: Following path [(30.0,22.92888888888889), (30.0,26.0)]
taxi.Taxi@2eda0940: Current position (30.0,22.92888888888889)
taxi.Taxi@2eda0940: Current connection Optional.of(Connection{from=(30.0,22.0), to=(30.0,26.0), data=Optional.absent()})
java.lang.IllegalArgumentException: Illegal path for this object, from a position on a connection we can not jump to another connection or go back. From (30.0,22.92888888888889), to (30.0,26.0).
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:146)
at com.github.rinde.rinsim.core.model.road.GraphRoadModelImpl.checkMoveValidity(GraphRoadModelImpl.java:241)
at com.github.rinde.rinsim.core.model.road.GraphRoadModelImpl.doFollowPath(GraphRoadModelImpl.java:169)
at com.github.rinde.rinsim.core.model.road.AbstractRoadModel.followPath(AbstractRoadModel.java:94)
at taxi.Taxi.delegate_mas_impl(Taxi.java:262)
at taxi.Taxi.tickImpl(Taxi.java:366)
at com.github.rinde.rinsim.core.model.pdp.Vehicle.tick(Vehicle.java:55)
at com.github.rinde.rinsim.core.model.time.TimeModel.tickImpl(TimeModel.java:139)
at com.github.rinde.rinsim.core.model.time.SimulatedTimeModel.doStart(SimulatedTimeModel.java:32)
at com.github.rinde.rinsim.core.model.time.TimeModel.start(TimeModel.java:94)
at com.github.rinde.rinsim.ui.SimulationViewer$5.run(SimulationViewer.java:401)

taxi.Taxi@3578436e: Optional.of(Connection{from=(30.0,26.0), to=(30.0,22.0), data=Optional.absent()})
taxi.Taxi@3578436e: []
taxi.Taxi@3578436e: 1920000
taxi.Taxi@3578436e: Moving to (30.0,22.0)
taxi.Taxi@3578436e: 

taxi.Taxi@3578436e: Current intended path: [(30.0,22.0), (30.0,18.0), (30.0,14.0), (16.0,16.0), (12.0,16.0), (8.0,16.0), (4.0,16.0), (0.0,16.0), (0.0,12.0), (0.0,8.0)]
taxi.Taxi@3578436e: Following path [(30.0,22.92888888888889), (30.0,22.0)]
java.lang.IllegalArgumentException: Illegal path for this object, from a position on a connection we can not jump to another connection or go back. From (30.0,22.92888888888889), to (30.0,22.0).
taxi.Taxi@3578436e: Current position (30.0,22.92888888888889)
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:146)
taxi.Taxi@3578436e: Current connection Optional.of(Connection{from=(30.0,26.0), to=(30.0,22.0), data=Optional.absent()})
at com.github.rinde.rinsim.core.model.road.GraphRoadModelImpl.checkMoveValidity(GraphRoadModelImpl.java:241)
at com.github.rinde.rinsim.core.model.road.GraphRoadModelImpl.doFollowPath(GraphRoadModelImpl.java:169)
at com.github.rinde.rinsim.core.model.road.AbstractRoadModel.followPath(AbstractRoadModel.java:94)
at taxi.Taxi.delegate_mas_impl(Taxi.java:262)
at taxi.Taxi.tickImpl(Taxi.java:366)
at com.github.rinde.rinsim.core.model.pdp.Vehicle.tick(Vehicle.java:55)
at com.github.rinde.rinsim.core.model.time.TimeModel.tickImpl(TimeModel.java:139)
at com.github.rinde.rinsim.core.model.time.SimulatedTimeModel.doStart(SimulatedTimeModel.java:32)
at com.github.rinde.rinsim.core.model.time.TimeModel.start(TimeModel.java:94)
at com.github.rinde.rinsim.ui.SimulationViewer$5.run(SimulationViewer.java:401)

【问题讨论】:

    标签: java rinsim


    【解决方案1】:

    此行为是由 RinSim 中的错误引起的。一种解决方法是替换:

    List<Point> path = rm.getShortestPathTo(start, cur_path.peek());
    

    与:

    Point start = rm.getPosition(this);
    if (rm.getConnection(this).isPresent()) {
      start = rm.getConnection(this).get().to();
    }
    List<Point> path = rm.getShortestPathTo(start, cur_path.peek());
    

    【讨论】:

    • 您可以看到两辆出租车都有正确的路径:Taxi 1: Current intended path: [(30.0,26.0), (30.0,30.0), (34.0,30.0), (38.0,30.0), (42.0,30.0), (46.0,30.0), (50.0,30.0), (54.0,30.0), (58.0,30.0)] Following path [(30.0,22.92888888888889), (30.0,26.0)] Current position (30.0,22.92888888888889) Current connection Optional.of(Connection{from=(30.0,22.0), to=(30.0,26.0), data=Optional.absent()}) 因此,从当前连接的端点开始的路径的断言已满。 (出租车 2 也一样)
    • 你能发布最小的工作示例代码来重现你描述的行为吗?这样我就可以调查这种行为。
    • 这是一个带有最小工作示例的 github,出租车随机运行并在 11 小时左右崩溃。 github.com/Woekiki/MAS_CollisionError
    • 好的,我在 RinSim 中发现了一个可能导致此问题的错误。不过需要一点时间来修复它。修复完成后将更新此线程。
    • 用解决问题的方法更新了答案。
    猜你喜欢
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多