AnyLogic车辆避让行人模型报错:get_Main()方法未定义
解决AnyLogic中车辆识别行人的代码报错问题
问题背景
正在构建一个AnyLogic模型,模拟行人在非指定区域(非人行横道)横穿有车辆行驶的道路。当前模型里车辆无法识别行人,会直接穿过,希望实现车辆识别路径中的行人并停下避让。参考相关方案后,在Cars状态机的checkForPed转换块中,Action函数报错:The method get_Main() is undefined for the type Cars,尝试用main.pedestrian也无效,相关代码如下:
for (Pedestrian thisPed : get_Main().pedestrian) { // for each pedestrian in model double pedX = thisPed.getX() - getX(); double pedY = thisPed.getY() - getY(); if (fieldOfView.contains(pedX, pedY)) { pedInDanger = true; break; } }
解决方法
方法1:通过环境引用主模型
如果Cars是自定义代理类型(继承自Agent),需通过getEnvironment()获取主模型实例,再访问行人集合:
Main mainModel = (Main) getEnvironment(); for (Pedestrian thisPed : mainModel.pedestrian) { double pedX = thisPed.getX() - getX(); double pedY = thisPed.getY() - getY(); if (fieldOfView.contains(pedX, pedY)) { pedInDanger = true; break; } }
注意:将Main替换为你实际的主模型类名(若主模型不是默认命名)
方法2:检查行人集合的访问权限
确保主模型中的pedestrian集合是**公共(public)**的;若为私有集合,需在主模型中添加公共getter方法:
// 主模型中添加 public List<Pedestrian> getPedestrians() { return pedestrian; }
再在车辆代码中调用:
Main mainModel = (Main) getEnvironment(); for (Pedestrian thisPed : mainModel.getPedestrians()) { // 后续逻辑同上 }
方法3:静态引用(不推荐)
若行人集合是主模型中的公共静态集合,可直接通过类名访问,但会增加代码耦合度,仅作备选:
for (Pedestrian thisPed : Main.pedestrian) { // 后续逻辑同上 }
额外注意事项
- 确认
fieldOfView是车辆代理中正确定义的几何区域(如Polygon或Circle),用于检测视野内的行人。 - 状态机转换逻辑需配合
pedInDanger变量,检测到行人时触发车辆停车动作。
内容的提问来源于stack exchange,提问作者aemae
相关产品推荐
相关产品推荐

