AGV脚本管理
AGVScriptManager(在脚本中通过 agvManager 访问)负责调度单车 AGV 的所有基础行为:路径行驶、装货/卸货、返回、状态检查等。下面列出最常用方法与实践原则。
核心方法
runAGV
runAGV(
carrierName: string,
carrierType: string,
waypoints: string[],
carryItem: string,
carryEndPoint?: string,
sourceItem?: string
): Promise<{ success: boolean; error?: Error | string }>;
- 用途:一次性执行“到达 → 装载 → 运输 → 卸载 → 返回”全流程。
- 参数建议:
carrierType需与场景中配置一致,常见值如"AGV"、"AGF"。carryEndPoint通常为路径中的终点别名,若不传将使用waypoints最后一个点。- 当货物需相对其他参考对象卸载时设置
sourceItem。
- 错误处理:
success === false时,error会给出具体原因(如路径不可达、载荷不存在)。
moveCarrier
moveCarrier(
carrierName: string,
waypoints: string[],
isLookAt = true
): Promise<{ success: boolean; error?: Error | string }>;
- 用途:仅驱动车辆沿指定路径行驶,不做装卸操作。
- 技巧:
- 对长路径可
await每一段,方便在节点间插入逻辑。 isLookAt = false时可保持车辆原朝向,用于倒车或视觉演示。
- 对长路径可
moveBackCarrier
moveBackCarrier(carrierName, waypoints) 将车辆按原路径逆向返回。通常配合 moveCarrier 或 runAGV 使用,用于补充“复位”动作。
装卸相关
pickupItem(carrierName, itemName, attachPos?, attachRot?)attachPos缺省{x: 0, y: 0.5, z: 0},用于轻微调整货物相对位置。attachRot以角度表示,常用于保持货物朝向一致。
dropItem(itemName, targetPoint, sourceItem?, offsetPos?)targetPoint可为停靠点或缓存位。sourceItem指定卸载时挂靠的对象,例如料箱或工位。
setPosItem(itemName, targetPoint, offsetPos?)- 常用于初始化,让货物到正确位置或恢复场景状态。
推荐流程模板
async function transportOnce({carrier, type, load, path}) {
const enterPoint = path[0];
const leavePoint = path[path.length - 1];
const startResult = await agvManager.moveCarrier(carrier, [enterPoint]);
if (!startResult.success) throw new Error(`无法驶入装货点: ${startResult.error}`);
const pickupResult = agvManager.pickupItem(carrier, load, {y: 0.45});
if (!pickupResult.success) throw new Error(`装货失败: ${pickupResult.error}`);
const runResult = await agvManager.moveCarrier(carrier, path.slice(1));
if (!runResult.success) throw new Error(`运输失败: ${runResult.error}`);
agvManager.dropItem(load, leavePoint);
await agvManager.moveBackCarrier(carrier, path.slice().reverse());
}
调试与排查
- 路径校验:在运行前调用
console.table(path)检查点位名称;若返回error: "node not found",说明场景中不存在该点。 - 载荷占用:同一个
itemName不应同时被多个 AGV 装载,可在装货前调用editor.getByName(itemName)查看当前挂载父节点。 - 并发执行:对同一车辆并行执行多个
moveCarrier会导致冲突,建议为每辆车维护执行队列。
常见问题
- 车辆卡在路径上:确认路径点是否在地面上方、是否有障碍碰撞。必要时在场景中重新生成路径或提高路径点的高度。
- 卸货位置偏差:调整
offsetPos,或检查卸货点的本地坐标系统是否与预期一致。 - 返回流程触发过早:将
moveBackCarrier放在dropItem之后,并在dropItem执行后await一小段延迟(例如await editor.sleep(250))确保动作完成。
结合 agvBoxManager 与 agvCurePathManager 可进一步实现拖挂编队与曲线拖拽,详见对应章节。