跳转至

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;  // 方向取反(坐标系差异)