如何在AnyLogic中计算两个行人智能体的相对速度
AnyLogic行人仿真两指定行人相对速度计算方案
核心原理
行人库内置的getSpeed()方法仅返回速度矢量的模长(即无方向的标量速率),丢失了运动方向信息,直接对两个行人的getSpeed()返回值做差不具备物理意义。相对速度是矢量,需要基于两个行人的实时速度分量做矢量运算得到结果。
具体实现步骤
- 获取行人实时速度分量
行人对象内置了全局坐标系下的速度分量获取方法,返回值已经包含运动方向、运动速率信息,2D仿真场景下仅需获取x、y两个方向的分量即可:
3D仿真场景下可额外通过// 假设两个待计算的行人实例为ped1、ped2 // 提取ped1的速度分量 double v1x = ped1.getXVelocity(); double v1y = ped1.getYVelocity(); // 提取ped2的速度分量 double v2x = ped2.getXVelocity(); double v2y = ped2.getYVelocity();getZVelocity()获取垂直方向速度分量,计算逻辑和2D一致。 - 计算相对速度矢量
相对速度满足矢量减法规则:若要计算ped1相对于ped2的相对速度,直接对同方向分量做差即可:
若需要ped2相对于ped1的相对速度,将分量减数和被减数互换即可。double relVx = v1x - v2x; double relVy = v1y - v2y; - 按需输出计算结果
- 若需要保留相对运动的方向属性(如判断行人是靠近还是远离、计算相对运动方向角),可直接使用
relVx、relVy分量做后续逻辑判断,例如相对运动方向角可通过Math.atan2(relVy, relVx)计算得到。 - 若需要相对速度的标量大小(即相对速率,和
getSpeed()返回值格式一致),对差分量求平方和开根号即可:
double relSpeed = Math.hypot(relVx, relVy); - 若需要保留相对运动的方向属性(如判断行人是靠近还是远离、计算相对运动方向角),可直接使用
注意:上述方法在楼梯、自动扶梯、自定义运动路径等所有场景下均有效,
getXVelocity()、getYVelocity()返回的是引擎实时计算的行人实际运动速度,已经包含了设施带动的位移、路径转向带来的方向变化,无需额外做方向修正。不建议通过相邻仿真步的行人位置差自行计算速度,该方法会受步长波动影响产生计算误差,精度低于内置方法的返回结果。
内容的提问来源于stack exchange,提问作者ruby zou
相关产品推荐
相关产品推荐

