Skip to content

LiDAR 服务接口

获取 LiDAR 数据

C++接口

LiDAR(mid_360)

c++接口:通过livox_sdk2提供的c++接口,可以实现对雷达ip配置、雷达工作模式配置、获得雷达点云数据、获取自带的imu数据。

参数livox官方代码参数,提供了相应源码和动态(静态)库

功能C++接口函数
设置雷达IPSetLivoxLidarIp
设置雷达工作模式SetLivoxLidarWorkMode
获取雷达点云数据SetLivoxLidarPointCloudCallBack
获取imu数据SetLivoxLidarImuDataCallback

简介

SetLivoxLidarIp简介

cpp
/**
 * Set LiDAR Ip info.
 * @param  handle                 device handle.
 * @param  ipconfig               lidar ip info.
 * @param  cb                     callback for the command.
 * @param  client_data            user data associated with the command.
 * @return kStatusSuccess on successful return, see \ref LivoxStatus for other error code.
 */
livox_status SetLivoxLidarIp(uint32_t handle, LivoxLidarIpInfo* ip_config,
                             LivoxLidarAsyncControlCallback cb, void* client_data);

SetLivoxLidarWorkMode简介

cpp
/**
 * Set LiDAR work mode.
 * @param  handle                 device handle.
 * @param  work_mode              lidar work mode.
 * @param  cb                     callback for the command.
 * @param  client_data            user data associated with the command.
 * @return kStatusSuccess on successful return, see \ref LivoxStatus for other error code.
 */
livox_status SetLivoxLidarWorkMode(uint32_t handle, LivoxLidarWorkMode work_mode, LivoxLidarAsyncControlCallback cb, void* client_data);

SetLivoxLidarPointCloudCallBack简介

cpp
/**
 * Set the callback to receive point cloud data.
 * @param handle                 device handle.
 * @param client_data            user data associated with the command.
 */
void SetLivoxLidarPointCloudCallBack(LivoxLidarPointCloudCallBack cb, void* client_data);

SetLivoxLidarImuDataCallback简介

cpp
/**
 * Set the callback to receive IMU data.
 * @param cb                     callback to receive Status Info.
 * @param client_data            user data associated with the command.
 */
void SetLivoxLidarImuDataCallback(LivoxLidarImuDataCallback cb, void* client_data);

使用案例

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/lidarsensor_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:包含时间戳和坐标系的标准 ROS 消息头。

  • stamp:时间戳,指示数据采集的时间。
  • frame_id:坐标系ID,指示点云数据所属的参考坐标系。

height:点云的高度,表示有多少行数据。

width:点云的宽度,表示每行有多少点。对于无组织的点云,width 表示点云中的总点数。

is_bigendian:表示数据的字节顺序是否为大端格式。

point_step:每个点在数据数组中占用的字节数。用于辅助解析 data 数组中的每个点。

row_step:每行点云数据占用的字节数。

data:以字节流形式存储的实际点云数据,包括点的 x, y, z 坐标。

is_dense:表示点云数据中是否存在无效点。

回调函数实例
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_101
bash
ros2 topic echo /nav/livox/lidar_192_168_144_102

GS

bash
ros2 topic echo /nav/rslidar_points
注意事项
  • 获取LiDAR数据时,应先确保 LiDAR 节点已正常启动。