Ubuntu20.04下Livox Avia雷达点云数据采集与可视化实战
1. 环境准备与设备连接
拿到Livox Avia雷达,第一步不是急着敲代码,而是要把硬件和网络环境搞定。很多新手朋友容易在这里卡住,觉得不就是插根网线吗?其实这里有几个小细节不注意,后面可能连设备都找不到。我自己刚开始用的时候,也在这里折腾了小半天。
首先,你得知道雷达的IP地址。Livox Avia出厂时有一个默认的IP,但如果你是在一个已有的网络环境里,或者之前别人用过,这个IP可能就变了。最稳妥的方法,就是去Livox官网下载一个叫 Livox Viewer 的软件。这个软件有Windows版和Ubuntu版,对于咱们在Ubuntu下开发,我建议直接在Ubuntu20.04里装它的Linux版本,这样后续调试也方便。不过,如果你手边有Windows电脑,先用Windows版快速查一下IP也是个好办法。
用网线把雷达和你的Ubuntu电脑直连起来。注意,最好用电脑自带的以太网口,有些通过USB转接的网卡可能会在驱动上有点小麻烦。连接好后,打开Livox Viewer。如果一切正常,软件应该能自动扫描并列出发现的雷达设备,上面就会显示它当前的IP地址,通常是192.168.1.1xx这个网段的。
知道雷达的IP后,关键的一步来了:把你Ubuntu电脑的有线网络配置成和雷达同一个网段。比如说雷达IP是192.168.1.100,那么你电脑的IP可以设为192.168.1.50,子网掩码用255.255.255.0。这个操作在Ubuntu的图形界面设置里就能完成,找到“网络”设置,选择有线连接,手动配置IPv4地址就行。设置好后,一定要在终端里用ping命令验证一下。打开终端,输入:
ping 192.168.1.100
如果能看到一连串的回复(64 bytes from 192.168.1.100...),那就恭喜你,电脑和雷达之间的通信链路打通了。如果ping不通,别慌,检查一下网线、防火墙(Ubuntu默认的防火墙ufw可以先暂时关闭试试 sudo ufw disable),或者看看IP地址有没有输错。
1.1 创建ROS工作空间
网络搞定,接下来就是搭建我们的软件开发环境了。Livox Avia的驱动和示例都是基于ROS(Robot Operating System)的,所以我们得先有一个ROS工作空间。我假设你已经按照ROS官网的教程,在Ubuntu20.04上安装好了 ROS Noetic 版本。这是最匹配Ubuntu20.04的ROS发行版。
安装好ROS后,我们创建一个专属的工作空间。我不喜欢把所有项目都扔到默认空间里,单独建一个管理起来更清晰。打开终端,依次执行以下命令:
mkdir -p ~/livox_ws/src
cd ~/livox_ws/src
catkin_init_workspace
这里的~/livox_ws就是我们的工作空间根目录,src是存放源代码的地方。catkin_init_workspace命令会在src下生成一个CMakeLists.txt的链接文件,标志着这是一个ROS工作空间。
然后我们回到工作空间根目录进行编译,虽然现在src里还没代码,但这个初始化编译能确保环境没问题:
cd ~/livox_ws
catkin_make
编译过程会持续一会儿,结束后,你会看到目录下多了build和devel两个文件夹。最后,别忘了把当前工作空间的环境变量设置生效,这样终端才能找到我们这个空间里的ROS功能包:
source ~/livox_ws/devel/setup.bash
为了以后每次打开新终端都不用再手动source,我习惯把这条命令加到~/.bashrc文件末尾:
echo "source ~/livox_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
这样,基础的ROS“舞台”就搭好了。
1.2 安装Livox-SDK
SDK(Software Development Kit)是直接和雷达硬件对话的底层库,所有的驱动都依赖于它。所以这一步必须确保安装正确。我们进入到工作空间的src目录下来操作:
cd ~/livox_ws/src
然后,我们从GitHub上克隆Livox官方的SDK源码:
git clone https://github.com/Livox-SDK/Livox-SDK.git
克隆完成后,进入SDK的目录并开始编译安装:
cd Livox-SDK
mkdir build
cd build
cmake ..
make
sudo make install
这里解释一下每条命令在干什么。cmake ..是生成适用于你当前系统的编译脚本(Makefile)。make则是根据这个脚本,把源代码编译成可执行文件或库。最后的sudo make install是把编译好的库文件、头文件等安装到系统的标准路径下(比如/usr/local/lib和/usr/local/include),这样其他程序在链接时就能自动找到它们。
安装完成后,怎么验证SDK装好了呢?官方提供了一个简单的示例程序。我们还是在build目录下,运行:
cd sample/lidar
./lidar_sample
这个示例程序会尝试使用SDK去发现和连接雷达。如果SDK安装无误,并且你的网络配置正确、雷达已上电连接,你会在终端里看到类似[Broadcast] discover device这样的日志信息,然后列出发现的雷达设备及其IP、状态等。如果运行后什么设备都没发现,只输出一些初始化信息,那就要回头检查网络ping通的那一步了。这个测试非常关键,它能证明你的底层通信是OK的。
2. 安装与配置ROS驱动
SDK是基础,但直接用它来开发应用还是比较麻烦。好在Livox提供了ROS驱动包livox_ros_driver,它把SDK的功能封装成了ROS的节点(Node)和话题(Topic),让我们可以用ROS那套成熟的消息通信和可视化工具来处理点云数据,这就方便太多了。
2.1 下载与编译驱动
我们继续在工作空间的src目录下操作。如果你已经退出来了,记得先cd ~/livox_ws/src。然后克隆ROS驱动的仓库:
git clone https://github.com/Livox-SDK/livox_ros_driver.git
克隆下来的目录名就是livox_ros_driver。接下来,我们需要先解决这个驱动包的依赖。它依赖一个ROS功能包叫livox_ros_driver,但更重要的是,它内部使用了一种叫做Fast RTPS的通信中间件(ROS2的默认中间件,但这个ROS1的包也用了),所以我们需要安装它:
sudo apt-get update
sudo apt-get install -y ros-noetic-desktop-full ros-noetic-ddynamic-reconfigure
ros-noetic-desktop-full是ROS的完整桌面版,包含了RViz等可视化工具,如果你之前装的是基础版,可能需要这个。ddynamic-reconfigure是一个用于动态配置参数的包,驱动里用到了。
依赖装好,就可以编译了。回到工作空间根目录:
cd ~/livox_ws
catkin_make
编译livox_ros_driver的过程可能会比编译普通包久一点,因为它要编译SDK的封装和ROS的接口。编译过程中,终端会刷过很多信息,只要最后没有红色的Error字样,并且以类似[100%] Built target livox_ros_driver_node这样的信息结束,就说明编译成功了。
编译成功后,同样要source一下环境,让系统识别这个新编译出来的功能包:
source devel/setup.bash
2.2 关键配置文件修改
驱动装好了,但还不能直接用,我们需要告诉驱动你的雷达具体是哪一款、IP是多少。这是很多教程里一笔带过,但实际最容易出错的地方。配置文件在~/livox_ws/src/livox_ros_driver/config目录下。
首先,找到MID360_config.json这个文件(Avia雷达通常使用这个配置文件,但具体请以官方最新文档为准,有时也可能是avia_config.json)。用文本编辑器打开它,比如用nano:
nano ~/livox_ws/src/livox_ros_driver/config/MID360_config.json
你会看到一个JSON格式的配置。里面有一个lidar_config列表,列表里的每个字典就对应一台雷达。你需要修改这几个关键字段:
ip:改成你雷达的实际IP地址,就是之前用Livox Viewer查到的那个,例如"192.168.1.100"。pcl_data_type:点云数据类型。0表示原始点云,1表示笛卡尔坐标系下的点云(x, y, z),2表示带强度的点云。对于可视化,我们通常选1或2。我一般用1先看效果。pattern_mode:扫描模式。0是重复扫描,1是非重复扫描。Avia的非重复扫描模式视野覆盖率增长很快,适合动态环境。可以试试1。extrinsic_parameter:这是雷达的外参,也就是雷达坐标系相对于车体(或其他基准)坐标系的变换矩阵。如果你只是单雷达测试,没有和其他传感器标定,这里可以保持默认(单位矩阵)。
改完之后保存退出。还有一个重要的配置文件是Launch文件,它决定了ROS启动哪些节点。不过驱动包自带的Launch文件通常已经配置好了,我们暂时可以不用改。但你要知道,如果你有特殊需求,比如同时连接多台雷达,或者改变点云发布的主题(Topic)名称,就需要去修改launch目录下的对应文件。
3. 启动驱动与数据采集
配置都搞定,激动人心的时刻到了——启动驱动,让点云数据“流”起来。
3.1 启动驱动节点
我们使用ROS的launch文件来启动,这样能一次性启动所有相关的节点。最常用的有两个launch文件:
livox_lidar.launch:只启动驱动节点,发布点云数据到ROS话题,不打开任何可视化窗口。适合在服务器或嵌入式设备上运行。livox_lidar_rviz.launch:启动驱动节点的同时,也启动RViz可视化工具,并加载一个预设好的视图配置,方便直接查看。
我们先试试第二个,一键搞定驱动和可视化。确保你的雷达已经上电,并且和电脑网线连接。然后在一个终端中,执行:
source ~/livox_ws/devel/setup.bash
roslaunch livox_ros_driver livox_lidar_rviz.launch
如果你已经把source命令加入了.bashrc,那么第一行可以省略。roslaunch命令会做几件事:首先启动livox_ros_driver节点,这个节点会根据之前的配置文件去连接雷达,接收原始数据并转换成ROS的点云消息;然后启动RViz。
如果一切顺利,你会看到两个窗口弹出来:一个是黑色的终端,里面在滚动输出驱动节点的日志,如果看到[ltio] [info] start discovering lidar和[ltio] [info] add lidar: 192.168.1.100这样的信息,就表示雷达连接成功了;另一个就是RViz的3D可视化窗口。
3.2 在RViz中查看点云
第一次打开livox_lidar_rviz.launch,RViz可能会显示一个椭圆形的点云,或者点云集中在画面中央一个小区域。别担心,这不是雷达坏了,只是RViz的显示设置需要调整。
RViz窗口左侧有一个“Displays”面板。在这里找到“Global Options”一项,下面有个“Fixed Frame”。把它从默认的map改成livox_frame。这个livox_frame就是驱动为雷达定义的坐标系,改了之后点云才能正确显示在坐标系原点。
然后,在“Displays”面板下方,点击“Add”按钮。在弹出的窗口中找到并选择“PointCloud2”,点击“OK”。这会在“Displays”列表里添加一个“PointCloud2”的显示项。点开它,找到“Topic”这一栏。点击右边的输入框,你会看到一个下拉列表,选择/livox/lidar。这个就是驱动节点发布的点云数据流。
完成这两步,你应该就能在RViz中间的3D视图里看到雷达扫描到的环境点云了!挥挥手或者放个物体在雷达前面,看看点云是不是实时更新。你可以用鼠标左键拖拽旋转视图,中键拖拽平移,滚轮缩放,从各个角度观察。
3.3 理解数据流与话题
如果livox_lidar_rviz.launch启动后可视化效果不理想,或者你更喜欢自己配置RViz,我们可以用更“手动”的方式。首先,在一个终端只启动驱动:
source ~/livox_ws/devel/setup.bash
roslaunch livox_ros_driver livox_lidar.launch
看到终端提示雷达连接成功后,再打开第二个终端,启动RViz:
rosrun rviz rviz
这是一个空的RViz。你需要像上面描述的那样,手动添加“PointCloud2”显示,并将话题设置为/livox/lidar,固定帧设为livox_frame。
这时候,你可以打开第三个终端,用ROS的工具来查看当前系统里流动的数据。输入:
rostopic list
你会看到一系列话题,其中应该包含/livox/lidar。再输入:
rostopic echo /livox/lidar --noarr | head -20
这个命令会打印出点云话题的消息头(--noarr是为了不打印庞大的点云数组数据),你可以看到消息的类型是sensor_msgs/PointCloud2,以及帧ID、时间戳等信息。这证明了数据正在正常发布。
理解这个话题非常重要。后续如果你想用Python或C++写程序来处理这些点云数据,你只需要订阅(Subscribe)这个/livox/lidar话题就可以了。ROS已经帮你解决了最麻烦的硬件通信和数据解析部分。
4. 点云数据处理与优化实战
能看到点云只是第一步。在实际项目中,我们往往需要对原始点云进行一些处理,或者优化显示效果,甚至保存下来供后续算法使用。
4.1 调整点云显示效果
默认的点云显示可能有点稀疏,或者颜色单一(通常是按高度赋色)。在RViz的“PointCloud2”显示项里,有几个参数可以调整:
- Style: 点云的绘制样式。
Points就是小点,Squares是小方块,Flat Squares是扁平方块。Points最常用。 - Size (m): 每个点在屏幕上显示的大小。根据你的屏幕分辨率和雷达距离调整,
0.01或0.02通常比较合适。 - Color Transformer: 颜色变换器。这是让点云变漂亮的关键!
AxisColor: 按XYZ轴方向赋色(红绿蓝)。FlatColor: 单一颜色,可以在下面“Color”里选。Intensity: 按点云强度赋色。如果你的pcl_data_type配置的是2(带强度),并且雷达扫描的物体反射率有差异,这个模式会非常有用,不同材质的物体颜色不同。RGB8: 如果点云本身带有RGB颜色信息(比如某些RGB-D相机或Livox的HAP雷达),可以用这个。Height: 按点的高度(Z坐标)赋色,这是我最常用的选项。它能非常直观地展示地形起伏或物体的高低。你可以调整“Min Color”和“Max Color”来改变色带。
多试试不同的Color Transformer和Size,找到最能突出你关注信息的显示方式。比如调试扫地机器人建图时,用Height模式看地面平整度一目了然。
4.2 录制与回放点云数据
做算法开发,不可能一直让雷达实时跑着。我们需要把数据录下来,反复测试。ROS提供了强大的rosbag工具。在驱动节点和RViz都运行的情况下,打开一个新终端,进入到你想保存数据的目录,然后运行:
cd ~/bagfiles
rosbag record -O livox_avia_data /livox/lidar
-O参数指定输出文件的前缀(这里会生成类似livox_avia_data_2024-05-27-10-15-00.bag的文件)。/livox/lidar是要录制的话题。你可以录制多个话题,用空格隔开。按Ctrl+C停止录制。
回放数据就更简单了。先关闭所有正在运行的驱动和RViz(避免话题冲突)。然后在一个终端播放bag包:
rosbag play ~/bagfiles/livox_avia_data_2024-05-27-10-15-00.bag
在另一个终端启动RViz,并像之前一样添加PointCloud2显示,订阅/livox/lidar话题。你会发现,RViz里开始“重现”刚才录制的场景。你可以暂停、快进、循环播放,这对于算法调试和演示来说极其方便。
4.3 使用PCL库进行简单处理
有时你可能想对点云做点简单的实时处理,比如滤除太远或太近的噪点。虽然完整的PCL(Point Cloud Library)教程很复杂,但我们可以写一个非常简单的ROS节点来体验一下。这个节点会订阅原始点云,进行一下直通滤波(PassThrough),然后发布一个新的点云话题。
首先,在工作空间src目录下创建一个新的功能包(如果还没有):
cd ~/livox_ws/src
catkin_create_pkg my_pointcloud_filter roscpp sensor_msgs pcl_ros pcl_conversions
然后,在my_pointcloud_filter/src目录下创建一个C++文件,比如simple_filter.cpp。代码如下:
#include <ros/ros.h>
#include <sensor_msgs/PointCloud2.h>
#include <pcl_conversions/pcl_conversions.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/filters/passthrough.h>
ros::Publisher pub;
void cloudCallback(const sensor_msgs::PointCloud2ConstPtr& input)
{
// 将ROS消息转换为PCL点云格式
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::fromROSMsg(*input, *cloud);
// 创建直通滤波器对象
pcl::PassThrough<pcl::PointXYZ> pass;
pass.setInputCloud(cloud);
pass.setFilterFieldName("z"); // 设置过滤的字段为Z轴(高度)
pass.setFilterLimits(0.1, 2.0); // 只保留高度在0.1米到2.0米之间的点(去除地面噪点和远处无效点)
// pass.setFilterLimitsNegative(true); // 如果设为true,则保留范围外的点
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
pass.filter(*cloud_filtered);
// 将PCL点云转换回ROS消息
sensor_msgs::PointCloud2 output;
pcl::toROSMsg(*cloud_filtered, output);
output.header = input->header; // 保持时间戳和帧ID
// 发布滤波后的点云
pub.publish(output);
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "simple_pcl_filter");
ros::NodeHandle nh;
// 订阅原始点云话题
ros::Subscriber sub = nh.subscribe<sensor_msgs::PointCloud2>("/livox/lidar", 1, cloudCallback);
// 发布滤波后的点云话题
pub = nh.advertise<sensor_msgs::PointCloud2>("/livox/lidar_filtered", 1);
ros::spin();
return 0;
}
接着,需要修改CMakeLists.txt文件(在功能包目录下),添加可执行文件的编译规则。在文件末尾添加:
add_executable(simple_filter src/simple_filter.cpp)
target_link_libraries(simple_filter ${catkin_LIBRARIES})
最后,回到工作空间根目录编译:
cd ~/livox_ws
catkin_make
编译成功后,先启动雷达驱动节点,然后运行我们这个滤波节点:
source devel/setup.bash
rosrun my_pointcloud_filter simple_filter
现在,在RViz里除了原来的/livox/lidar话题,你还可以添加一个PointCloud2显示,订阅新的/livox/lidar_filtered话题。对比一下,你会发现滤波后的点云去除了非常低和非常高的点(根据你设置的Z轴范围),场景看起来更干净了。这只是PCL的冰山一角,但已经能解决很多实际问题。
5. 常见问题排查与性能调优
实战过程中不可能一帆风顺,这里我把自己和朋友们踩过的一些坑总结一下,希望能帮你快速定位问题。
5.1 雷达连接失败
这是最常见的问题。如果启动launch文件后,终端里没有出现发现雷达和成功连接的日志,而是报错或者一直等待,请按以下顺序检查:
- 物理连接:网线是否插紧?雷达电源指示灯是否正常?尝试换一根网线。
- IP配置:这是最高发的原因。务必用
ifconfig命令确认你用来连接雷达的那个网卡(通常是eth0或enpXsX)的IP地址是否和雷达在同一网段,且没有冲突。用ping命令测试连通性。 - 防火墙:Ubuntu的防火墙
ufw可能会阻止通信。可以临时关闭测试:sudo ufw disable。记得测试完再开启(sudo ufw enable)。 - 驱动配置:确认
config目录下的JSON配置文件中的ip地址是否正确。确认你运行的launch文件加载的是你修改过的配置文件。 - 多网卡干扰:如果你的电脑有多个网卡(比如还有Wi-Fi),有时系统路由可能会乱。可以尝试在连接雷达时,禁用其他不相关的网络连接。
- SDK版本:确保你克隆的
Livox-SDK和livox_ros_driver是最新的master分支代码。有时新旧版本协议不匹配。
5.2 RViz中看不到点云或点云异常
如果驱动节点日志显示连接成功,但RViz里啥也没有,或者点云很奇怪(比如全挤在一个点):
- RViz设置:99%的问题出在这里。再次确认:①“Fixed Frame”是否设置为
livox_frame?②“PointCloud2”显示项的“Topic”是否选择为/livox/lidar? - 坐标系问题:在RViz的“Displays”面板最上面,把“Global Options”里的“Fixed Frame”改成
livox_frame后,看看它旁边的“Status”是不是绿色的“OK”。如果是黄色的“Warning”或红色的“Error”,说明RViz在等待livox_frame的坐标系变换信息(TF)。驱动应该会发布这个TF,检查一下终端里有没有TF相关的错误。 - 点云密度:如果点云极其稀疏,检查雷达的
pattern_mode配置。非重复扫描模式(1)在初始几秒点云就是很稀疏的,等十几秒后视野才会逐渐填满。也可以尝试改成重复扫描模式(0)看看。 - 数据格式:确认配置文件中的
pcl_data_type不是0(原始数据)。1或2才能在RViz中正常显示。
5.3 系统性能与资源占用
Livox Avia的数据率很高,对系统有一定压力。如果运行起来感觉电脑很卡,或者RViz刷新很慢:
- 关闭不必要的RViz显示:RViz里每添加一个显示项(如Grid, Camera Image等)都会消耗资源。只保留必要的
PointCloud2。 - 降低点云显示大小:在
PointCloud2属性里,把“Size (m)”调小,比如从0.02调到0.01,能显著提升渲染速度。 - 使用
livox_lidar.launch而非livox_lidar_rviz.launch:在无头服务器或资源紧张的设备上,只运行驱动节点,用另一台性能更强的电脑通过ROS网络(ROS_MASTER_URI)来运行RViz和接收话题,进行可视化。 - 点云降采样:如果实时性要求不是极高,可以在驱动内部或像上面例子那样,写一个简单的滤波节点对点云进行降采样(VoxelGrid滤波),减少数据量再发布,能极大缓解带宽和计算压力。
- 检查系统负载:在终端运行
htop命令,查看CPU和内存使用情况。如果某个进程(可能是RViz或驱动节点)占用率持续很高,说明它可能是瓶颈。
折腾这些步骤虽然有点繁琐,但每一步都踩实了,后面做SLAM、感知、三维重建这些高级应用时,基础才会牢靠。记住,遇到问题先看终端日志,那里面通常包含了最直接的错误信息。多动手试几次,你对整个数据流的理解会深刻很多。
更多推荐
所有评论(0)