← Back to Index

home_en_G1_developer_lidar_services_interface.md

宇树科技 文档中心

Source: https://support.unitree.com/home/en/G1_developer/lidar_services_interface

Lidar service interface

Software Service Version Requirements

Lidar Driver >= 1.0.0.5. If the built-in service version is low, please contact technical support to upgrade to the correct version.

Basic Information

The Mid-360 lidar is located in the middle of the head of the G1 robot. The coordinate relationship between the IMU inside the Mid-360 and the radar is (0.011, 0.02329, -0.04412) (unit: meter), and there is no rotational transformation. It can be represented by the following transformation matrix.

[1000.0110100.02329001−0.044120001]\begin{bmatrix}1 & 0 & 0 & 0.011\ 0 & 1 & 0 & 0.02329 \ 0 & 0 & 1 & -0.04412\ 0 & 0 & 0 & 1 \end{bmatrix} ​1000​0100​0010​0.0110.02329−0.044121​​

The position relationship of the lidar coordinate system relative to the robot coordinate system is (-0.0, 0.0, -0.47618), and the placement method is inverted. The pitch axis inclination of the Mid-360 lidar is -2.3 degrees.

Data Interface

The emitted data are point cloud and IMU data in DDS format respectively; the point cloud topic is rt/utlidar/cloud_livox_mid360 with an output frequency of 10Hz and a frame_id of "livox_frame"; the IMU topic is rt/utlidar/imu_livox_mid360 with an output frequency of 200Hz.

Subscription Example

#include <unitree/robot/channel/channel_subscriber.hpp>
#include <unitree/idl/ros2/PointCloud2_.hpp>
#include <unitree/idl/ros2/Imu_.hpp>

#define LIDAR_TOPIC "rt/utlidar/cloud_livox_mid360"
#define IMU_TOPIC "rt/utlidar/imu_livox_mid360"

using namespace unitree::robot;
using namespace unitree::common;

void LidarHandler(const void* msg)
{
    const sensor_msgs::msg::dds_::PointCloud2_* pc_data = (const sensor_msgs::msg::dds_::PointCloud2_*)msg;
    std::cout << "Lidar data received" << std::endl;
}

void ImuHandler(const void* msg)
{
    const sensor_msgs::msg::dds_::Imu_* imu_data = (const sensor_msgs::msg::dds_::Imu_*)msg;
    std::cout << "Imu data received" << std::endl;
}

int main()
{
    ChannelFactory::Instance()->Init(0);


    ChannelSubscriberPtr<sensor_msgs::msg::dds_::PointCloud2_> lidar_sub_ = ChannelSubscriberPtr<sensor_msgs::msg::dds_::PointCloud2_>(new ChannelSubscriber<sensor_msgs::msg::dds_::PointCloud2_>(LIDAR_TOPIC));
    ChannelSubscriberPtr<sensor_msgs::msg::dds_::Imu_> imu_sub_ = ChannelSubscriberPtr<sensor_msgs::msg::dds_::Imu_>(new ChannelSubscriber<sensor_msgs::msg::dds_::Imu_>(IMU_TOPIC));

    lidar_sub_->InitChannel(std::bind(LidarHandler, std::placeholders::_1), 1);
    imu_sub_->InitChannel(std::bind(ImuHandler, std::placeholders::_1), 1);

    while (true)
    {
        sleep(10);
    }

    return 0;
}