news 2026/6/25 13:24:04

ArduSub首次潜水实战指南:从QGroundControl到水下稳定定高

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ArduSub首次潜水实战指南:从QGroundControl到水下稳定定高

1. 项目概述:这不是遥控玩具,而是一次水下工程实践的起点

“ArduSub入门教程-首次潜水”——这八个字背后,不是一段视频播放列表,也不是某款消费级水下无人机的开箱指南,而是一套面向真实水下作业场景的开源自主水下航行器(AUV)系统首次闭环验证的完整实录。我带过十几支高校水下机器人队,也帮三家海洋装备初创公司做过原型机调试,最常被问到的问题不是“怎么飞”,而是“第一次下水前,到底该信什么、防什么、验什么”。ArduSub不是Arduino加个防水盒就能跑起来的玩具,它是一套融合了飞控逻辑、流体动力学约束、水下通信衰减模型和嵌入式实时控制的垂直领域系统。核心关键词——ArduSub、QGroundControl、BlueROV2硬件兼容、MAVLink协议、深度定高、姿态稳定、水下视觉校准——每一个都直指水下作业不可妥协的底层能力。这个教程解决的,是绝大多数人卡在“连上QGC但舵机不动”“下潜3米就横滚失控”“摄像头画面全绿却查不出白平衡参数在哪改”的真实断点。适合三类人:高校海洋机器人方向的学生(别再只调PID参数不看流体扰动补偿)、中小海洋科技公司的硬件工程师(尤其刚接手ROV产线调试的)、以及有明确水下巡检/测绘需求的行业用户(比如水产养殖塘底沉积物监测、小型水库坝体裂缝初筛)。它不承诺“5分钟上手”,但能确保你第一次把ROV放进水里时,知道每个LED灯闪烁代表什么状态,明白为什么串口日志里那行EKF3: velNE static check fail比水面风速还值得你立刻中止下潜。

2. 系统设计与方案选型:为什么必须从BlueROV2硬件栈切入

2.1 硬件选型不是配置单,而是水下物理约束的具象化

很多人看到ArduSub文档第一反应是:“我能用自己焊的电路板吗?”答案是技术上可以,但实操中90%的首次失败源于硬件链路的隐性失配。ArduSub的底层驱动层(AP_Motors库)对电调响应延迟、电机KV值、螺旋桨推力曲线有硬性要求。我们实测过三组对比:

  • 自研四轴框架+普通无刷电调+30mm桨:下潜至1.2米即出现周期性俯仰振荡,FFT分析显示主频17Hz,与电调PWM刷新率谐波共振;
  • BlueROV2标准套件(T200推进器+BLHeli_S电调):在相同水深下姿态角波动<±0.8°,且EKF3状态估计收敛时间稳定在2.3秒;
  • 改装版(T100推进器+同款电调):虽能下潜,但水平移动时侧向推力不足导致路径跟踪误差达42cm/10m。

提示:T200推进器标称推力2.2kgf@12V,但实际水下有效推力需乘以0.68的流体效率系数(基于ISO 13628-8水下设备测试标准),这才是ArduSub内部MOT_THR_MAX参数的物理依据。

因此,本教程强制采用BlueROV2硬件栈作为基准平台。它不是厂商捆绑销售策略,而是经过200+小时水池测试验证的物理接口契约:防水接头IP68等级对应0.5MPa静水压(50米深度安全余量)、CAN总线拓扑结构规避水下RS485共模干扰、双IMU冗余设计应对磁罗盘水下漂移。当你拧紧最后一个O型圈时,你装配的不是机械结构,而是整套控制算法的物理边界条件。

2.2 软件架构的本质:MAVLink不是通信协议,而是状态同步语言

ArduSub的“Sub”后缀常被误解为“潜艇”,其实质是“Submersible”——可潜航器。其软件架构核心是MAVLink 2.0协议的状态机映射。关键认知突破在于:QGroundControl(QGC)界面上拖动的滑块,本质是向飞控发送MAVLINK_MSG_ID_SET_POSITION_TARGET_LOCAL_NED消息,而飞控固件中的control_auto.cpp模块会将该目标分解为三个控制环:

  1. 外环(位置环):将NED坐标系下的目标点转换为期望速度向量,输出至中环;
  2. 中环(速度环):结合当前DVL(多普勒计程仪)或压力传感器数据,计算所需推力分配,输出至内环;
  3. 内环(姿态环):通过PID调节各推进器PWM占空比,实现六自由度力矩平衡。

这个三层结构解释了为什么“直接调高PSC_POSXY_P参数会让ROV像醉汉一样乱晃”——你跳过了速度环的阻尼设计,强行用位置指令冲击姿态执行器。我们在东海某试验场曾因未启用FS_CRASH_CHECK故障保护,导致ROV在淤泥区持续输出最大下潜推力,最终螺旋桨被海藻缠绕后电机堵转烧毁。这印证了一个铁律:水下控制没有“快速迭代”,只有“物理容错设计”。

2.3 首次潜水的真正目标:不是下潜深度,而是状态可观测性验证

行业新人常把“首次潜水成功”定义为“ROV沉到水底并返回”。这是危险的认知偏差。真正的里程碑是:所有关键传感器数据在QGC中连续、无跳变、符合物理常识地呈现。具体包括:

  • 深度传感器(MS5837)读数与压力换算值偏差<±0.05m(需校准零点偏移);
  • IMU三轴加速度计静态均值在±0.02g内(排除安装应力);
  • 磁罗盘航向角在旋转360°过程中无突变跳变(验证软铁/硬铁补偿有效性);
  • 推进器电流读数与PWM指令呈严格线性关系(斜率误差<±3%,反映电调健康状态)。

这些指标不依赖摄像头画面,却决定了后续所有高级功能(如自动路径跟踪、声呐SLAM建图)的可靠性根基。我们团队在宁波梅山湾试验时,曾因忽略磁罗盘校准,导致ROV在码头钢构附近航向角跳变达47°,自动返航指令直接让设备撞向防撞桩。所以本教程的“首次潜水”,本质是一次水下传感器网络的可信度审计。

3. 核心细节解析与实操要点:那些手册里不会写的物理真相

3.1 防水密封的毫米级博弈:O型圈压缩率不是经验值,是材料力学方程

BlueROV2的舱体密封依赖三道O型圈:主舱盖(70 Shore A硅胶)、电子仓盖(60 Shore A氟橡胶)、摄像头端口(50 Shore A EPDM)。新手常犯的错误是“拧紧到手感发涩”,这会导致硅胶O型圈永久变形。正确做法需计算压缩率δ:

$$ \delta = \frac{d_0 - d_f}{d_0} \times 100% $$

其中$d_0$为O型圈原始截面直径,$d_f$为压缩后截面高度。实测数据显示:

  • 硅胶O型圈最佳压缩率18%~22%(对应拧紧扭矩0.8~1.2 N·m);
  • 氟橡胶需25%~30%(扭矩1.5~2.0 N·m);
  • EPDM仅需12%~15%(扭矩0.4~0.6 N·m)。

注意:使用扭力扳手时,必须在螺栓涂抹真空脂(如Dow Corning 111),否则摩擦系数变化会导致实际压缩率偏差达±7%。我们曾用未涂脂的扳手装配,导致EPDM圈压缩率仅9%,下潜2米后摄像头端口渗水。

更隐蔽的风险来自温度。硅胶在15℃以下弹性模量升高40%,此时若按常温扭矩拧紧,实际压缩率会超限。解决方案是在装配环境保持20±2℃,并在下水前用红外测温枪确认舱体表面温度≥18℃。

3.2 水下视觉校准:白平衡不是调色,而是光谱衰减补偿

ROV摄像头在水下呈现绿色并非“白平衡不准”,而是水体对红光(600~700nm)的吸收系数高达0.35 m⁻¹,而蓝光(450~495nm)仅为0.02 m⁻¹。这意味着在3米水深,红光强度衰减至水面的37%,蓝光仍有86%。ArduSub的CAMERA_CONTROL模块提供两种补偿模式:

  • 自动白平衡(AWB):基于灰度世界假设,在浑浊水中失效(悬浮颗粒改变反射光谱);
  • 手动色温预设:需根据水体类型选择——淡水湖泊用6500K,近岸海水用5500K,河口混浊水用4500K。

但我们发现更有效的方案是RAW图像直出+后期光谱校正。在QGC中启用CAM_STREAM_RAW,用Python脚本加载cv2.imread()读取Bayer格式数据,应用以下变换:

# 基于实测水体光谱透射率的校正矩阵 correction_matrix = np.array([ [1.0, 0.0, 0.0], # 红通道增益 [0.0, 1.0, 0.0], # 绿通道保持 [0.0, 0.0, 0.85] # 蓝通道衰减补偿(针对3m深度) ])

该方法使珊瑚识别准确率从52%提升至89%(基于NOAA公开数据集测试)。记住:水下视觉的终极目标不是“看起来自然”,而是“光谱信息保真”,这直接决定AI识别算法的输入质量。

3.3 推进器协同控制:推力分配矩阵的物理约束解

ArduSub默认使用MOT_THRUST_VECTORING模式,其核心是求解以下方程:

$$ \begin{bmatrix} F_x \ F_y \ F_z \ M_x \ M_y \ M_z \end{bmatrix}

\mathbf{A} \begin{bmatrix} u_1 \ u_2 \ u_3 \ u_4 \ u_5 \ u_6 \ u_7 \ u_8 \end{bmatrix} $$

其中$\mathbf{A}$为8×6推力分配矩阵,$u_i$为各推进器归一化推力。问题在于:当ROV处于浅水(<1m)时,表面波浪扰动会使$F_z$需求剧烈波动,若直接按理论矩阵分配,会导致垂直推进器频繁启停。我们的解决方案是在AP_Motors6DOF.cpp中插入动态权重:

// 浅水模式下降低垂直推力权重 if (depth < 1.0f) { thrust_vector[2] *= 0.6f; // Z轴推力限制60% thrust_vector[4] *= 0.4f; // 俯仰力矩限制40% }

该修改使ROV在0.8m水深的垂直位置波动从±15cm降至±3cm。关键洞察:水下控制算法必须包含“水深感知”的上下文意识,而非纯数学最优解。

4. 实操过程与核心环节实现:从通电到首潜的逐帧记录

4.1 地面站准备:QGroundControl不是图形界面,而是飞行状态翻译器

安装QGC 4.4.4(必须用此版本,4.5+引入的MAVLink 2.0加密握手会与旧版ArduSub固件冲突)后,首要任务是禁用所有非必要插件。在Settings > General > Plugin Settings中关闭:

  • Log Download(日志下载会占用USB串口带宽);
  • Mission Planner(与ArduSub任务规划逻辑冲突);
  • Video Streaming(首潜阶段禁用视频流,优先保障控制链路)。

连接ROV后,在Vehicle Setup > Parameters中重点检查三项:

参数名推荐值物理意义验证方法
FS_CRASH_CHECK2启用碰撞检测(加速度突变>3g触发悬停)用手轻敲ROV外壳,观察QGC中CRASH_CHECK状态是否变红
EK3_SRC1_VELZ3垂直速度源设为气压计(非DVL,因首潜无DVL)查看EKF3页面中velD数值是否随深度变化平滑
SERVO_BLHESI1启用BLHeli_S电调通信(获取实时电流)Power页面观察各推进器电流读数是否随摇杆移动线性变化

实操心得:每次修改参数后,必须执行Write Params并重启飞控。我们曾因跳过重启步骤,导致FS_CRASH_CHECK始终为0,险些在码头测试时撞毁声呐支架。

4.2 固件烧录与校准:IMU校准不是“画8字”,而是重力矢量标定

使用Mission Planner 4.3.5(QGC的校准功能存在传感器时序不同步问题)进行固件烧录。关键步骤:

  1. 固件选择:下载ardusub-4.3.3-bluerovr2.bin(勿用master分支,其AC_AttitudeControl模块存在积分饱和bug);
  2. 烧录模式:将Pixhawk 4的BOOT0跳线帽短接,上电后松开,进入DFU模式;
  3. 烧录命令
    dfu-util -d 0483:df11 -a 0 -s 0x08000000:leave -D ardusub-4.3.3-bluerovr2.bin

IMU校准需在绝对静止平台进行(非桌面,因木质桌面微振动会导致陀螺仪零偏漂移)。正确流程:

  • 将ROV置于大理石平板(振动加速度<0.001g);
  • 执行Calibrate Accel时,每面静置时间≥90秒(非手册写的60秒),因硅MEMS传感器热稳定需83秒;
  • Calibrate Gyro必须在Accel完成后立即执行,间隔<5分钟,否则温度梯度引入0.2°/s零偏误差;
  • Compass Mot校准中,旋转速度必须<15°/s(过快导致磁通量变化率超传感器带宽)。

我们用Fluke 87V万用表实测过:未按此流程校准的ROV,在3米水深航向角漂移达1.8°/分钟,而规范校准后降至0.07°/分钟。

4.3 水池首潜:深度定高的三重保险机制

首潜选择静水池(非开放水域),水深3.5米,水温22℃。操作流程严格按秒级计时:

  • T-300秒:开启ROV电源,观察Pixhawk LED:蓝灯常亮(Bootloader OK)、绿灯慢闪(ArduSub运行中)、红灯灭(无严重错误);
  • T-120秒:QGC中Safety页面确认PreArm Checks全部通过,特别关注Baro(气压计校准)、Compass(磁罗盘健康);
  • T-0秒:缓慢下放ROV至水面,此时QGC中Depth读数应为0.0m±0.03m(验证气压计零点);
  • T+15秒:轻推油门至15%,观察Motor Test页面各推进器PWM是否同步上升,电流读数是否线性增加;
  • T+45秒:当深度达0.5m时,启用Depth Hold模式,此时EKF3页面中posD(深度估计)与baroAlt(气压计读数)差值应<0.08m;
  • T+120秒:维持1.2m深度30秒,记录EKF3velD(垂直速度)标准差,合格值≤0.02m/s。

关键技巧:若posDbaroAlt偏差持续增大,立即切换至Stabilize模式,手动微调油门,同时检查BARO_WIND_COEF参数——该系数用于补偿水流引起的气压扰动,淡水环境建议设为0.35(实测值)。

4.4 数据回溯分析:从日志文件里读取水下真相

首潜后必做动作:导出TLOG日志并用mavlogdump分析。重点关注三类事件:

  1. 传感器异常

    mavlogdump --condition "MSG==\"BAD_DATA\"" arducopter.tlog

    若输出含"BARO",说明气压计受水流冲击,需检查舱体排气孔是否堵塞;

  2. 控制饱和

    mavlogdump --condition "MSG==\"CTRL\" and CTRL.PWM>1950" arducopter.tlog

    连续10帧以上PWM>1950,表明推力不足,需检查螺旋桨是否缠绕异物;

  3. EKF发散: 在plotjuggler中加载tlog,绘制EKF3evh(水平位置估计误差)与evv(垂直位置估计误差)曲线。合格标准:evh<0.15m且evv<0.05m(3σ置信区间)。

我们曾通过此分析发现:某次首潜中evv在1.8m深度突增至0.32m,追溯日志发现BARO_WIND_COEF被误设为0,导致EKF将水流扰动误判为深度变化。修正后evv降至0.04m。

5. 常见问题与排查技巧实录:那些让工程师彻夜难眠的幽灵故障

5.1 “ROV下潜时突然横滚,QGC显示ATTITUDE ERROR”

现象:ROV在0.8m深度开始无规律左倾,最大横滚角达23°,QGC中ATTITUDE页面roll值跳变。

排查路径

  1. 检查EKF3页面flags字段:若含0x00000002(ACC_UNPLAUSIBLE),说明加速度计读数异常;
  2. 查看SENSOR页面AccXAccYAccZ:正常静态值应为0,0,1(单位g),若AccZ为0.85,则IMU安装面存在0.5°倾斜;
  3. 验证O型圈:用游标卡尺测量主舱盖O型圈压缩后截面高度,若<1.45mm(70A硅胶原始直径1.78mm),则压缩率超限导致舱体微变形,挤压IMU电路板。

根治方案:重新校准IMU,并在舱体安装面加垫0.1mm聚酰亚胺薄膜(耐水压且绝缘),消除机械应力。我们统计过,73%的ATTITUDE ERROR源于此物理安装问题,而非软件参数。

5.2 “QGC能连上ROV,但所有舵机无响应”

现象:QGC显示ConnectedMotor Test页面滑块可拖动,但推进器无任何声音。

分层诊断

  • L1(供电层):用万用表测PixhawkMAIN OUT引脚电压,应为11.8~12.2V(电池满电)。若<11.5V,检查电池BEC模块是否故障;
  • L2(通信层):在Parameters中搜索SERVO_BLHESI,若值为0则电调通信关闭,需设为1并Write Params
  • L3(驱动层):执行Motor Test时,用示波器测MAIN OUT引脚PWM信号,正常应为50Hz方波,占空比随滑块变化。若无信号,检查PixhawkFMU芯片第23脚(PWM输出引脚)是否虚焊(BlueROV2量产版已知批次缺陷)。

独家技巧:在CLI终端输入pwm info,查看各通道输出值。若所有通道显示0,说明AP_Motors库未初始化,需检查BRD_TYPE参数是否设为12(Pixhawk 4)。

5.3 “摄像头画面严重拖影,调整曝光无效”

现象:在2米水深,移动ROV时画面出现长达30cm的绿色残影。

根本原因:CMOS传感器全局快门未启用,导致滚动快门在水下低光照下产生运动模糊。ArduSub默认使用libcameraauto模式,但水下需强制global

解决步骤

  1. SSH登录ROV树莓派(默认IP 192.168.2.2,密码ardusub);
  2. 编辑/boot/config.txt,添加:
    start_x=1 gpu_mem=256 dtoverlay=vcsm-cma
  3. 创建/etc/camera.conf
    [camera] shutter_mode=global exposure_time=15000 gain=2.5
  4. 重启camera服务:sudo systemctl restart camera

该配置使拖影长度从30cm降至1.2cm(实测)。注意:exposure_time单位为微秒,15000μs=15ms,是淡水环境3米深度的理论最优值(基于水体漫射衰减模型计算)。

5.4 “深度读数跳变,1.2m深度显示忽高忽低”

现象:QGC中Depth值在1.15~1.32m间无规律跳变,标准差达0.08m。

物理溯源:MS5837气压计对温度敏感,其温度漂移系数为0.02m/℃。当ROV从22℃空气进入18℃水体,传感器温度下降4℃,理论深度漂移0.08m——与实测完全吻合。

校准方案

  1. Parameters中设置BARO_PRIME为2(启用双气压计,主气压计+备份);
  2. 设置BARO_TCOEF为0.02(温度补偿系数);
  3. 最关键一步:在CLI中执行baro calibrate,此时需将ROV静置在目标水深30分钟,让传感器达到热平衡。

我们曾用红外热像仪验证:未执行热平衡校准的ROV,气压计芯片表面温度比水温高2.3℃,正是这2.3℃导致0.046m的系统误差。

6. 进阶能力构建:从首潜到可靠作业的跃迁路径

完成首次潜水后,真正的工程挑战才开始。我们团队总结出三条不可跳过的跃迁路径:

6.1 从手动操控到自主任务:Waypoint Mission的物理约束注入

ArduSub的MISSION_START指令看似简单,但实际部署需注入三重物理约束:

  • 深度约束:在MAV_CMD_NAV_WAYPOINT中设置param3(暂留时间)为0,param4(航向)为-1(保持当前航向),避免ROV在浅水区为对准航向而剧烈转向;
  • 速度约束:通过MAV_CMD_DO_CHANGE_SPEED在航点前插入限速指令,淡水环境最大水平速度设为1.2m/s(超过此值螺旋桨空泡噪声剧增,影响声呐);
  • 安全约束:每个航点后插入MAV_CMD_NAV_RETURN_TO_LAUNCH,并设置FS_CRASH_CHECKCRASH_CHECK_ALT为0.3m(防止触底)。

我们为舟山某海藻养殖场开发的巡检任务中,正是通过这种约束注入,使ROV在0.5m水深的养殖网箱间穿行时,路径跟踪误差<8cm,远超人工遥控的35cm。

6.2 从单点测量到空间感知:DVL与声呐的时空对齐

首潜后升级DVL(如Water Linked D2K)是必然选择,但数据融合存在致命陷阱。DVL输出的是相对于水体的速度,而ArduSub EKF需要相对于海底的速度。若直接接入,ROV在流速0.3m/s的海域会持续漂移。

时空对齐四步法

  1. 时间戳对齐:在DVL固件中启用PTP(精确时间协议),与Pixhawk的TIME_SYNC信号同步;
  2. 坐标系转换:编写dvl_to_ned.py脚本,将DVL的body-frame速度经rotation_matrix转为NED系;
  3. 流速补偿:接入ADCP(声学多普勒流速剖面仪)数据,用EKF3EK3_SRC1_VELZ参数注入流速补偿项;
  4. 故障降级:当DVL信号丢失时,自动切换至EK3_SRC1_VELZ=2(气压计+加速度计积分),并触发FS_CRASH_CHECKCRASH_CHECK_VELZ阈值。

这套方案使ROV在长江口浑浊水域的定位精度从3.2m提升至0.45m(1σ),这是开展海底管线巡检的门槛值。

6.3 从数据采集到智能决策:边缘AI的轻量化部署

在ROV上部署YOLOv5s进行海参识别时,我们遭遇推理延迟>800ms的瓶颈。解决方案不是升级GPU,而是重构数据流:

  • 前端压缩:在摄像头驱动层启用H.265硬件编码,码率设为2Mbps(平衡画质与带宽);
  • 边缘推理:使用TensorRT优化模型,将输入分辨率从640×640降至320×320,精度损失<2%但延迟降至110ms;
  • 结果回传:仅上传检测框坐标(JSON格式,<2KB/帧)与置信度,而非原始图像。

该架构使ROV可在4G弱网环境下(带宽1.2Mbps)实现每秒3帧的实时识别,支撑了山东某渔业公司的海底资源普查项目。

7. 我的实操体会:水下世界没有“差不多”,只有“差多少”

带过这么多团队,看过太多ROV沉没事故报告,我发现一个残酷事实:90%的硬件故障源于对物理参数的“差不多”态度。有人觉得O型圈拧紧就行,结果压缩率超限导致硅胶永久变形;有人认为气压计校准一次就够了,却不知水温每变1℃,深度读数就漂0.02m;还有人把QGC里的红色警告当成“小问题”,直到ROV撞上礁石才明白那是最后的物理防线。

我在舟山外海调试时经历过一次惊魂:ROV在12米深度突然失去控制,日志显示EKF3posN(北向位置)在3秒内从-1.2m跳变至+8.7m。追溯发现是磁罗盘校准数据被覆盖——因为团队成员在码头用手机APP更新了QGC,意外触发了参数重置。那天我们花了7小时打捞,但收获比打捞更重要:从此所有ROV的PARAMETER分区都启用写保护,校准数据存为独立.bin文件离线备份。

水下作业的魅力正在于此:它用最严苛的物理法则逼你回归工程本质。ArduSub不是炫技的玩具,它是把人类对海洋的好奇,翻译成一行行代码、一个个参数、一次次校准的严谨过程。当你第一次看着ROV平稳悬停在水下2米,所有传感器读数如心跳般稳定,那一刻的成就感,远胜于任何屏幕上的华丽特效。因为你知道,这台机器正用0.01毫米的精度,丈量着人类尚未完全理解的蓝色疆域。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/25 13:18:54

逆向工程的艺术:GDRE Tools如何破解Godot游戏封装的5个关键技术

逆向工程的艺术&#xff1a;GDRE Tools如何破解Godot游戏封装的5个关键技术 【免费下载链接】gdsdecomp Godot reverse engineering tools 项目地址: https://gitcode.com/GitHub_Trending/gd/gdsdecomp 当游戏开发者面对一个已发布的Godot游戏时&#xff0c;最头疼的问…

作者头像 李华
网站建设 2026/6/25 13:15:49

AI产品经理必备:业务导向的评估计分板构建指南

1. 项目概述&#xff1a;为什么“评估计分板”是AI产品经理的生存刚需&#xff1f;我带过三支AI产品团队&#xff0c;从跨境物流智能客服、到B端合同审查Copilot&#xff0c;再到面向中小企业的AI营销文案生成器。每次新功能上线前&#xff0c;会议室里最常听到的一句话不是“用…

作者头像 李华
网站建设 2026/6/25 13:09:12

m4s-converter终极指南:5秒永久保存你收藏的B站视频

m4s-converter终极指南&#xff1a;5秒永久保存你收藏的B站视频 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经历过心爱的B站视频突然…

作者头像 李华
网站建设 2026/6/25 13:08:47

ROS C++动态广播坐标系:tf树构建与实战避坑指南

1. 项目概述&#xff1a;为什么要在ROS里手动加一个坐标系&#xff1f;在ROS系统里&#xff0c;刚接触tf&#xff08;Transform Library&#xff09;的新手常有个错觉&#xff1a;只要把传感器数据发出来&#xff0c;机器人自己就知道“我在哪、朝哪看、东西在哪”。结果一跑激…

作者头像 李华
网站建设 2026/6/25 13:08:29

BitMap操作命令

key&#xff1a;BitMap类型对应得key&#xff08;因为Redis是key-value型&#xff09;offset&#xff1a;BitMap是一个字符串&#xff0c;其中每个字符都有对应得索引&#xff0c;这个索引就是字符在BitMap中的偏移量offset&#xff0c;这个offset的范围是【0&#xff0c;232-1…

作者头像 李华
网站建设 2026/6/25 13:04:06

使用PY32驱动gc9d01-0.71寸TFT

看网上很多做眼睛的视频&#xff0c;就想着弄小圆屏玩一下。也想学学其他芯片&#xff08;价格美丽&#xff0c;简直不要太便宜&#xff0c;就是资源太少&#xff0c;空间太小&#xff09;。最后只做到显示一个小的图片。然后准移植到其他资源丰富的环境里去了。

作者头像 李华