LiDAR 服务接口
获取 LiDAR 数据
C++接口
LiDAR(mid_360)
c++接口:通过livox_sdk2提供的c++接口,可以实现对雷达ip配置、雷达工作模式配置、获得雷达点云数据、获取自带的imu数据。
参数livox官方代码参数,提供了相应源码和动态(静态)库
| 功能 | C++ | 接口函数 |
|---|---|---|
| 设置雷达IP | ✔ | SetLivoxLidarIp |
| 设置雷达工作模式 | ✔ | SetLivoxLidarWorkMode |
| 获取雷达点云数据 | ✔ | SetLivoxLidarPointCloudCallBack |
| 获取imu数据 | ✔ | SetLivoxLidarImuDataCallback |
livox_status SetLivoxLidarIp(uint32_t handle, LivoxLidarIpInfo* ip_config, LivoxLidarAsyncControlCallback cb, void* client_data)
功能说明
设置雷达IP信息。
参数说明
| 参数名 | 类型 | 必填/默认值 | 说明 |
|---|---|---|---|
handle | uint32_t | 必填 | 设备句柄。 |
ip_config | LivoxLidarIpInfo* | 必填 | 雷达IP配置信息。 |
cb | LivoxLidarAsyncControlCallback | 必填 | 命令回调函数。 |
client_data | void* | 可选 | 用户数据。 |
返回值
| 类型 | 说明 |
|---|---|
livox_status | 成功返回 kStatusSuccess,其他错误码参考 LivoxStatus。 |
livox_status SetLivoxLidarWorkMode(uint32_t handle, LivoxLidarWorkMode work_mode, LivoxLidarAsyncControlCallback cb, void* client_data)
功能说明
设置雷达工作模式。
参数说明
| 参数名 | 类型 | 必填/默认值 | 说明 |
|---|---|---|---|
handle | uint32_t | 必填 | 设备句柄。 |
work_mode | LivoxLidarWorkMode | 必填 | 雷达工作模式。 |
cb | LivoxLidarAsyncControlCallback | 必填 | 命令回调函数。 |
client_data | void* | 可选 | 用户数据。 |
返回值
| 类型 | 说明 |
|---|---|
livox_status | 成功返回 kStatusSuccess,其他错误码参考 LivoxStatus。 |
void SetLivoxLidarPointCloudCallBack(LivoxLidarPointCloudCallBack cb, void* client_data)
功能说明
设置接收点云数据的回调函数。
参数说明
| 参数名 | 类型 | 必填/默认值 | 说明 |
|---|---|---|---|
cb | LivoxLidarPointCloudCallBack | 必填 | 点云数据回调函数。 |
client_data | void* | 可选 | 用户数据。 |
返回值
| 类型 | 说明 |
|---|---|
void | 无返回值。 |
void SetLivoxLidarImuDataCallback(LivoxLidarImuDataCallback cb, void* client_data)
功能说明
设置接收IMU数据的回调函数。
参数说明
| 参数名 | 类型 | 必填/默认值 | 说明 |
|---|---|---|---|
cb | LivoxLidarImuDataCallback | 必填 | IMU数据回调函数。 |
client_data | void* | 可选 | 用户数据。 |
返回值
| 类型 | 说明 |
|---|---|
void | 无返回值。 |
使用案例
SetLivoxLidarPointCloudCallBack(PointCloudCallback, nullptr);
cpp
void PointCloudCallback(uint32_t handle, const uint8_t dev_type, LivoxLidarEthernetPacket* data, void* client_data) {
if (data == nullptr) {
return;
}
printf("point cloud handle: %u, data_num: %d, data_type: %d, length: %d, frame_counter: %d\n",
handle, data->dot_num, data->data_type, data->length, data->frame_cnt);
if (data->data_type == kLivoxLidarCartesianCoordinateHighData) {
LivoxLidarCartesianHighRawPoint *p_point_data = (LivoxLidarCartesianHighRawPoint *)data->data;
for (uint32_t i = 0; i < data->dot_num; i++) {
//p_point_data[i].x;
//p_point_data[i].y;
//p_point_data[i].z;
}
}
else if (data->data_type == kLivoxLidarCartesianCoordinateLowData) {
LivoxLidarCartesianLowRawPoint *p_point_data = (LivoxLidarCartesianLowRawPoint *)data->data;
} else if (data->data_type == kLivoxLidarSphericalCoordinateData) {
LivoxLidarSpherPoint* p_point_data = (LivoxLidarSpherPoint *)data->data;
}
}注意事项
- 单次获得的点云并非一帧,需要满足100个callback.
ROS2 接口
简介
LiDAR 服务接口用于订阅 LiDAR 数据话题livox/lidar。该 topic 使用sensor_msgs/msg/PointCloud2消息类型,包含机器人固态激光雷达所收集的点云数据。
| Topic 名称 | Topic类型 | 角色 |
|---|---|---|
livox/lidar | sensor_msgs/msg/PointCloud2 | 订阅方 |
消息结构
bash
std_msgs/Header header # 消息头,包含时间戳和坐标系信息
uint32 height # 点云的高度(通常为 1,表示无序点云)
uint32 width # 点云的宽度(点数)
sensor_msgs/PointField[] fields # 描述点云中每个点的字段(如 x, y, z, intensity 等)
bool is_bigendian # 数据字节序(通常为 false,表示小端序)
uint32 point_step # 每个点的字节数
uint32 row_step # 每行的字节数
uint8[] data # 点云数据(二进制格式)
bool is_dense # 点云是否密集(无无效点)主要字段说明
| 字段名称 | 类型 | 描述 |
|---|---|---|
header | std_msgs/Header | 包含时间戳和坐标系的标准 ROS 消息头。 |
height | uint32 | 点云的高度,表示有多少行数据。 |
width | uint32 | 点云的宽度,表示每行有多少点。对于无组织的点云,width 表示点云中的总点数。 |
fields | sensor_msgs/PointField[] | 描述点云中每个点的字段(如 x, y, z, intensity 等)。 |
is_bigendian | bool | 表示数据的字节顺序是否为大端格式。 |
point_step | uint32 | 每个点在数据数组中占用的字节数。用于辅助解析 data 数组中的每个点。 |
row_step | uint32 | 每行点云数据占用的字节数。 |
data | uint8[] | 以字节流形式存储的实际点云数据,包括点的 x, y, z 坐标。 |
is_dense | bool | 表示点云数据中是否存在无效点。 |
回调函数实例
cpp
void lidarCallback(sensor_msgs::msg::PointCloud2::SharedPtr lidar_msg) {
pcl::PointCloud<pcl::PointXYZI>::Ptr pc_pcl(new pcl::PointCloud<pcl::PointXYZI>());
pcl::fromROSMsg<pcl::PointXYZI>(*lidar_msg, *pc_pcl);
for (const auto& pc : pc_pcl->points) {
/* <Customed processing procedure > */
}
}测试方法
- 订阅 LIDAR 消息数据:
IS
bash
ros2 topic echo /nav/livox/lidar_192_168_144_101bash
ros2 topic echo /nav/livox/lidar_192_168_144_102GS
bash
ros2 topic echo /nav/rslidar_points注意事项
- 获取LiDAR数据时,应先确保 LiDAR 节点已正常启动。