抖音粉丝群1
『7x24小时有问必答』

AI浪潮下的计算机行业——从业者现状与未来展望
  

1.jpeg
欢迎来到 USV(无人水面艇)系统的开发旅程!在本篇中,我们将从硬件搭建、基础模块适配、完整系统集成,到最后的实战问题排查,为你详细讲解如何在 NUC 工控机上搭建一套完整的自主航行系统。这套系统包括激光雷达+FAST-LIO 定位建图, Ego-Planner 轨迹规划,模型预测控制(MPC)轨迹跟踪三大核心模块。
无论你是机器人领域的新手还是有一定经验的工程师,这份笔记都能助你快速理解 USV 系统的架构、各模块间的协作机制,以及实战中常见的陷阱和解决方案。
2.png
USV 无人船系统

前置知识

在开始之前,你需要具备:
•  基础环境:Ubuntu 20.04 + ROS Noetic
•  硬件平台:NUC 工控机(NVIDIA Jetson Orin NX需要适配Arm差异)
•  传感器:Livox Mid360 激光雷达
•  算法库:感知定位:FAST-LIO、规划:Ego-Planner-v2、控制:MPC
•  编译工具:CMake、catkin

---

第一部分:激光雷达硬件与驱动配置

激光雷达是 USV 的"眼睛"。Livox Mid360 是一款高性价比的 360 度旋转激光雷达,但要让它稳定工作,需要正确的网络、驱动和 SDK 配置。

1.1 网络配置:建立通信桥梁

激光雷达通过以太网与工控机通信,首先要确保网络互联。
关键步骤:
1. 将雷达连接到独立网卡(如  enp2s0
2. 修改网络配置文件:/etc/netplan/01-network-manager-all.yaml
3. 设置工控机 IP(如  192.168.1.222
network:

   version:
  2

   renderer:
  NetworkManager

   ethernets:

      enp2s0:

         dhcp4:
  no

         addresses:

            -
  192.168.1.222/24
应用配置:
sudo  netplan apply
验证连接:
ping 192.168.1.183   # 雷达 IP
如果 Ping 成功但没有数据包,说明网络连接了,但驱动可能未配置。

1.2 驱动配置:点亮激光雷达

步骤 1:配置激光雷达设备号

编辑文件:src/livox_ros_driver/livox_ros_driver/config/livox_lidar_config.json
{

      "lidar_config"
:  [

            {

                  "broadcast_code"
:  "47MDN1D0030083",   # 改为你的雷达设备号

                  "enable_connect"
:  false,

                  "return_mode"
:  0,

                  "coordinate"
:  0,

                  "imu_rate"
:  0

            }

      ],

      "timesync_config"
:  {

            "enable_timesync"
:  false,

            "device_name"
:  "/dev/ttyUSB0",

            "baudrate_index"
:  2

      }

}

步骤 2:安装 Livox SDK 和 ROS 驱动

安装 SDK:
git  clone  https://github.com/Livox-SDK/Livox-SDK.git

cd
  Livox-SDK

mkdir
  build &&  cd  build

cmake .. && make

sudo
  make install
编译 ROS 驱动(以 livox_ros_driver2 为例):
catkin_make -DCATKIN_WHITELIST_PACKAGES="livox_ros_driver2"

1.3 常见问题排查

问题:ping 通了,但 ROS 没有收到点云数据
网络连通不等于数据流通。此时需要用网络分析工具验证。
诊断步骤:
sudo  tcpdump -i enp2s0 src 192.168.1.183
预期输出:
IP 192.168.1.183.56200 > USV1.56201: UDP, length 425
如果没有 UDP 包,说明雷达未在发送数据,检查:
• 雷达 IP 配置是否正确
• 雷达和工控机是否在同一网段
• 是否需要修改工控机 IP
解决方案:
修改  /etc/netplan/01-network-manager-all.yaml,调整工控机 IP 对应雷达所在网段:
ethernets:

   enp2s0:

      addresses:

         -
  192.168.1.222/24   # 从 171 改为 222
应用后重新启动驱动即可。
核心经验:网络问题 80% 是由 IP 地址不在同一网段或网络策略阻止导致的。始终先用 ping 和 tcpdump 诊断。

---

第二部分:定位建图模块(FAST-LIO)

FAST-LIO 是一个高效的激光雷达-惯性里程计(LIO),将激光点云和 IMU 数据融合,实时输出机器人位姿和特征地图。

2.1 下载与编译

git  clone  https://github.com/hku-mars/FAST_LIO.git

cd
  FAST_LIO

catkin_make -DCATKIN_WHITELIST_PACKAGES="FAST_LIO"

2.2 适配 Livox Mid360

FAST-LIO 原生支持 Livox 雷达,但需要确保消息类型匹配。
修改 CMakeLists.txt 和源代码中的消息依赖:
# 添加依赖等待消息生成

add_dependencies
(fastlio_mapping  ${PROJECT_NAME}_generate_messages_cpp)

add_dependencies
(fastlio_mapping livox_ros_driver2_generate_messages_cpp)
修改源代码头文件引用:
• 将  include  <livox_ros_driver custommsg.h="">  改为  include  <livox_ros_driver2 custommsg.h="">
• 更新 package.xml 中的依赖声明

2.3 启动与验证

roslaunch fast_lio mapping_mid360.launch
在 RViz 中应该能看到点云和轨迹。
关键点:FAST-LIO 通常在启动后需要 5-10 秒来初始化 IMU 偏差。如果看不到地图,检查是否有点云话题。

2.4 外参配置

外参(extrinsic parameters)是雷达相对于机器人本体的位置和姿态。错误的外参会导致建图失效。
文件路径:  在启动脚本或参数服务器中设置
extrinsic_T:  [-0.011,  -0.02329,  0.04412]   # X, Y, Z 偏移量

extrinsic_R:
  [1,  0,  0,  0,  1,  0,  0,  0,  1]   # 旋转矩阵(单位矩阵表示无旋转)
验证外参是否加载:
rosparam list | grep extrinsic

rosparam get /usv_0/laserMapping/mapping/extrinsic_T
重要提示:不要在启动文件中随意修改外参格式,否则参数服务器无法正确加载,导致 FAST-LIO 无法初始化。

2.5 Odometry 速度信息补充

问题描述:  FAST-LIO 原生输出的  nav_msgs::Odometry  消息只包含位置和姿态(Pose),但缺少线性和角速度(Twist)信息。这导致下游模块(如控制器、路径规划器)无法获取机器人的实时速度,影响系统的闭环控制精度。
为什么需要速度信息?
•  轨迹跟踪控制:控制器需要知道实际速度与指令速度的偏差,以计算控制量
•  状态预测:路径规划器需要当前速度来预测未来轨迹和避障
•  数据融合:下游的传感器融合(如视觉+里程计)需要速度先验
解决方案:

fast-lio内部实际已经计算了速度信息,但默认没有发布。我们需要修改源码,在发布  nav_msgs::Odometry  消息时补充速度信息。推荐使用AI工具辅助完成即可。
关键点:坐标系定义
若 FAST-LIO 输出的是 FLU 坐标系,但控制器期望 FRD,必须在补充速度信息时进行坐标系转换

---

第三部分:路径规划模块(Ego-Planner-v2)

Ego-Planner-v2 是一个高效的轨迹规划器,能够在复杂环境中快速生成光滑、碰撞自由的轨迹。

3.1 编译流程

Ego-Planner 依赖于 FAST-LIO 的消息定义,因此编译顺序很重要。
第一步:编译 livox_ros_driver2
catkin_make -DCATKIN_WHITELIST_PACKAGES="livox_ros_driver2"
第二步:编译其他所有包
catkin_make -DCATKIN_WHITELIST_PACKAGES=""

3.2 参数调优

关键参数通常在 launch 文件中配置:
max_vel:  1.0                 # 最大速度(m/s)

max_acc:
  0.5                 # 最大加速度(m/s²)

planning_horizon:
  8.0   # 规划地平线(秒)
常见问题:规划器输出奇怪的轨迹?检查是否有导航栅格误差或外参配置错误。

---

第四部分:系统集成与启动

推荐使用 tmux 来管理多个 ROS 节点的启动和监控。以下是一个示例脚本,展示如何在 NUC 上启动所有模块,并在笔记本上远程可视化。
3.png
注意:真机实验时,水面反射导致无人船与WIFI通讯不稳定,根据经验,换成便携式WiFi(本项目采用的GLiNet MT3600BE,Type-C供电)放置在船上,可以提高通信稳定性。

4.1 远程启动脚本(NUC 端)

在无人船的 NUC 工控机(10.1.1.171)上创建启动脚本,以正确顺序启动所有模块:
#!/bin/bash

# 设置 ROS 环境变量

export
  ROS_MASTER_URI=http://10.1.1.171:11311

export
  ROS_IP=10.1.1.171

# 启动 ROS Master

roscore &

sleep
  3

# 窗格 0:启动 TF 广播

tmux new-session -d -s ros_usv -n  "USV_System"

tmux send-keys -t ros_usv:0  "source devel/setup.bash && roslaunch tf_broadcaster tf_broadcaster.launch"  C-m

# 窗格 1:启动 MPC 控制

tmux split-window -h -t ros_usv:0

tmux send-keys -t ros_usv:0.1  "source devel/setup.bash && roslaunch fusv_control fusv_startup.launch"  C-m

# 窗格 2:启动激光雷达

tmux split-window -v -t ros_usv:0.1

tmux send-keys -t ros_usv:0.2  "source devel/setup.bash && roslaunch livox_ros_driver2 rviz_MID360.launch"  C-m

# 窗格 3:启动 FAST-LIO

tmux split-window -v -t ros_usv:0.2

tmux send-keys -t ros_usv:0.3  "source devel/setup.bash && roslaunch fast_lio mapping_mid360.launch"  C-m

# 附加到会话

tmux attach -t ros_usv

4.2 本地可视化(笔记本远程调试)

在实验中通过笔记本(10.1.1.200)显示 RViz,同时与 NUC 进行通信:
#!/bin/bash

# 配置环境变量指向 NUC

export
  ROS_MASTER_URI=http://10.1.1.171:11311

export
  ROS_IP=10.1.1.200   # 本工作站 IP

# 启动多个 RViz 实例

rviz -d ego_planner.rviz __name:=rviz_ego_planner &

rviz -d loam_livox.rviz __name:=rviz_fast_lio &

rviz -d display_lidar.rviz __name:=rviz_livox &
网络配置技巧:确保本地工作站和 NUC 在同一网段(如 10.1.1.0/24),且防火墙允许 ROS 通信端口。
记录数据:rosbag记录数据一定要在 NUC 上进行,远程数据频率只有10Hz,无法满足后续复现和分析需求。

---

第五部分:经验总结与常见坑

5.1 外参估计问题

症状:  激光点云看起来"扭曲"或地图无法对齐
原因:  外参(雷达相对于机器人的位置和姿态)配置错误
解决方案:
1. 关闭 FAST-LIO 的在线外参估计(extrinsic_est_en: false
2. 手动标定外参(可通过静止时的建图效果反推)
3. 验证参数加载:rosparam get /usv_0/laserMapping/mapping/extrinsic_T

5.2 launch 文件修改导致参数加载失败

症状:  参数服务器无法找到特定参数
原因:  launch 文件中参数格式错误或路径不匹配
预防方案:
• 不要随意修改 launch 中的参数格式
• 使用  rosparam load  前先验证 YAML 语法
• 启动时检查参数是否成功加载

5.3 编译顺序问题

症状:  编译时出现"未找到消息类型"的错误
原因:  依赖包未先编译,导致消息定义不可用
解决方案:  严格遵循编译顺序:
livox_ros_driver2 → FAST-LIO → Ego-Planner → 所有其他包

5.4 网络隔离问题

症状:  NUC 上一切正常,但远程工作站收不到话题
原因:  网络分段或防火墙阻止
排查步骤:
# 1. 检查能否 ping 通

ping 10.1.1.171

# 2. 查看是否能连接 ROS Master

rostopic list

# 3. 检查 ROS_MASTER_URI 和 ROS_IP 是否设置正确

echo
  $ROS_MASTER_URI

echo
  $ROS_IP
黄金法则:80% 的分布式 ROS 问题都源于网络配置错误。始终先检查网络环境变量。

---

结语

恭喜你读到这里!从硬件联通、驱动配置,到定位建图、轨迹规划,再到系统集成和故障排查,我们覆盖了 USV 开发过程中的核心环节。
这份指南的核心思想是:逐模块验证,循序渐进集成,系统日志先行。不要被整个系统的复杂度吓倒——每一个模块本身都相对独立,只要确保网络通、驱动装、参数对,剩下的就是反复调试和优化。

关键要点回顾

1.  网络是基础:激光雷达、ROS 通信、远程控制都依赖网络。遇到怪问题,先 ping、再 tcpdump,99% 的情况下是网络配置或 IP 地址。
2.  模块独立性:在集成前,务必单独验证每个部分(激光雷达能否发数据、FAST-LIO 能否建图、Ego-Planner 能否规划)。
3.  参数和外参很关键:特别是激光雷达的外参和坐标系定义,这些往往是隐藏的、难以调试的问题。花时间验证一次,可以省掉后续的百般困扰。
4.  文档和日志是你的朋友:记录每次修改、每个成功的配置、每个失败的原因。后续复现和扩展会轻松很多。

进阶建议

•  性能优化:一旦系统跑通,可以考虑优化计算图、减少话题频率、使用话题同步等手段,提升整体效率。
•  鲁棒性测试:在不同环境、不同天气、不同的船体配置下测试,记录系统的适应范围。
•  模块替换:掌握这套框架后,可以合理地替换其中的模块(如换成其他定位算法、规划器或控制器),逐步构建属于自己的系统。

最后的话

USV 是一个涉及感知、规划、控制多个领域的系统。开发过程中会遇到各种出乎意料的问题,但这正是学习的机会。每解决一个问题,你就深入理解了系统的一个层面。
祝你的 USV 早日遨游四海!如果在开发中遇到新的坑或有更好的解决方案,欢迎反馈和分享,让我们一起完善这份指南。

---

相关资源:
• FAST-LIO GitHub
• Ego-Planner GitHub
• ROS 官方文档
• Livox SDK
祝开发顺利!
  

</livox_ros_driver2></livox_ros_driver>

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码