AnyLogic中基于状态图实现机器人与工人避撞减速的代码求助
实现工作场所机器人遇工人自动减速的状态机监测逻辑(AnyLogic)
核心逻辑说明
由于无法使用Transporter和Pedestrian模块,我们直接基于Agent距离检测+状态机(Statechart)实现持续监测:通过机器人的Statechart持续扫描周围工人,当工人进入预设安全距离时切换低速,离开后恢复正常速度。
前置准备
给机器人Agent添加以下属性(在Agent的"Properties"面板或代码区定义):
double normalSpeed = 1.0;// 正常行驶速度,可按需调整double slowSpeed = 0.3;// 减速后的速度double currentSpeed = normalSpeed;// 当前运行速度double safetyDistance = 2.0;// 触发减速的安全距离
确保工人和机器人是自定义的Agent类(比如
Worker和Robot),且都被添加到同一模型环境中(保证距离检测能生效)。
状态机代码实现
在机器人的Statechart中,创建一个持续运行的状态(例如命名为"正常行驶"),在该状态的during事件中添加以下检测逻辑(during事件会在每个时间步自动触发,实现持续监测):
方案1:检测所有进入安全区的工人
适合需要同时响应多个工人的场景:
// 筛选出所有在安全距离内的工人 List<Worker> nearbyWorkers = findAll(Worker.class, worker -> distanceTo(worker) < safetyDistance); if (!nearbyWorkers.isEmpty()) { // 存在工人,切换低速(避免重复赋值) if (currentSpeed != slowSpeed) { currentSpeed = slowSpeed; // traceln("Robot " + getIndex() + " slowed down - worker detected"); } } else { // 无工人,恢复正常速度 if (currentSpeed != normalSpeed) { currentSpeed = normalSpeed; // traceln("Robot " + getIndex() + " resumed normal speed"); } } // --- 替换为你的机器人移动逻辑 --- // 示例:沿X轴移动的简单实现 // setX(getX() + currentSpeed * timeStep()); // 若机器人沿路径移动,需修改路径移动的速度参数为currentSpeed
方案2:仅检测最近的工人(性能更优)
如果只需响应最近的工人,用getNearestAgent减少计算量:
Worker nearestWorker = getNearestAgent(Worker.class); // 检查最近工人是否存在且进入安全距离 if (nearestWorker != null && distanceTo(nearestWorker) < safetyDistance) { currentSpeed = slowSpeed; } else { currentSpeed = normalSpeed; } // --- 绑定移动逻辑(同方案1)---
关键细节提示
- 距离计算:默认
distanceTo()是欧几里得距离,若需自定义检测范围(比如仅水平方向),可替换为曼哈顿距离:Math.abs(getX() - worker.getX()) + Math.abs(getY() - worker.getY()) < safetyDistance - 动态Agent适配:Resource Pool生成的Agent会自动加入模型环境,
findAll和getNearestAgent能自动识别,无需额外配置 - 移动逻辑绑定:务必确保机器人的移动代码使用
currentSpeed变量,否则速度变化无法体现
内容的提问来源于stack exchange,提问作者Jahidul Hasan Razib
相关产品推荐
相关产品推荐

