# SDK数据定义 设备上电会开启一个服务器,通过http协议进行参数读写及流数据获取,也可以通过ros主从机通信来控制以及获取数据和设备状态。 ## 1.设置和操作 ### (1)设置设备ip ​ 设置后重启生效 ### (2)tof开关 ON/OFF ​ 通过通信协议中的smart参数设置 默认:OFF ### (3)补光灯开关 ON/OFF ​ 通过通信协议中的smart参数设置 默认:OFF ### (4)raw\_data输出设置 ​ 通过通信协议中的smart参数设置 图像:0/1/2/3 (注:0:无图像通过流数据输出;1:左目;2:右目;3:双目图像通过流数据输出) imu:ON/OFF tof深度图:ON/OFF tof幅度图:ON/OFF 默认:OFF ROS控制需要发送下面的话题,话题数据是自定义的,详情参考配套demo中的msg ``` Type: system_ctrl::viobot_ctrl Topic: /system_ctrl ``` ### (5)VIO算法 启停:ON/OFF 重启:restart 重置:reset 重定位: relocation ROS控制需要发送下面的话题,话题数据是自定义的,详情参考配套demo中的msg ``` Type: system_ctrl::algo_ctrl Topic: /stereo1_ctrl /stereo2_ctrl /mono_ctrl ``` ## 2.数据输出 ### SDK输出: ### (1)raw\_data 注:需设置raw_data输出 #### 1)imu ```c typedef struct { double acc_x,acc_y,acc_z,groy_x,groy_y,groy_z; uint32_t time_stamp; }imu; ``` #### 2)图像数据 ```c uint16_t width,height; uint32_t time_stamp; char data[width * height]; ``` #### 3)tof数据 深度图 ```c uint16_t width,height; uint32_t time_stamp; uint16_t data[width * height]; ``` 幅度图 ```c uint16_t width,height; uint32_t time_stamp; uint16_t data[width * height]; ``` ### (2)算法数据 ​ 注:启动算法后才会输出 ##### 1)位姿 ​ 7个float数据——位置x,y,z+四元数x,y,z,w。通过流获取,详见3.(11) ##### 2)速度 ​ 3个double数据——x,y,z。通过流获取,详见3.(11) ##### 3)点云 ​ x,y,z 通过流获取,详见3.(11) ### (3)参数数据 按需获取的数据,单次响应 #### 1)可见光内参 ```c //内参结构体 typedef struct{ float focal_length_x; // 焦距长度x (像素) float focal_length_y; // 焦距长度y (像素) float optical_center_point_x; // 光心投影坐标x(像素y) float optical_center_point_y; // 光心投影坐标y(像素) float radia_distortion_coef_k1; // radtan相机畸变模型畸变系数k1 float radia_distortion_coef_k2; // radtan相机畸变模型畸变系数k2 float radia_distortion_coef_k3; // radtan相机畸变模型畸变系数k3 float tangential_distortion_p1; // radtan相机畸变模型畸变系数p1 float tangential_distortion_p2; // radtan相机畸变模型畸变系数p2 } LensPara; ``` #### 2)IMU内参 ```c //内参结构体 typedef struct{ float acc_n; // 加速度计噪声 float acc_w; // 加速度计随机游走 float gyr_n; // 陀螺仪噪声 float gyr_w; // 陀螺仪随机游走 } ImuParam; ``` #### 3)tof内参 ```c //内参结构体 typedef struct{ float focal_length_x; // 焦距长度x (像素) float focal_length_y; // 焦距长度y (像素) float optical_center_point_x; // 光心投影坐标x(像素y) float optical_center_point_y; // 光心投影坐标y(像素) float radia_distortion_coef_k1; // radtan相机畸变模型畸变系数k1 float radia_distortion_coef_k2; // radtan相机畸变模型畸变系数k2 float radia_distortion_coef_k3; // radtan相机畸变模型畸变系数k3 float tangential_distortion_p1; // radtan相机畸变模型畸变系数p1 float tangential_distortion_p2; // radtan相机畸变模型畸变系数p2 } LensPara; ``` #### 4)外参 ​ 3行4列变换矩阵 12个float数据 ​ CamToImu ​ TofToCam0 ### (4)系统算法状态 ```c typedef enum{ ready = 0, stereo1_initializing, stereo1_running, stereo2_initializing, stereo2_running, mono_initializing, mono_running, }system_status; ``` 单个字节,上电连接后默认为ready,给设备发送了启动指后会进入初始化状态(initializing),初始化完成进入运行状态(running) 注:默认可以通过ros获取数据 ### ROS话题: #### (1)raw_data i.图像数据 ```c Type: sensor_msgs::Image Topic: /image_left /image_right ``` ii.imu数据 ```c Type: sensor_msgs::Imu Topic: /imu ``` iii.tof点云数据(需开启tof) ```c Type: sensor_msgs::PointCloud2 Topic: /tof_cloud (x,y,z) ``` iiii.tof幅度图和深度图(需开启tof) ```c Type: sensor_msgs::Image Topic: /amp_image /depth_image ``` iiiii.系统状态 ``` #此项为自定义的ros msg,可以在SDK例程里面找到 Type: system_ctrl::viobot_ctrl Topic: /sys_status ``` iiiiii.算法状态 ``` #此项为自定义的ros msg,可以在SDK例程里面找到,具体状态见(4)系统算法状态 Type: system_ctrl::algo_staus Topic: /algo_status ``` iiiiii.相机参数 ``` Type: sensor_msgs::CameraInfo Topic: /camera_left_info /camera_right_info ``` #### (2)算法输出 i.stereo2 ​ pose + twist: ```bash Type: nav_msgs::Odometry Topic: /pr_loop/odometry_rect /pr_loop/odometry_adjusted #全局一致 ``` ​ pointcloud: ```bash Type: sensor_msgs::PointCloud2 Topic: /pr_loop/points #原生点云(融合的) /pr_loop/points_rdf #RDF点云(融合的) /pr_loop/points_adjusted #这个是全局一致性 ``` ii.stereo1 ​ pose: ``` Type: nav_msgs::Odometry Topic: /pr_loop/odometry_rect ``` iii.mono1 ​ pose: ``` Type: nav_msgs::Odometry Topic: /mono1_loop/loop_pose ``` #### (3)参数数据 双目内参: ``` Type:sensor_msgs::CameraInfo Topic: /camera_left_info /camera_right_info ``` ### ROS2话题: 此部分对应ROS2版本 #### (1)raw_data i.图像数据 ```c Type: sensor_msgs::msg::Image Topic: /image_left /image_right ``` ii.imu数据 ```c Type: sensor_msgs::msg::Imu Topic: /imu ``` iii.tof点云数据(需开启tof) ```c Type: sensor_msgs::msg::PointCloud2 Topic: /tof_cloud (x,y,z) ``` iiii.tof幅度图和深度图(需开启tof) ```c Type: sensor_msgs::msg::Image Topic: /amp_image /depth_image ``` iiiii.系统状态 ``` #此项为自定义的ros msg,可以在SDK例程里面找到 Type: system_ctrl::msg::ViobotCtrl Topic: /sys_status ``` iiiiii.算法状态 ``` #此项为自定义的ros msg,可以在SDK例程里面找到,具体状态见(4)系统算法状态 Type: system_ctrl::msg::AlgoStatus Topic: /algo_status ``` iiiiii.相机参数 ``` Type: sensor_msgs::msg::CameraInfo Topic: /camera_left_info /camera_right_info ``` #### (2)算法输出 i.stereo2 ​ pose + twist: ```bash Type: nav_msgs::msg::Odometry Topic: /pr_loop/odometry /pr_loop/odometry_adjusted #全局一致 ``` ​ pointcloud: ```bash Type: sensor_msgs::msg::PointCloud2 Topic: /pr_loop/points #原生点云(融合的) /pr_loop/points_rdf #RDF点云(融合的) /pr_loop/points_adjusted #这个是全局一致性 ``` ii.stereo1 ​ pose: ``` Type: nav_msgs::msg::Odometry Topic: /pr_loop/odometry_rect ``` iii.mono1 ​ pose: ``` Type: nav_msgs::msg::Odometry Topic: /mono1_loop/loop_pose ``` #### (3)参数数据 双目内参: ``` Type:sensor_pub::msg::ImageInfo Topic: /camera_left_info /camera_right_info ``` ## 3.通信协议 【***\*协议说明\****】HTTP协议主要用于参数读写及流数据获取,默认端口8000 【***\*接口说明\****】 ### (1)网络参数 | ***\*URL\**** | http://< ip >:< port >/System/network | | ---------------- | ------------------------------------------------------------ | | ***\*METHOD\**** | GET/PUT | | ***\*BODY\**** | {
"ipaddr":"192.168.1.100",
"submask":"192.168.0.1.0",
"gateway":"192.168.1.1",
"macaddr":"FF:FF:FF:FF:FF:FF",
"commandPort":8000,
"heartbeatPort":6789,
"udpPort":10000
} | BODY参数定义: | ipaddr | IP地址 | | ------------- | -------- | | submask | 子网掩码 | | gateway | 网关地址 | | macaddr | MAC地址 | | commandPort | 指令端口 | | heartbeatPort | 心跳端口 | | udpPort | UDP端口 | ### (2)镜头参数 | ***\*URL\**** | http://< ip >:< port >/Config/lens?Camera=< param > | | :----------------------------------------------------------- | ------------------------------------------------------------ | | URL参数:
Camera=1:左目可见光
Camera=2:右目可见光
Camera=3:TOF | | | ***\*METHOD\**** | GET | | ***\*BODY\**** | {
"focal_length_x":0,
"focal_length_y":0,
"optical_center_point_x":0,
"optical_center_point_y":0,
"radia_distortion_coef_k1":0,
"radia_distortion_coef_k2":0,
"radia_distortion_coef_k3":0,
"tangential_distortion_p1":0,
"tangential_distortion_p2":0
} | | 注: | 单目版本只有1和3,双目无TOF版本只有1和2 | BODY参数定义:(float) | focal_length_x | 焦距长度x (像素) | | ------------------------ | ---------------------------- | | focal_length_y | 焦距长度y (像素) | | optical_center_point_x | 光心投影坐标x | | optical_center_point_y | 光心投影坐标y | | radia_distortion_coef_k1 | radtan相机畸变模型畸变系数k1 | | radia_distortion_coef_k2 | radtan相机畸变模型畸变系数k2 | | radia_distortion_coef_k3 | radtan相机畸变模型畸变系数k3 | | tangential_distortion_p1 | radtan相机畸变模型畸变系数p1 | | tangential_distortion_p2 | radtan相机畸变模型畸变系数p2 | ### (3)IMU内参 | ***\*URL\**** | http://< ip >:< port >/Config/imuInter | | ---------------- | ------------------------------------------------------------ | | ***\*METHOD\**** | GET | | ***\*BODY\**** | {
"acc_n":0,
"acc_w":0,
"gyr_n":0,
"gyr_w":0
} | BODY参数定义:(float) | acc_n | 加速度计噪声 | | ----- | ---------------- | | acc_w | 加速度计随机游走 | | gyr_n | 陀螺仪噪声 | | gyr_w | 陀螺仪随机游走 | ### (4)smart参数 | ***\*URL\**** | http://< ip >:< port >/Config/smart | | ---------------- | ------------------------------------------------------------ | | ***\*METHOD\**** | GET/PUT | | ***\*BODY\**** | {
"gray_image_enable": 0,
"imu_enable": 0,
"tof_enable": 0,
"tof_deep_image_enable": 0,
"tof_amp_image_enable": 0
"light": 0
} | | | | BODY参数定义: | gray_image_enable | 灰度图启用:3 / 2 / 1 / 0 | | --------------------- | ------------------------- | | imu_enable | Imu启用:1/0 | | tof_enable | Tof启用:1/0 | | tof_deep_image_enable | Tof深度图启用:1/0 | | tof_amp_image_enable | Tof幅度图启用:1/0 | | light | 补光灯开关:1/0 | 注:灰度图启用: ​ 0:不启用流获取灰度图 ​ 1:启用流获取左目灰度图(单目) ​ 2:启用流获取右目灰度图 ​ 3:启用流获取双目灰度图 ### (5)重定位 | ***\*URL\**** | http://< ip >:< port >/Smart/relocation | | ---------------- | --------------------------------------- | | ***\*METHOD\**** | PUT | | ***\*BODY\**** | [0,0,0,0,0,0,0,0,0,0,0,0] | BODY参数定义:一个3行4列的位姿变换矩阵,由12个浮点数组成的数组,每4个值表示矩阵的一行 ### (6)Vio算法控制 #### 1)Vio算法启用 | ***\*URL\**** | http://< ip >:< port >/Algorithm/enable/"algo_tyep_num" | | ---------------- | ---------------------------------------------------------- | | ***\*METHOD\**** | PUT | | ***\*BODY\**** | 无 | | 注: | "algo_tyep_num":
1:stereo1
2.stereo2
3.mono | #### 2)Vio算法禁用 | ***\*URL\**** | http://< ip >:< port >/Algorithm/disable/"algo_tyep_num" | | ---------------- | ---------------------------------------------------------- | | ***\*METHOD\**** | PUT | | ***\*BODY\**** | 无 | | 注: | "algo_tyep_num":
1:stereo1
2.stereo2
3.mono | #### 3)Vio算法重启 | ***\*URL\**** | http://< ip >:< port >/Algorithm/reboot/"algo_tyep_num" | | ---------------- | ---------------------------------------------------------- | | ***\*METHOD\**** | PUT | | ***\*BODY\**** | 无 | | 注: | "algo_tyep_num":
1:stereo1
2.stereo2
3.mono | #### 4)Vio算法重置 | ***\*URL\**** | http://< ip >:< port >/Algorithm/reset/"algo_tyep_num" | | ---------------- | ---------------------------------------------------------- | | ***\*METHOD\**** | PUT | | ***\*BODY\**** | 无 | | 注: | "algo_tyep_num":
1:stereo1
2.stereo2
3.mono | ### (7)回环添加关键帧 | ***\*URL\**** | http://< ip >:< port >/Smart/addKeyFrame | | ---------------- | ---------------------------------------- | | ***\*METHOD\**** | PUT | | ***\*BODY\**** | 无 | ### (8)回环保存关键帧 | ***\*URL\**** | http://< ip >:< port >/Smart/saveKeyFrame | | ---------------- | ----------------------------------------- | | ***\*METHOD\**** | PUT | | ***\*BODY\**** | 无 | ### (9)cam2imu参数 | ***\*URL\**** | http://< ip >:< port >/Config/cam2imu | | ---------------- | ------------------------------------- | | ***\*METHOD\**** | GET | | ***\*BODY\**** | [0,0,0,0, 0,0,0,0, 0,0,0,0] | BODY参数定义:一个3行4列的变换矩阵,由12个浮点数组成的数组,每4个值表示矩阵的一行 ### (10)tof2cam参数 | ***\*URL\**** | http://< ip >:< port >/Config/tof2cam | | ---------------- | ------------------------------------- | | ***\*METHOD\**** | GET | | ***\*BODY\**** | [0,0,0,0, 0,0,0,0, 0,0,0,0] | BODY参数定义:一个3行4列的变换矩阵,由12个浮点数组成的数组,每4个值表示矩阵的一行 ### (11)获取数据流 | ***\*URL\**** | http://< ip >:< port >/Stream?Channel=< chan > | | ---------------- | ------------------------------------------------------------ | | | chan:数据流通道号
通道1:imu + stereo1位姿 + stereo2位姿 + 速度 + 补光灯实时状态 + TOF实时状态 + 系统状态
通道2:左目可见光灰度图
通道3:深度图 + 幅度图
通道4:算法输出点云
通道5:tof点云
通道6:右目可见光灰度图
通道7:全局一致点云
通道8:RDF点云+位姿
| | ***\*METHOD\**** | GET | | ***\*BODY\**** | 无 | | 注: | 单目版本可见光图为通道2:左目可见光,位姿为stereo1位姿 | 数据包=帧头+帧数据; 帧头=0x33cccc33+帧类型(uint)+时间戳(uint)+序列号(uint)+宽(uint)+高(uint)+长度(uint); 服务端收到数据流请求后开始发送连续数据包。 当服务端收到Bye,则停止发送数据流,并断开连接。 | 帧类型编号 | 帧类型 | | :--------: | :--------------: | | 1 | IMU | | 2 | 左目可见光灰度图 | | 10 | 右目可见光灰度图 | | 3 | 深度图 | | 4 | 幅度图 | | 9 | tof点云 | | 16 | TOF实时状态 | | 17 | 补光灯实时状态 | | 7 | stereo2算法点云 | | 15 | RDF点云 | | 14 | RDF位姿 | | 11 | 全局一致位姿 | | 12 | 全局一致点云 | | 13 | 设备速度 | | | | | 5 | 算法位姿 | | 6 | 回环位姿 | | 8 | 系统状态 |