Unity ML-Agents无法连接求助:环境无响应、AI无输出
问题描述
- 基于Unity搭建ML-Agents训练场景:3面碰撞后重置Episode并给予负奖励的墙,1面碰撞后给予正奖励的终点线
- 编写车辆移动脚本(接收Vector2输入控制转向与进退)及Agent脚本,核心代码如下:
public override void CollectObservations(VectorSensor sensor) { sensor.AddObservation(transform.position); sensor.AddObservation(targetTransform.position); }public override void OnActionReceived(ActionBuffers actions) { stepCounter++; Debug.Log("Step: " + stepCounter); float moveX = actions.ContinuousActions[0]; float moveY = actions.ContinuousActions[1]; float distanceToGoal = Vector2.Distance(transform.position, targetTransform.position); Debug.Log("Distance to Goal: " + distanceToGoal); SetReward(-0.01f); if (distanceToGoal < goalThreshold) { SetReward(1.0f); EndEpisode(); Debug.Log("Goal Reached!"); } Debug.Log("Action Received: MoveX: " + moveX + ", MoveY: " + moveY); carController.SetInputVector(new Vector2(moveX, moveY)); } - 运行
mlagents-learn命令后,Unity游戏无响应,控制台仅显示1次Episode启动日志,无AI输入/输出日志;1-2分钟后CMD提示[WARNING] Restarting worker[0] after 'The Unity environment took too long to respond. - 行为配置:2个连续动作(控制转向、进退),观测空间大小设为6(对应车辆与目标的Vec3位置)
- 版本信息:Unity ML-Agents插件2.0.1,Python mlagents 0.30.0,Python 3.9.0,PyTorch 1.7.1;已解决numpy等依赖兼容性问题;设置maxstep后Unity每20ms重启Episode,问题未解决;在虚拟环境中运行训练命令
排查与解决方案
1. 版本兼容性修复
Unity ML-Agents插件2.0.1对应的Python mlagents版本应为0.29.0,版本不匹配会导致环境通信异常:
- 执行命令降级Python端mlagents:
pip install mlagents==0.29.0
2. 观测空间配置匹配
当前Agent脚本传递了2个Vec3(共6个值),但2D场景下冗余的Z轴信息可能引发配置不匹配:
- 修改
CollectObservations代码,仅传递Vector2位置:public override void CollectObservations(VectorSensor sensor) { sensor.AddObservation(new Vector2(transform.position.x, transform.position.y)); sensor.AddObservation(new Vector2(targetTransform.position.x, targetTransform.position.y)); } - 同步修改Behaviour组件的
Vector Observation->Space Size为4;确认Stacked Vectors设为0(未启用观测堆叠)
3. 修正Episode重置逻辑
设置maxstep后频繁重启Episode,说明碰撞触发逻辑存在误触发:
- 检查墙的碰撞脚本,确保仅在车辆碰撞时触发重置:
private void OnCollisionEnter2D(Collision2D other) { Agent agent = other.GetComponent<Agent>(); if (agent != null) { agent.SetReward(-1.0f); agent.EndEpisode(); } } - 验证
goalThreshold值合理性,避免初始距离小于阈值导致Episode直接结束
4. 规范训练启动流程
- 先运行
mlagents-learn命令(可指定配置文件:mlagents-learn config/ppo.yaml --run-id=car_train),等待命令行提示"Start training by pressing the Play button in the Unity Editor."后,再点击Unity播放按钮
5. 解决通信端口阻塞
ML-Agents默认使用5004端口,若被占用会导致超时:
- 运行训练命令时指定自定义端口:
mlagents-learn --port=5005,同时在Unity的Academy组件中设置相同端口号
6. 检查Agent组件配置
- 确认车辆对象的Agent组件中,
Behaviour Parameters的Action Space设为Continuous,Continuous Action Size设为2 - 确保场景中存在
Academy组件(缺失则手动添加) - 关闭Unity的
Auto Sync Transforms选项(路径:Edit -> Project Settings -> Physics 2D),减少性能开销避免超时
内容的提问来源于stack exchange,提问作者Abbadon
相关产品推荐
相关产品推荐

