应用开发接口(API)
我们为Pursuit自驾仪提供开源API开发支持,候选API接口将支持C++、Python等语言。详细信息将持续更新在此部分。请注意,我们假定用户已经熟悉ROS的基本概念,未满足此前提的用户建议先通过官方教程:http://wiki.ros.org/ROS/Tutorials。
Caution
我们官方支持的开发环境仅为Ubuntu 18.04和ROS Melodic。用户可以在其他主机环境中尝试使用Docker方法。
ROS API (C++)
Pursuit自动驾驶仪的ROS API在ROS包中实现,我们维护了以下几个包:
pursuit_driver (main 分支): 通过串行通信与自动驾驶仪接口的ROS包,仓库地址:https://gitee.com/cloudkernel-tech/pursuit_driver
pursuit_msgs (main 分支): 定制的Pursuit消息,仓库地址: https://gitee.com/cloudkernel-tech/pursuit_msgs
mavros (dev_pursuit_agv 分支):为Pursuit自动驾驶仪定制的mavros包,它是与自驾仪交互的另外一个包,只适合高级开发者使用,仓库地址: https://gitee.com/cloudkernel-tech/mavros
1. pursuit_driver包
(1) 订阅话题
以下话题仅用于产品发布,开发者不建议使用
/pursuit_outdoor_avoidance/trajectory/generated (mavros_msgs::Trajectory):
导航模块生成的轨迹,将被发送到Pursuit自动驾驶仪。
/pursuit_outdoor_avoidance/avoidance_status (pursuit_msgs::AvoidanceStatus):
使用机载激光扫描仪进行障碍物检测的避障状态
/pursuit_nav/smooth_cmd_vel (geometry_msgs::Twist):
导航模块生成的平滑速度命令,将被发送到Pursuit自动驾驶仪。
(2) 发布话题
~pursuit_driver/ackermann_drive_cmd ( ackermann_msgs::AckermannDriveStamped ):
由自动驾驶仪发送给VCU AGV底盘的驾驶命令,适用于阿克曼车辆。
~pursuit_driver/vehicle_gps_position ( mavros_msgs::GPSRAW):
车辆的GPS位置,这是机载RTK设备的输出。
~pursuit_driver/vehicle_local_pose ( geometry_msgs::PoseStamped):
车辆在定位准备完成且GPS锁定后,以东-北-上(ENU)坐标系中表达的本地位置和姿态。
~pursuit_driver/vehicle_local_velocity (geometry_msgs::TwistStamped):
在ENU坐标系中表达的车辆本地速度。
~pursuit_driver/trajectory/desired (mavros_msgs::Trajectory):
由自动驾驶仪请求的期望航点设定。
~pursuit_driver/vehicle_ctrl_state (pursuit_msgs::VehicleCtrlState):
自动驾驶仪定义的控制状态,包括解锁状态、导航状态等。
~pursuit_driver/vcu_base_status (pursuit_msgs::VcuBaseStatus):
地面车辆中VCU单元的状态。
~pursuit_driver/vcu_cmd_vel (geometry_msgs::Twist):
Pursuit自动驾驶仪发送给VCU单元的速度命令。
~pursuit_driver/vehicle_angular_velocity (std_msgs::Float32MultiArray):
在ENU坐标系中表达的车辆姿态角速率。
2. pursuit_msgs包
定制消息可以在 https://gitee.com/cloudkernel-tech/pursuit_msgs/tree/main/msg 查阅,它们的含义在定义中很容易理解。例如,下面是VcuBaseStatus消息的信息,它主要反映 无人车底盘的状态,包括转向角,前向速度,转向角速度等,根据不同车型有效状态是不同的
# Base type definitions
uint8 VCU_BASE_TYPE_UNDEFINED = 0
uint8 VCU_BASE_TYPE_ACKERMANN = 1
uint8 VCU_BASE_TYPE_DDRIVE_4WHEELS = 2
# Gear position definitions
uint8 VCU_GEAR_POSITION_UNDEFINED = 0 # undefined
uint8 VCU_GEAR_POSITION_P = 1 # pause/stop
uint8 VCU_GEAR_POSITION_R = 2 # recede
uint8 VCU_GEAR_POSITION_N = 3 # null
uint8 VCU_GEAR_POSITION_D = 4 # forward
# Operating mode definitions
uint8 VCU_OPERATING_MODE_AUTO = 0
uint8 VCU_OPERATING_MODE_REMOTE = 1
uint8 VCU_OPERATING_MODE_STOP = 2
std_msgs/Header header
uint8 vcu_base_type # vcu base type
uint8 gear_position # current gear position
float32 speed # current moving speed, unit: m/s, positive value only
bool steering_angle_valid # valid flag for steering angle
float32 steering_angle # steering angle in radians
bool twist_valid
float32[3] vel # velocity along body axes (m/s)
bool heading_rate_valid
float32 heading_rate # heading rate (rad/s)
uint8 operating_mode # current operating mode
3. mavros包
mavros 包源自 PX4 社区( http://wiki.ros.org/mavros )。我们为 Pursuit 自动驾驶仪添加了自定义消息。大多数消息都可以在官方的 mavros wiki 页面上查阅,这里列举我们常用的部分。
(1) 订阅话题
~mavros/setpoint_position/local (geometry_msgs/PoseStamped)
发送到自驾仪的ENU坐标系目标位置值(仅在 offboard 模式下启用)
~mavros/setpoint_velocity/cmd_vel (geometry_msgs::TwistStamped)
发送到自驾仪的ENU坐标系目标速度值(仅在 offboard 模式下启用)
~mavros/vcu_command_velocity/from_nav (geometry_msgs::Twist)
发送到自驾仪的体坐标系下的线速度和角速度命令 (仅在 offboard 模式下启用)
(2) 发布话题
~mavros/state (mavros_msgs/State)
自动驾驶仪的状态,包括解锁/上锁状态、模式、连接状态等。
~mavros/global_position/global (sensor_msgs/NavSatFix)
机器的 GPS 全球位置和卫星状态。
~mavros/local_position/pose ( geometry_msgs::PoseStamped):
当GPS 锁定后车辆定位准备就绪时,车辆在ENU坐标系下的位置和姿态。
~mavros/local_position/velocity (geometry_msgs/TwistStamped)
车辆ENU坐标系下的速度信息。
~mavros/imu/data_raw (sensor_msgs/Imu)
无方向的原始 IMU 数据,包括加速度计和陀螺仪数据。
~mavros/vcu_base_status/output (pursuit_msgs::VcuBaseStatus):
地面车辆中 VCU 底盘控制单元的状态。
~mavros/vcu_command_velocity/output (geometry_msgs::Twist):
自动驾驶仪发送到 VCU底盘控制单元的速度命令。
(3) 服务
~mavros/set_mode (mavros_msgs/SetMode)
设置自动驾驶仪的操作模式,包括在线控制模式、航路店模式和自稳手动模式。
~mavros/cmd/arming (mavros_msgs/CommandBool)
从机载计算机更改锁定状态,例如上锁/解锁切换。