# 卓越之星/智行 ROS 开发 API
卓越之星与智行系列均为ROS体系下产品,面向不同的硬件,提供了一系列的ROS API接口,方便用户进行二次开发。
在卓越之星,智行的ROS体系内,处理器分为搭载了ROS的AI处理器和嵌入式控制器,两者通过串口总线进行通信连接。
其中,激光雷达,摄像头,IMU(惯性测量单元),语音阵列,直接连接在AI处理器上,通过ROS话题发布数据。
直流电机,数字舵机,超声传感器,TOF传感器,碰撞传感器,直接连接在嵌入式控制器上,直流电机码盘计算出的轮式里程计数据和所有传感器数据一起通过串口发送给AI处理器。
不同的卓越之星构型与智行产品搭载的传感器设备,安装位置不同,底盘运动模型不同(双轮差分、三轮全向、四轮全向),因此需要启动不同的launch文件与硬件通信。
所有的启动文件都在系统的launch_ws工作空间的launch_center功能包内。
launch_center功能包管理着智行与卓越之星体系下的全部启动项,其launch文件夹如下所示:
其中,app是启动与安卓APP通信的节点管理,camera是启动摄像头节点管理,imu是启动IMU节点管理,laser是启动激光雷达节点管理,location是定位节点管理,navigation是启动导航节点管理,params是启动参数节点管理,tf是启动坐标变换节点管理,zoo是启动嵌入式控制器串口通信节点管理。
最后的bringup+产品(构型)名称,则是整体启动的管理。
启动相关的launch文件后,就可以通过相应的API来获取数据了。
常见的传感器与硬件相关的接口总表格如下所示:
传感/硬件 | 主题名称 | 类型 | 描述 |
---|---|---|---|
初始轮式里程计 | /wheel_odom | nav_msgs/Odometry | 轮式里程计信息,基于ROS右手坐标系,启动时刻为坐标原点。 |
融合轮式里程计 | /odom | nav_msgs/Odometry | 融合了IMU的里程计信息,基于ROS右手坐标系,启动时刻为坐标原点。 |
激光雷达 | /scan | sensor_msgs/LaserScan | 激光雷达原始消息 |
激光雷达滤波 | /scan_filtered | sensor_msgs/LaserScan | 激光雷达屏蔽支撑铜柱干扰角度后的消息 |
惯性测量单元 | /ros/imu | sensor_msgs/IMU | IMU消息,由三轴角速度,三轴线加速度,三轴姿态四元数组成,姿态偏航角初始角度0点为launch启动时方向,ROS右手坐标系 |
惯性测量单元 | /imu/data | sensor_msgs/IMU | IMU消息,由三轴角速度,三轴线加速度,三轴姿态四元数组成,姿态偏航角初始角度0点为launch启动时方向,ROS右手坐标系 |
摄像头 | /camera/color/image_raw | sensor_msgs/Image | 相机图像,BGR格式 |
深度视觉 | /camera/depth/image_raw | sensor_msgs/Image | 相机图像,Gray格式 |
深度点云 | /camera/depth/points | sensor_msgs/PointCloud2 | 深度相机点云 |
超声传感器 | /ul/sensor* | sensor_msgs/Range | 回传的超声波距离信息,最大支持四路 |
TOF传感器 | /us/tof* | sensor_msgs/Range | 回传的tof距离信息,最大支持四路,*代表传感器id |
碰撞传感器 | /robot/bump_sensor | std_msgs::Int16MultiArray | 碰撞传感器信息,最大支持四路,*代表传感器id |
运动速度控制 | /cmd_vel | geometry_msgs/Twist | 速度控制,linear的x,y控制线速度,angular的z控制自转角速度 |
射击模块控制 | /single_servo_topic | zoo_bringup/SingleServo | 射击模块为舵机控制,舵机id为11,-600位置扣下扳机,900位置填充子弹。 |
S5A机械臂控制 | /multiple_servo_topic | zoo_bringup/MultipleServo | 机械臂为舵机控制,从底部到末端,舵机id分别为1~6 。 |
轮式里程计为 /wheel_odom,其数据类型为 nav_msgs/Odometry,包含了机器人的位置、姿态、线速度、角速度等信息,是通过编码器计算得出的。
融合后的轮式里程计为 /odom,其数据类型为 nav_msgs/Odometry,包含了机器人的位置、姿态、线速度、角速度等信息,是通过编码器计算得出的,并基于EKF算法融合了IMU的数据。
激光雷达为 /scan,其数据类型为 sensor_msgs/LaserScan,包含了激光雷达的原始数据。
激光雷达滤波数据为 /scan_filtered,其数据类型为 sensor_msgs/LaserScan,包含了激光雷达的滤波数据,屏蔽了支撑铜柱的干扰角度等等。
IMU的原始数据为 /ros/imu,其数据类型为 sensor_msgs/IMU,包含了三轴角速度、三轴线加速度、三轴姿态四元数等信息。
IMU去零偏后数据为 /imu/data,其数据类型为 sensor_msgs/IMU,包含了三轴角速度、三轴线加速度、三轴姿态四元数等信息。
摄像头的图像数据为 /camera/color/image_raw,其数据类型为 sensor_msgs/Image,主要是彩色摄像头的图像数据,BGR格式。
深度视觉的图像数据为 /camera/depth/image_raw,其数据类型为 sensor_msgs/Image,主要是深度视觉的图像数据,是深度图。
目前只有W4A与W2C搭载了深度视觉。
深度点云数据为 /camera/depth/points,其数据类型为 sensor_msgs/PointCloud2,主要是深度视觉的点云数据。
目前只有W4A与W2C搭载了深度视觉。
超声传感器数据为 /ul/sensor*(*代表id),其数据类型为 sensor_msgs/Range,主要是超声波传感器的距离数据。
W2U 正前方有一路超声,id为1;
W2A 有三路超声,分别为左、中、右,id依次为1,2,3;
W2C 有三路超声,分别为左、中、右,id依次为1,2,3;
W3S 没有超声传感器。
W4A 有四路超声,分别为左,前,右,后,id依次为1,2,3,4;
TOF传感器数据为 /us/tof*,其数据类型为 sensor_msgs/Range,主要是TOF传感器的距离数据。
W2U 正前方有一路TOF,id为1;
W2A 有三路TOF,分别为左、中、右,id依次为1,2,3;
W2C 有三路TOF,分别为左、中、右,id依次为1,2,3;
W3S 没有TOF传感器。
W4A 有四路TOF,分别为左,前,右,后,id依次为1,2,3,4;
碰撞传感器数据为 /robot/bump_sensor,其数据类型为 std_msgs::Int16MultiArray,主要是碰撞传感器的触发信息,这是一个(0,1)数组,0代表未触发,1代表触发。
该数组内一共有四个元素,分别代表不同路数的碰撞传感器;
W2U 正前方有一路碰撞,在数组中的位置为0;
W2A 有三路碰撞,分别为左、中、右,在数组中的位置依次为0,1,2;
W2C 有两路碰撞,分别为左、右,在数组中的位置依次为0,1;
W3S 没有碰撞传感器。
W4A 有两路碰撞,分别为前,后,在数组中的位置依次为0,1;
运动速度控制为 /cmd_vel,其数据类型为 geometry_msgs/Twist,主要是控制机器人的运动速度,linear的x,y控制线速度,angular的z控制自转角速度。
射击模块控制为 /single_servo_topic,其数据类型为 zoo_bringup/SingleServo,主要是控制射击模块的舵机,舵机id为11,-600位置扣下扳机,900位置填充子弹。
此Topic也可以用于单个舵机的控制(舵机要先接在嵌入式控制器上,并配置好id),要运行的角度为Target_position_Angle这个变量,是要运行的角度的10倍。
目前W3S有射击模块。
S5A机械臂控制为 /multi_servo_topic,其数据类型为 zoo_bringup/MultipleServo,主要是控制S5A机械臂的舵机,舵机id如下所示。
MultipleServo其实就是多个SingleServo的组合,其内部单个SingleServo的定义与上文一致。