Unitree 4D LiDAR L1在RDK X3上的部署

Unitree 4D LiDAR-L1 是由宇树科技开发的一款高性价比、安全可靠的 4D 激光雷达(3D 位置 +1D 灰度),它具有实现每秒 21600 次的高速激光测距采样能力,可广泛应用于机器人、智慧城市、智能玩具、物流等领域,支持建图、定位、识别、避障、环境扫描、3D 重建等功能的实现。该文章用于记录该雷达在RDK X3上的部署,以及配套SLAM算法Point_LIO的运行。

Unilidar SDK 在RDK X3上的部署

Unilidar SDK 是一个使用 CMake 构建的软件包,适用于 Unitree LiDAR L1。-
该软件包可以提供以下功能:

  • 解析从激光雷达传输的原始数据,并将其转换为点云和 IMU 数据。
  • 获取点云数据。
  • 获取 IMU 数据。

默认情况下,输出的点云使用自定义数据类型,以便该 SDK 不过度依赖外部依赖项。在其他情况下,

  • 如果您习惯使用 Point Cloud Library,您可以使用头文件 ‘unitree_lidar_sdk_pcl.h’ 将我们的点云转换为 PCL 格式;
  • 如果您希望直接使用 ROS 软件包,则也可以使用我们的 ROS 软件包来处理这个激光雷达。

依赖项

我们已经验证该软件包可以在以下环境下成功运行:

  • Ubuntu 20.04

默认情况下,输出的点云使用自定义数据类型,以便该 SDK 不过度依赖外部依赖项。在其他情况下,这个SDK几乎不依赖于任何外部依赖项。但是,如果您想使用PCL点云格式,您需要安装一个PCL软件包。

配置

使用 USB 线将您的激光雷达连接到X3上,然后确认激光雷达的串口名称:

ls /dev/ttyUSB*

默认的串口名称为/dev/ttyUSB0

-
如果不是默认值,您需要修改 example_lidar.cpp 中的配置参数。

构建

首先将Unilidar_SDK下载到X3上并解压,或者也可以克隆代码库:

git clone https://github.com/unitreerobotics/unilidar_sdk.git

随后打开终端,将此程序作为cmake项目构建:

cd unitree_lidar_sdk
mkdir build
cd build
cmake .. && make -j2

运行

将雷达上电,直接运行可执行文件,此时终端路径为/unitree_lidar_sdk/build:

../bin/example_lidar

输出结果如下所示

lidar firmware version = 0.3.2+230511
lidar sdk version = 1.0.3
Dirty Percentage = 5.145833 %
Dirty Percentage = 4.166667 %
Dirty Percentage = 4.166667 %
Turn on all the LED lights ...
Turn off all the LED lights ...
Set LED mode to: FORWARD_SLOW ...
Set LED mode to: REVERSE_SLOW ...
Set LED mode to: SIXSTAGE_BREATHING ...
Set Lidar working mode to: NORMAL_MODE ... 
An IMU msg is parsed!
 stamp = 1683874160.559222, id = 729
 quaternion (x, y, z, w) = [0.0131, -0.0091, 0.6888, -0.7225]
An IMU msg is parsed!
 stamp = 1683874160.564979, id = 121
 quaternion (x, y, z, w) = [0.0102, -0.0093, 0.7099, -0.7018]
An IMU msg is parsed!
 stamp = 1683874160.568425, id = 122
 quaternion (x, y, z, w) = [0.0118, -0.0096, 0.7099, -0.7018]
An IMU msg is parsed!
 stamp = 1683874160.573472, id = 123
 quaternion (x, y, z, w) = [0.0126, -0.0093, 0.7098, -0.7018]
An IMU msg is parsed!
 stamp = 1683874160.577348, id = 124
 quaternion (x, y, z, w) = [0.0128, -0.0093, 0.7099, -0.7018]
A Cloud msg is parsed! 
 stamp = 1683874145.535888, id = 1
 cloud size = 278
 first 10 points (x,y,z,intensity,time,ring) = 
 (-0.029885, -0.136897, 0.000448, 88.000000, 0.000000, 0)
 (-0.035384, -0.171399, 0.005140, 91.000000, 0.000023, 0)
 (-0.043000, -0.219542, 0.012437, 127.000000, 0.000046, 0)
 (-0.054879, -0.294965, 0.024572, 132.000000, 0.000069, 0)
 (-0.055288, -0.301204, 0.033170, 106.000000, 0.000093, 0)
 (-0.054542, -0.300348, 0.041173, 101.000000, 0.000116, 0)
 (-0.053764, -0.299285, 0.049148, 99.000000, 0.000139, 0)
 (-0.056123, -0.318406, 0.060981, 92.000000, 0.000162, 0)
 (-0.055230, -0.316827, 0.069422, 91.000000, 0.000185, 0)
 (-0.051257, -0.294854, 0.072849, 128.000000, 0.000208, 0)

注意事项:-
在 Ubuntu 中,访问串口设备需要适当的权限。如果您的 C++ 程序没有足够的权限访问串口设备,您将会收到一个 “Permission denied” 错误。

terminate called after throwing an instance of 'serial::IOException'
what(): IO Exception (13): Permission denied, file /home/mlb/ut_workspace/202207_unitree_selfmade_lidar/unitree_lidar_sdk/unitree_lidar_sdk/src/serial/impl/unix.cc, line 151.

要解决这个错误,您可以使用以下命令将当前用户添加到 dialout 组:-
首先得到USER,X3一般都是sunrise

echo $USER


sudo usermod -a -G dialout $USER

将用户添加到 dialout 组后,您需要注销并重新登录才能使更改生效。

Lidar在ROS环境中运行并得到点云数据

依赖项

依赖项包括 ‘PCL’ 和 ‘ROS’ 。-
我们已经验证了该软件包可以在以下环境下成功运行:

  • Ubuntu 20.04
  • ROS noetic
  • PCL-1.10
  • unitree_lidar_sdk

配置

将激光雷达通过 USB 线连接到计算机上,然后确认激光雷达的串口名称:

ls /dev/ttyUSB*

默认的串口名称是 ‘/dev/ttyUSB0’ 。如果不是默认的名称,您需要修改 unitree_lidar_ros/-config/config.yaml 文件中的配置,并将 port 名称更改为您的名称。例如:

# Serial Port
port: "/dev/ttyYourUSBPortName

您可以保留配置文件中的其他参数,它们将使用其默认值。如果您有特殊需求,例如更改点云 topic 名称或 IMU topic 名称,也可以在配置文件中进行配置。默认的点云话题及其坐标系名称为:

  • topic: “unilidar/cloud”
  • frame: “unilidar_lidar”-
    默认的 IMU 话题及其坐标系名称为:
  • topic: “unilidar/imu”
  • frame: "unilidar_imu

构建

cd unilidar_sdk/unitree_lidar_ros
catkin_make

运行

然后,您需要启动 ROS 的环境,并直接运行启动文件:

source devel/setup.bash
roslaunch unitree_lidar_ros run.launch

在 Rviz 窗口中,您将看到我们的激光雷达点云如下所示:-

-
可以将 ‘Fixed Frame’ 更改为 IMU 坐标系 ‘unilidar_imu’ ,这样就可以查看 IMU 四元数向量:-

在RDK X3上运行SLAM

依赖项

  • Ubuntu 20.04
  • ROS noetic
  • PCL-1.10
  • unitree_lidar_sdk
  • Eigen

配置

安装额外的ROS包

sudo apt-get install ros-noetic-pcl-conversions

安装Eigen

sudo apt-get install libeigen3-dev

此时确保你已经构建好了unitree_lidar_ros(上文步骤)

构建

克隆此存储库并运行:catkin_make

mkdir -p catkin_point_lio_unilidar/src
cd catkin_point_lio_unilidar/src
git clone https://github.com/unitreerobotics/point_lio_unilidar.git
cd ..
catkin_make

这一步编译特别难受,经常会因为内存不够而终止,但是它会趁你不注意给你编译成功,所以随缘。

运行

使用 Unilidar 运行

首先应该将激光雷达连接到RDK X3,并使用12V充电器为激光雷达供电。此外,为确保IMU的正确初始化,建议在算法执行的最初几秒钟内将激光雷达保持在静止状态。

运行unilidar

cd unilidar_sdk/unitree_lidar_ros
source devel/setup.bash
roslaunch unitree_lidar_ros run_without_rviz.launch

运行Point-LIO

cd catkin_unilidar_point_lio
source devel/setup.bash
roslaunch point_lio_unilidar mapping_unilidar.launch

下图是我用电脑虚拟机跑出来的点云图:-

-
经过验证,RDK X3同样可以运行。

使用数据集运行

如果您现在没有激光雷达,可以下载激光雷达记录的数据集,并用它运行证明此算法。

运行Point-LIO

cd catkin_point_lio_unilidar
source devel/setup.bash
roslaunch point_lio_unilidar mapping_unilidar.launch

运行数据集:

rosbag play unilidar-2023-09-22-12-42-04.bag

效果如下:-

可能遇到的问题

无法在rviz上看到点云

如果你是在电脑上的虚拟机上面跑,有可能会碰到可以查到imu数据,但是没法看到点云的情况。你需要关闭可能造成问题的硬件加速(如使用了intel gpu),直接复制粘贴这条命令:

export LIBGL_ALWAYS_SOFTWARE=1

之后再运行source与roslaunch的步骤即可。

加载共享库时发生错误

当你在roslaunch的时候,有可能连rviz都出不来,然后疯狂报这个错误,在一堆libroscpp中甚至还能混进去一点tf2:

process[rosout-1]: started with pid [9673]
[rosout-1] process has died [pid 9673, exit code 127, cnd /opt/ros/noetic/lib/rosout/rosout nane =rosout_ log:=/hone/ouc/.ros/log/0753254-d0a1-11ea8ecb-1c1b6d253d41/rosout-1*.log].
log file: /hone/ouc/.ros/log/0753254-d0a1-11ea8ecb-1c1b6d253d41/rosout-1*.log
[ rosout-1] restarting process
/opt/ros/noetic/lib/rosout/rosout: error while loading shared libraries: libroscpp.so: cannot open shared object file: No such file or directory

然后你会发现,roscore都能报这个错误,所以确实是libroscpp.so加载失败了。

首先我们检查共享库是否存在:

find /opt/ros -name "libroscpp.so"

输出:

/opt/ros/noetic/lib/libroscpp.so

发现共享库存在,说明共享库的路径是正确的,接下来就需要查看一下环境变量是否正确了。

修改环境变量:-
我们需要在~/.bashrc的最后一行加上:

export LD_LIBRARY_PATH=/opt/ros/noetic/lib

然后再source一下。

我们来检查一下环境变量:

echo $LD_LIBRARY_PATH

输出:

/opt/ros/noetic/lib

如果到了这一步还是不行,请继续尝试以下方法:-
修改ld.so.conf:

# 或者直接在图形界面打开
sudo gedit /etc/ld.so.conf

在最后一行添加环境变量

/opt/ros/noetic/lib

最后执行命令:

sudo ldconfig

cyk tql