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