|
|
18 hours ago | |
|---|---|---|
| README.md | 18 hours ago | |
| cyber_routing.py | 18 hours ago | |
| cyber_trafficlight.py | 18 hours ago | |
README.md
Apollo 外部命令控制脚本
两个用于 Apollo 9.0 仿真环境的 Python 控制脚本,支持手动控制红绿灯状态和发送车道跟随命令。
环境要求
- Apollo 9.0 Docker 环境(Cyber RT 已安装)
- Python 3.6+
- 已启动模块:Planning、Control、external_command_processor
脚本 1:红绿灯控制(cyber_trafficlight.py)
功能
向 /apollo/perception/traffic_light 话题发送红绿灯消息,手动切换红/绿灯状态,测试车辆启停响应。
配置
编辑脚本开头 SIGNAL_IDS 列表,确保 ID 与地图 base_map 中的 signal.id 完全一致:
SIGNAL_IDS = ["signal_123", "signal_456"]
使用
python cyber_trafficlight.py
交互操作:
1→ 红灯(车辆停车)2→ 绿灯(车辆通行)3→ 退出
脚本 2:车道跟随命令(cyber_routing.py)
功能
向 /apollo/external_command/lane_follow 服务发送起点→终点坐标,命令车辆自动沿车道行驶(heading 由 Apollo 自动匹配)。
使用
- 编辑脚本中的坐标:
start_x, start_y = parse_coordinate("(587107.23,4141578.02)") # 起点
end_x, end_y = parse_coordinate("(587010.55,4141603.85)") # 终点
- 运行脚本:
python cyber_routing.py
- 若响应
status=1(RUNNING),车辆即开始行驶。
常见问题速查
| 现象 | 可能原因 | 解决命令 |
|---|---|---|
| 红绿灯无响应 | ID 不匹配 / 话题错误 | 检查 SIGNAL_IDS 与地图一致;确认话题 /apollo/perception/traffic_light |
| 车道跟随返回 ERROR | 缺少 routing 拓扑图 | ./scripts/generate_routing_topo_graph.sh --map_dir /path/to/map |
| 坐标无效 | 起点/终点不在可行驶车道 | 用 Dreamview 或 query_position.py 验证坐标 |
| 服务无响应 | external_command_processor 未启动 | cyber_node list | grep external_command |
状态码说明
1→ RUNNING ✅ 执行中2→ FINISHED ✅ 已完成3→ ERROR ❌ 失败(查日志)
日志查看
# 规划决策日志(含红绿灯响应)
tail -f /apollo/data/log/planning.INFO
# 外部命令处理日志
tail -f /apollo/data/log/external_command.INFO
# 实时监听话题(调试用)
cyber_channel echo /apollo/perception/traffic_light
cyber_channel echo /apollo/external_command/lane_follow
目录结构
.
├── README.md
├── cyber_trafficlight.py
└── cyber_routing.py
base_map.bin 文件处理指南
在 Apollo 中,高精度地图通过 Protocol Buffers(protobuf)协议定义。base_map.bin 是二进制格式,文件小但不可读;base_map.txt 是文本格式,方便查看和调试,但文件较大。日常仿真使用 .bin 文件,而在需要手动修改地图数据(例如编辑红绿灯 ID)时,会用到下面介绍的格式转换命令。
格式转换命令
以下命令在 Apollo Docker 容器内执行。应使用地图实际目录,示例中的 /path/to/your/map/directory/ 路径请自行替换。
二进制(.bin) 转 文本(.txt)
protoc --decode=apollo.hdmap.Map /apollo/modules/map/proto/map.proto < /path/to/your/map/directory/base_map.bin > base_map.txt
执行后,可读的 base_map.txt 文件会保存在当前工作目录下。该命令常用于确认特定路口的 signal ID 或边界坐标。
文本(.txt) 转 二进制(.bin)
protoc --encode=apollo.hdmap.Map /apollo/modules/map/proto/map.proto < base_map.txt > /path/to/your/map/directory/base_map.bin
此命令将编辑后的 .txt 文件重新编码回 Apollo 可用的二进制格式。为确保新的 base_map.bin 文件能被 Dreamview 正确加载,强烈建议在替换后执行下一步,重新生成其他辅助地图文件。
重新生成 routing_map 和 sim_map
地图数据发生变化时,务必执行此步骤,以保证路由规划和可视化模块能同步更新。
# 生成 routing_map(路由模块用)
./scripts/generate_routing_topo_graph.sh --map_dir /path/to/your/map/directory/
# 生成 sim_map(DreamView 显示用)
bazel-bin/modules/map/tools/sim_map_generator --map_dir /path/to/your/map/directory/ --output_dir /path/to/your/map/directory/
编辑红绿灯 ID 的完整流程
当需要修改地图中某个红绿灯的 ID(例如从 "451089193" 改为 "14")时,完整操作流程如下:
- 解码:使用
base_map.bin转.txt命令将地图解码。 - 编辑:用文本编辑器打开
base_map.txt,找到信号灯signal部分,修改id字段的数值。signal { id { id: "14" # 修改此处ID } ... } - 编码:使用
.txt转base_map.bin命令将修改后的文件重新编码回二进制格式。 - 更新:用新生成的
base_map.bin替换原文件,并执行命令重新生成routing_map和sim_map。