Apollo Cyber 接入示例¶
注意
示例目录:[SimOne 安装目录]\SimOneAPI\Cyber
关于 SimOneAPI 直接调用层(
InitSimOneAPI/GetGps/SetDrive等),请参阅 技术架构。
接入方式¶
SimOne 提供两种 Apollo 接入方式:
方式一:ApolloCybertronBridge 接入
通过桥接程序 TransNodeCyber 在 SimOne 与 Apollo 之间建立通信,无需修改 Apollo 内部代码。
方式二:Apollo API 直接接入
直接调用 SimOneAPI 获取数据,自行实现数据转发逻辑。
编译¶
需在 Apollo Docker 容器内编译:
# 1. 设置库路径(替换为实际 lib 目录路径)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<SimOneAPI lib 路径>
# 2. 执行编译脚本
cd [SimOne 安装目录]\SimOneAPI\Cyber
./gen_make_release.sh
编译成功后,可执行文件生成在 run/ 目录下,名称为 TransNodeCyber。
配置¶
运行前需编辑同目录下的 config.ini:
[BridgeIO]
BridgeIO_IP = 127.0.0.1 # SimOne BridgeIO 服务 IP
[HostVehicle]
Vehicle_ID = 0 # 主车 ID(与 SimOne 中配置一致)
[Sensor]
ENABLED = 0 # 是否启用物理传感器数据(Camera/Lidar),1 = 启用
IMG_IP = 127.0.0.1 # Camera UDP 服务 IP
IMG_PORT = 0 # Camera UDP 端口
PCD_IP = 127.0.0.1 # Lidar UDP 服务 IP
PCD_PORT = 0 # Lidar UDP 数据端口
PCD_PORT_INFO = 0 # Lidar UDP 信息端口
PCD_FRAMEID = velodyne128 # 点云 frame_id(与 Apollo 地图配置一致)
PCD_CHANNEL = /apollo/sensor/lidar128/compensator/PointCloud2 # 点云发布 channel(可按需修改)
运行流程¶
main()
├── config_ini() 读取 config.ini
└── run()
├── init() 初始化 SimOneAPI + 设置传感器参数
├── pub_thread 每 16 ms 发布数据到 Apollo ──────────────────┐
│ ├── Chassis / IMU(底盘状态、惯性数据) │
│ ├── GPS / INS Stat(位姿、速度、INS 状态) │
│ ├── Obstacles(障碍物真值) │ 异步回调
│ ├── TrafficLight(交通灯状态) │ Image / PointCloud
│ ├── ContiRadar(毫米波雷达目标) │
│ └── RoutingReq(全局规划路径点,每 32 ms)────────────────┘
└── rcv_thread 每 16 ms 接收 Apollo 控制指令
├── Control(油门/刹车/转向)→ SetDrive
└── Trajectory(规划轨迹点)→ SetDriveTrajectory
通信接口¶
Apollo SimOne 仿真通信接口:
| 模块 | 接口功能 | 数据传输方向 | 通信通道 Message Channel | 消息结构文件 Proto Message Structure |
|---|---|---|---|---|
| Control | 纵向控制(油门/刹车/转向) | Apollo → SimOne | /apollo/control | apollo/modules/control/proto/control_cmd.proto |
| Planning | 导航请求(全局规划路径点) | SimOne → Apollo | /apollo/routing_request | apollo/modules/routing/proto/routing.proto |
| 导航反馈 | Apollo → SimOne | /apollo/routing_response | apollo/modules/routing/proto/routing.proto | |
| 规划轨迹 | Apollo → SimOne | /apollo/planning | apollo/modules/planning/proto/planning.proto | |
| Canbus | 底盘消息(主车底盘状态) | SimOne → Apollo | /apollo/canbus/chassis | apollo/modules/canbus/proto/chassis.proto |
| Localization | IMU(角速度、加速度) | SimOne → Apollo | /apollo/sensor/gnss/corrected_imu | apollo/modules/localization/proto/imu.proto |
| GPS(车辆位姿、速度) | SimOne → Apollo | /apollo/sensor/gnss/odometry | apollo/modules/localization/proto/gps.proto | |
| Driver | INS 状态 | SimOne → Apollo | /apollo/sensor/gnss/ins_stat | apollo/modules/drivers/gnss/proto/ins.proto |
| Perception | 障碍物感知(真值) | SimOne → Apollo | /apollo/perception/obstacles | apollo/modules/perception/proto/perception_obstacle.proto |
| 交通灯感知 | SimOne → Apollo | /apollo/perception/traffic_light | apollo/modules/perception/proto/traffic_light_detection.proto | |
| 毫米波雷达(Continental) | SimOne → Apollo | /apollo/sensor/conti_radar | apollo/modules/drivers/proto/conti_radar.proto | |
| Sensor | 激光雷达点云 | SimOne → Apollo | /apollo/sensor/lidar128/compensator/PointCloud2 (可通过 PCD_CHANNEL 配置) |
sensor_msgs/PointCloud2 |
| 摄像头图像 | SimOne → Apollo | /apollo/sensor/camera/... | sensor_msgs/Image |
数据转换说明¶
注意
桥接程序在转发数据时包含以下坐标系转换和枚举映射,自行实现时需保持一致。
1. GPS 朝向(oriZ)坐标系偏移
SimOne 使用 OpenDRIVE 坐标系,Apollo 使用 ENU 坐标系,两者航向角相差 90°:
// SimOne oriZ → Apollo 四元数(偏移 π/2)
cybertron::quat q(cybertron::vec3(oriX, oriY, oriZ - (M_PI / 2)));
2. 障碍物类型映射
| SimOne 类型 | Apollo proto type | 说明 |
|---|---|---|
| Truck / Bus / SpecialVehicle | 5 | VEHICLE |
| Pedestrian | 3 | PEDESTRIAN |
| Bicycle | 4 | BICYCLE |
| 其他 | 0 | UNKNOWN |
3. 交通灯颜色映射
| SimOne 状态 | Apollo color 值 | 说明 |
|---|---|---|
| Red | 1 | 红灯 |
| Yellow | 2 | 黄灯 |
| Green | 3 | 绿灯 |
| Black | 4 | 灯灭 |
| 未知 | 0 | UNKNOWN |
4. 控制指令缩放
Apollo 控制量为百分比(0–100),转发至 SimOneAPI 时需缩放:
pData->throttle = mCyberControl.mThrottle * 0.01; // 百分比 → [0, 1]
pData->brake = mCyberControl.mBrake * 0.01;
pData->steering = -mCyberControl.mSteering * 0.01; // 方向取反(坐标系差异)

