☰
EGO-Planner + RealSense D435i:复现Fast-Lab无人机穿林全流程指南
2026/10/6 11:14:32 网站建设 项目流程

开头写什么?我直接从"B站视频"切入,用一个真实的场景钩子。


在B站看到浙大Fast-Lab的无人机穿林视频时,我相信不少人第一反应是"这是特效吧"。一架四旋翼在杂乱树枝和柱子之间高速穿行,轨迹像老司机开赛车一样流畅,几乎没有冗余的刹车和转向。评论区最高赞的问题永远是:"这代码开源了吗?"答案是开源了,而且核心就是EGO-Planner加Intel RealSense D435i这套组合。

我自己是做机器人运动规划的,去年花了大概三周,从看视频、下代码、跑仿真,一路折腾到真机悬停和慢速绕障,中间踩了非常多的坑。这篇博文就是完全围绕"如何复现这套项目"来写的:先讲清楚EGO-Planner和D435i各自扮演什么角色,再讲硬件选型、软件环境、D435i标定到底标什么,然后给出从仿真到真机的完整操作路线,最后把我实际遇到的坑和排查方法全部列出来。适合手里有或者准备入手一台四旋翼、想搞无人机自主导航的学生、工程师和极客,哪怕你是第一次接触PLANNER,按这个流程走也大概率能跑起来。

1. 先把"穿树飞行"这件事拆开看

1.1 EGO-Planner在这个项目里到底干了什么

很多人把EGO-Planner理解成"避障算法",这个说法不算错,但不完整。它本质是一个实时的局部轨迹规划器,输入的是环境感知信息(点云或地图),输出的是从当前状态到目标点的速度、加速度、姿态指令。在Fast-Lab的框架里,它是整条自主飞行链路里"做决策"的那个模块。

EGO-Planner的全称是Efficient Geometry-based local planner。它最核心的贡献是让无人机能够在没有预先建好的全局地图下,仅依赖局部传感器数据,不断优化出一条平滑、安全、动力学可行的轨迹。和传统方法不一样的地方在于,它不需要把空间全部离散成网格然后做昂贵的ESDF(欧式符号距离场)计算,而是通过"碰撞信息"直接在原始点云附近构造梯度,把轨迹优化变成一个效率很高的优化问题。你可以粗暴地把它理解成:不是画一张精确的地图再找路,而是边走边用"周围哪块空间是障碍物"来引导轨迹修正,所以对算力要求低、反应非常快。

在视频里那些行云流水的穿枝动作,实际就是EGO-Planner每几十毫秒收到一次新的点云,然后基于当前无人机速度、目标点和障碍分布,重新规划出未来一小段时间的轨迹。它强大的地方在于对动态环境也有一定鲁棒性,突然闯入的障碍能在下一帧重新规划时被绕开。

1.2 RealSense D435i负责把"世界"变成无人机懂的语言

EGO-Planner再聪明,也得有人告诉它"左边三米有柱子、右前方两米是树枝"。这个感知环节,在Fast-Lab很多项目里就是由Intel RealSense D435i完成的。

D435i是一款主动式红外立体深度相机,内置两颗红外传感器和一个红外点阵投射器,能够输出RGB彩色图和深度图。在无人机上我们更关心深度图——每个像素保存的是该位置到相机的距离。深度图再结合相机内参,就可以生成一帧一帧的3D点云。EGO-Planner吃的就是这个点云。

选D435i而不是激光雷达或者普通双目相机,主要有几个原因。第一是重量和体积,D435i大概只有几十克,一个手掌大小,塞进机载电脑旁边很轻松;第二是深度范围,标称0.2米到10米左右,对于几米每秒的室内或园区飞行完全够用;第三是它自带一颗IMU(惯性测量单元),后续要跑VINS-Fusion这种视觉惯性里程计做定位时非常方便;第四是ROS支持太成熟了,官方驱动realsense-ros直接发布点云、深度、IMU话题,省掉大量开发时间。

当然D435i不是万能的。它是主动红外方案,在强阳光下会有一点衰减,对玻璃、黑色吸光物体、水面的深度估计也容易出错。这些坑后面在第五章专门说。

1.3 一条完整的复现链路由哪些模块组成

我把这套系统拆成六块,也是后续复现的顺序:

  1. 定位模块:无人机世界里没有GPS(或者只有很弱的GPS)时,需要知道"我在哪"。常用方案是VINS-Fusion,融合D435i的图像和IMU数据输出相机位姿;有动捕系统的地方也可以用Motive这类光学动捕。
  2. 感知模块:D435i的深度信息转成局部点云,加上一些预处理,比如降低分辨率、裁剪太远太近的点、降噪。
  3. 局部地图模块:EGO-Planner会把点云转换成代价环境,实际代码里就是构建一个局部的占用地图或者点云体素块。
  4. 轨迹规划模块:EGO-Planner根据目标点、当前状态和地图信息解算出轨迹,输出位置、速度、加速度序列。
  5. 控制模块:把规划出的轨迹转换成飞行控制器能接收的指令。Fast-Lab社区常配合px4ctrl这个控制包,或者直接通过MAVROS发期望位置指令给PX4。
  6. 飞控与执行机构:PX4飞控在OFFBOARD模式下接收外部指令,控制电机转速,最终让机体按轨迹飞。

这里我特别想强调定位模块。很多新手上来就把D435i点云丢给EGO-Planner,以为就能飞了,结果无人机一离开机架就飘。原因很简单:EGO-Planner只解决"往哪走"和"怎么走","我现在在哪"必须由别的模块给。在GPS信号好的室外,你可以用PX4自带的位置估计;但在室内或者楼间GPS不稳定的场景,一定要先解决视觉定位,否则规划器和控制器都在对着一个错误的"当前位置"做计算,越算越飞偏。

2. 硬件准备:视频里那台无人机到底怎么配的

2.1 为什么是D435i而不是T265、激光雷达或纯双目

我在初期选传感器时对比过好几种方案。Intel RealSense T265是一颗双目鱼眼相机加IMU,它的主要能力是输出视觉惯性里程计(VIO),直接给你定位结果,但它不输出深度点云。也就是说,如果你用T265,还得额外再带一个深度相机才能喂EGO-Planner,这样一来重量、功耗、装机的复杂度全上去了。D435i一个人干两份活:测量深度给规划器,同时成像给VINS-Fusion做定位,这才是它在这个项目里最舒服的位置。

激光雷达(比如Livox MID-360这类固态雷达)在感知距离和抗光照上确实比D435i强,但价格基本上是D435i的十几倍,而且驱动、标定、点云处理的门槛更高。对于"复现Fast-Lab项目"这个目标来说,D435i是最平衡的选择:成本低、资料多、官方支持好、社区踩坑记录也多,出了任何问题基本都能搜到答案。

纯被动双目(比如D400系列去掉主动红外投射器)也可以,但室内白墙、弱纹理环境深度会大面积缺失,对规划器非常不友好。D435i有主动红外投射器,在室内生成可见纹理,能显著提升深度图完整性。

2.2 整机怎么搭:机架、飞控、机载电脑和电源的搭配

传感器定了之后,整机配置是我踩坑最多的一个环节。因为我早期只顾着省钱,拿了一台450mm轴距的老机架,加一块Pixhawk 4飞控,配了一块树莓派4B当机载电脑,结果发现根本飞不了——不是算法问题,是整机重量逼近起飞限重,留出来的机动裕量太小,EGO-Planner在后端优化时算出的许多轨迹对这台"胖机"根本不可行。

如果你要复现这套项目,我建议机架选轴距350-450mm的X型四旋翼,电机建议配至少500g单轴推力的组合,电池用4S规格,机载电脑选择NUC、Jetson Orin Nano这类性能远强于树莓派的x86或ARM电脑。因为EGO-Planner+Livox?(不是)——至少EGO-Planner加VINS-Fusion加D435i点云处理,树莓派4B算起来很吃力,点云帧率会掉到5Hz以下,规划器反应明显迟钝。

供电要分两路:飞控、电机、电调用动力电池直供或带BEC的电源模块;机载电脑、D435i、数传模块建议通过独立的5V降压模块或专门的稳压模块供电,避免电机启动瞬间电压跌落导致相机掉线、电脑重启。我遇到过最尴尬的情况就是推油门起飞瞬间D435i深度流突然中断,排查半天发现是USB供电被拉崩了。

2.3 相机安装角度和减震的小细节

D435i的安装角度直接影响感知效果。视频里Fast-Lab的无人机相机通常是前向稍微下倾15到20度,这个角度既能看到前方障碍,又不会在平飞时看到大片地面导致规划器误以为前方空间很多。如果你装得完全水平,在稍微低头加速时,近处地面会大量进入视野,点云里冒出很多"地面点",EGO-Planner会把它们当成障碍,导致无人机飞飞停停。

另一个细节是减震。D435i同时给VINS-Fusion提供图像和IMU数据,机身高频振动会严重影响VINS的位姿估计。强烈建议在相机和机架之间加一层减震泡棉或专门的相机减震球,把高频振动滤掉。不过要注意不能太软,否则相机会在飞行中摆动,反而制造新的运动模糊。

3. 软件环境与D435i标定的正确打开方式

3.1 系统的"版本焦虑"怎么选

EGO-Planner官方仓库是基于ROS开发的,最常见的是Ubuntu 18.04 + ROS Melodic,也有不少人在20.04和Noetic上跑通过。如果你是第一次接触这个项目,我建议直接用官方README里推荐的组合,不要一上来就追新系统,因为PX4固件、MAVROS、realsense-ros、VINS-Fusion在18.04+Melodic下的兼容性最稳,B站和博客上的教程也基本是这个组合,出问题时能搜到现成答案。

安装顺序大概是:装Ubuntu系统、装ROS、拉取EGO-Planner仓库并编译、安装realsense-ros、安装MAVROS、选择PX4 SITL或真机飞控固件、配置VINS-Fusion。每一步都有官方文档,重点在于每个包的依赖要装干净,尤其是rosdep这一步。我遇到至少三次编译报错都是因为缺了某个系统依赖,最后用rosdep install一条命令解决的。

3.2 D435i标定到底标的是什么

最新网络热词里"realsense d435i标定"非常火,我估计很多人复制这个项目时都在标定这里卡住了。D435i的标定其实分成三件不同的事,不要混为一谈。

第一件是深度相机本身的厂内标定,也就是让深度图在不同温度、不同距离下尽量准确。如果你买的D435i是全新的,出厂标定是够用的,不需要用户自己做。只有当相机受过磕碰、外壳变形、深度图明显出现系统性误差时,才需要用Intel官方的Dynamic Calibrator重新标定。这个工具需要在黑色标定板的帮助下完成,操作并不复杂,但很多人其实根本不需要走到这一步。

第二件是IMU的标定。D435i内置一颗IMU,如果你要用它跑VINS-Fusion,IMU的噪声和随机游走参数最好通过imu_utils这种工具实测出来,不要直接用默认值。实测方法很简单:将相机静置一到两小时,记录IMU数据,然后离线计算得到加速度计和陀螺仪的噪声密度和随机游走参数,把这些参数填进VINS配置文件里。这一步对定位精度的影响非常大,特别是静止或低速状态下的漂移。

第三件是相机到机体坐标系的外参标定。EGO-Planner规划时,点云需要从相机坐标系转换到机体坐标系或世界坐标系。如果你用VINS-Fusion输出相机在世界系中的位姿,相机和机体的固定外参也参与了这个变换。比较粗糙但可用的做法是量好相机的安装位置和欧拉角,填进配置里;追求精度可以用Kalibr做相机-IMU外参标定,或者用手的眼标定方法。

我的建议是:第一件通常不做,第二件要认真做,第三件先用测量法,等能稳定悬停后再考虑上标定板精标。别一上来就卡在标定上,很多项目根本不需要那么高的精度就能飞起来。

3.3 EGO-Planner的核心参数:给它一个"飞机的性格"

EGO-Planner编译通过、能跑起仿真后,真正决定飞行手感的是配置文件。我建议用官方仓库自带的参数作为起点,只调整几个关键量:

  • 无人机尺寸和膨胀半径(常见参数如collision_radius、model_size):这个参数直接决定规划器离障碍物多远算碰壁。设得越小,轨迹越激进,越容易贴障碍飞行;设得越大,越安全,但可能出现"明明能过去却绕路"的情况。
  • 最大速度和最大加速度(max_vel、max_acc):视频里飞得快不是因为电机猛,而是规划器允许它飞得快。第一次真机首飞建议把最大速度压到2到3米每秒,最大加速度压到3到5米每秒平方,等验证整个链路稳定后再逐步放开。速度极限设得过高而且机体推力不够时,规划轨迹会经常优化失败。
  • 规划频率和地图尺寸:规划器每次收到新点云都会重新规划一次轨迹,频率太低则反应迟钝,频率太高CPU吃紧。地图尺寸则决定了无人机能看到多远的未来。D435i的有效深度约10米,地图尺寸设6到8米是比较合理的选择,太远的大部分点云都是无效噪声。

这些参数并没有一个万能最优值,它高度依赖机身动态特性和飞行场景。我的建议是:在仿真和手动飞行测试中,每调整一个参数就记录飞行表现,不要一次改多个,否则出了奇怪现象根本定位不到原因。

4. 从仿真到真机的完整复现流水线

4.1 先让规划器在仿真里跑出第一批轨迹

我强烈建议任何人不要跳过仿真直接上真机。EGO-Planner官方仓库通常会带一个仿真器或者提供Gazebo模型,你将四旋翼模型加载到Gazebo里,启动EGO-Planner节点,再打开Rviz,就能看到飞机模型在三维环境中飞行。

仿真阶段的核心任务是验证三件事:第一,点云输入链路是否正常,D435i仿真模型是否向规划器发布了有效点云;第二,EGO-Planner能否根据点云和随机目标点生成平滑轨迹,Rviz里会显示起点到终点的规划曲线,绿黄渐变代表速度;第三,如果仿真里没有定位模块,可以直接用仿真模型的真值位姿代替,这样规划器会运行得非常"理想"。

这个阶段特别适合调上面说的那批参数。我第一次跑仿真时,发现飞机老是突然蹿高又压下,后来定位到是点云里有大片地面引发的膨胀区域,把安全距离调小并在点云预处理里裁剪掉靠近地面的部分后,飞行就平稳了。

4.2 定位解决不了,什么规划器都白搭

仿真的理想条件掩盖了真机最麻烦的问题:定位。如果在室内,没有任何GPS,无人机必须靠自己感知知道自己在哪。这里我推荐VINS-Fusion配合D435i。

VINS-Fusion是Fast-Lab团队常用的视觉惯性定位方案,核心是读取相机图像和IMU数据,经过紧耦合优化后输出相机在世界坐标系中的位姿。你需要在VINS配置里正确填入D435i的相机内参、畸变系数、IMU到相机的外参和IMU噪声参数,这些参数来源就是第三章说的IMU标定和外参标定。

把VINS-Fusion跑起来,用D435i对着一个有纹理的房间慢慢移动,在Rviz里看是否输出稳定的轨迹,相机移动时轨迹是否平滑跟随,静止时漂移是否可控。如果静止时轨迹还在飘,多半是IMU外参或噪声参数没填对。VINS输出的是视觉坐标系,不是机体坐标系,后续控制模块做坐标转换时要把这一层关系理清楚,我习惯用一个简单的TF广播把VINS坐标系接到机体系上。

4.3 真机首飞前的最后一百米

真机飞行是整个复现过程中最刺激也最容易出问题的一段。我的首飞流程是这样安排的:

  1. 先不装螺旋桨,用代码通过MAVROS发送小的位置指令,确认飞控能收到来自机载电脑的OFFBOARD指令,并观察电机是否按预期响应。
  2. 装桨后到室外宽敞无人场地,先用遥控器手动起飞到1米高度。
  3. 然后切到OFFBOARD模式,让EGO-Planner接管,发送一个只有零点几米的微动目标点,观察无人机是否自己横移到目标位置。
  4. 逐步增加目标点距离和速度,每一步都做好随时切回手动模式的准备。
  5. 全程另一位同事跟着无人机,STOP键或者遥控器的紧急关闭开关要一直在手上。

EGO-Planner和飞控之间的控制指令流一般是这样的:规划器输出带时间戳的位置、速度、加速度轨迹,控制模块按当前时间采样轨迹得到期望状态,然后通过MAVROS发送给飞控。你可以选择发位置设定点,也可以发速度设定点,PX4的OFFBOARD模式都支持。注意OFFBOARD模式下,飞控要求外部指令必须持续不断到达,一般要保持在5Hz以上,否则会超时自动退出OFFBOARD回到自稳模式。突然退出OFFBOARD本身不算危险,但如果切回的是手动模式而遥控器又不在手边,那就会很麻烦。所以我的习惯是:机载电脑没准备好绝不切OFFBOARD,遥控器拇指始终待命。

5. 实践中的踩坑记录与排查方法

5.1 D435i在使用中最常见的几种"翻车"

第一个坑是暖机漂移。D435i刚开机时芯片温度没稳定,深度图会有明显偏差,特别是在开机前两分钟内。我一开始不知道这件事,总是一上电就起飞,深度数据忽远忽近,导致EGO-Planner生成的轨迹来回抖动。后来养成习惯,至少开机静止五到十分钟等深度预热,深度图稳定了再进入飞行流程。

第二个坑是USB接口和带宽。D435i需要USB 3.0,且实际使用中占用带宽比较大。如果你把它接到机载电脑的前置USB口或者经过延长线,经常会出现深度流时断时续。建议直连主板原生的USB 3.0接口,避免使用Hub。机载电脑如果同时接遥控接收机、数传、相机,USB电源管理很容易出现问题,Linux下可以用lsusb -t检查设备连接状态。

第三个坑是点云噪点。D435i在室外阳光下、玻璃幕墙前、纯白色吸光物体上,深度容易出现孔洞和飞点。EGO-Planner收到飞点后会把远处一个孤立点当成障碍,规划出一条奇怪绕路。解决办法是在点云预处理阶段加上距离裁剪和时间滤波,比如只保留0.5米到8米范围内的点,并做体素降采样再送入规划器。

5.2 EGO-Planner规划器的几类典型故障

我在跑EGO-Planner时遇到过几个很有代表性的故障。一是规划结果不断震荡,无人机在目标点附近来回窜。这通常是点云更新频率和规划频率不匹配,或者点云噪声太大导致每次规划的起始段不同。我把点云降采样后,震荡明显缓解。

二是轨迹规划失败甚至不输出。EGO-Planner在环境过于复杂且膨胀半径过大时,可能找不到可达的轨迹。这时候检查日志里是否提示约束不满足,如果是,把安全距离和速度上限适当放松一点。另外,无人机初始状态必须传给规划器一个合理的"当前速度",如果你冷启动时填的初始速度不对,规划器可能在本地最小解里出不来。

三是规划器和定位之间出现延迟。VINS输出位姿、EGO-Planner收到位姿后重新规划,整个链路总延迟超过一两百毫秒时,无人机飞行会有"打太极"一样的迟滞感。排查方法是用rostopic hz逐个检查相机、VINS、EGO-Planner输出频率,找出哪个环节掉链子,再优化对应节点的处理逻辑。

5.3 真机安全底线,这句话必须放在最后

所有自主无人机的复现项目,到最后拼的不是算法有多花哨,而是安全底线够不够扎实。我第一次上真机前,特意把首飞地点选在开阔操场,周围一百米内没有人车,地面平整。飞行高度保持在2米以下,通过B站视频里学的"先低速贴地"策略,把所有速度参数压到非常保守。

还有一件事我非常后悔没早点做:给机载电脑配一个一键急停脚本。后来我通过MAVROS绑定了一个独立按键,按下后立即发送紧急停桨指令,效果比慌乱中找遥控器开关靠谱得多。这套脚本不复杂,但关键时刻能救无人机,也更让我理解了为什么Fast-Lab的很多试飞视频里,地面站总有一个一直放在急停键上的手指。

写在最后的个人体会

这套项目我从B站视频看到真机起飞,最大的收获不是跑通了EGO-Planner,而是真正理解了自主无人机其实是"感知-定位-规划-控制"四个模块的接力赛,任何一个环节薄弱都会拖垮整条链路。D435i标定、VINS外参、EGO-Planner参数,这些东西单拎出来每一个都是看似可有可无的"小事",但串起来之后,任何一个小误差都会被放大成航向偏移、高度漂移甚至炸机。

最后再分享一个我在实际使用中觉得很有用的小技巧:把EGO-Planner所有参数调参前,先在Rviz里开着点云和规划的轨迹,人拿着无人机小范围移动,模拟几次"穿过障碍"的过程,观察规划轨迹是否及时避开,再决定要不要上真机。这相当于一次廉价的"人手搬运仿真",能过滤掉大部分愚蠢错误,比直接飞省下大量修机时间。如果你现在正卡在标定或者第一个真机起飞的恐惧里,记住:所有人都是这么过来的,稳住心态,按链路一步步排查,很快就能看到属于你自己的那台无人机在树下画出流畅弧线了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询