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

typedef struct {
  double acc_x,acc_y,acc_z,groy_x,groy_y,groy_z;
  uint32_t time_stamp;
}imu;

2)图像数据

uint16_t width,height;
uint32_t time_stamp;
char data[width * height];

3)tof数据

深度图

uint16_t width,height;
uint32_t time_stamp;
uint16_t data[width * height];

幅度图

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)可见光内参

//内参结构体
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内参

//内参结构体
typedef struct{
    float acc_n;          // 加速度计噪声
    float acc_w;          // 加速度计随机游走
    float gyr_n;          // 陀螺仪噪声
    float gyr_w;          // 陀螺仪随机游走
} ImuParam;

3)tof内参

//内参结构体
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)系统算法状态

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.图像数据

Type: sensor_msgs::Image
Topic: /image_left     /image_right

ii.imu数据

Type: sensor_msgs::Imu
Topic:  /imu

iii.tof点云数据(需开启tof)

Type: sensor_msgs::PointCloud2
Topic: /tof_cloud
(x,y,z)

iiii.tof幅度图和深度图(需开启tof)

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:

Type: nav_msgs::Odometry
Topic: 
	/pr_loop/odometry_rect
	/pr_loop/odometry_adjusted #全局一致

​ pointcloud:

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.图像数据

Type: sensor_msgs::msg::Image
Topic: /image_left     /image_right

ii.imu数据

Type: sensor_msgs::msg::Imu
Topic:  /imu

iii.tof点云数据(需开启tof)

Type: sensor_msgs::msg::PointCloud2
Topic: /tof_cloud
(x,y,z)

iiii.tof幅度图和深度图(需开启tof)

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:

Type: nav_msgs::msg::Odometry
Topic: 
    /pr_loop/odometry
    /pr_loop/odometry_adjusted #全局一致

​ pointcloud:

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 系统状态