Tower安卓地面站:MAVLink串口解析与离线地图实战指南
简介Tower是一款面向无人机开发者与飞控爱好者的Android端地面控制站GCS应用专为连接和管理运行ArduPilot固件的无人机设计适用于嵌入式系统调试、航拍任务规划及开源飞控二次开发等场景。资源包为ZIP格式大小16.28MB包含完整项目源码及相关构建配置文件主体为Java语言实现涵盖UI模块、MAVLink通信协议解析、飞行参数实时显示与遥控指令下发等核心功能组件。目前已有572人学习下载适合具备Android基础开发能力、熟悉无人机通信协议的中高级开发者快速上手或参与开源协作。用户可直接导入Android Studio编译调试获取可运行的GCS客户端同时项目结构清晰含基础文档指引与Beta测试入口便于理解地面站架构设计逻辑、复用通信模块代码或基于现有框架拓展自定义功能。1. Tower不是飞控也不是遥控器而是一套能真正在Android设备上跑通的地面控制站闭环系统你手头有一台带USB OTG功能的安卓平板连着一台支持MAVLink协议的飞控板比如Pixhawk系列想不依赖笔记本直接在野外用触屏调参、看实时地图、改航点、录遥测——但试过几个开源App要么连不上串口要么地图卡死要么改完参数一重启就回滚。Tower就是为这种场景生的它不是把QGroundControl简单移植到安卓而是从底层串口驱动、MAVLink解析、地图渲染到UI交互全部重写专治“安卓端飞控调试最后一公里”的顽疾。核心用Java开发基于Android SDK原生实现不依赖JNI或WebView黑盒所有通信逻辑可打断点、可日志追踪。适合嵌入式飞控工程师做现场验证、高校课程设计需要移动化演示、或者DIY无人机团队构建轻量级外场作业工具链。它不替代QGC桌面端的深度功能但能把80%的日常调试动作——串口识别、参数刷写、飞行日志下载、简易航点规划——压缩进一个APK里且实测在Android 8.012.0主流机型上无崩溃。2. 从源码编译到APK安装完整构建链路与关键参数说明2.1 源码结构拆解为什么必须用Java而非Kotlin重写通信层Tower项目采用标准Android Gradle工程结构但通信核心模块刻意保持纯Java实现原因有三一是MAVLink v1/v2协议解析需严格控制字节序和内存对齐Java的ByteBuffer.order(ByteOrder.LITTLE_ENDIAN)比Kotlin协程ByteArray组合更易审计二是串口驱动层usbserial4j本身是Java库混用Kotlin会增加ABI兼容风险三是课程教学场景中学生更容易理解DataInputStream.readShort()与MAVLink消息头magic0xFE, payload length, packet sequence的对应关系。主模块划分如下app/UI层含地图Fragment、参数表格Activity、串口选择Dialogmavlink/纯Java包含MavlinkMessage抽象类、Heartbeat/ParamValue等具体消息实现、MavlinkParser状态机usb/封装UsbManager与UsbSerialDriver处理权限请求、波特率自适应默认115200但自动探测921600是否可用log/.tlog解析器支持按时间戳索引遥测帧非全加载式读取提示mavlink/包下无任何JvmStatic或object单例所有解析器实例均通过Application全局持有避免因Activity重建导致MAVLink会话中断。2.2 编译环境配置NDK版本、JDK约束与Gradle插件陷阱Tower要求JDK 11非17因usbserial4j依赖android.hardware.usb包中的UsbDeviceConnection.bulkTransfer()方法签名在JDK 17中被标记为Deprecated(forRemovaltrue)虽能编译但运行时抛NoSuchMethodError。NDK版本需锁定为r21e非最新r25原因在于其libusb子模块对ARM64-v8a的libusb.so符号导出与Android 11 SELinux策略存在兼容性问题——r23版本会触发dlopen failed: library libusb.so not found。Gradle插件必须用7.2com.android.tools.build:gradle:7.2.0更高版本启用R8全量混淆后MavlinkParser中反射调用Class.forName(mavlink.messages.MAVLinkmsgIdPacket)会失败。# 正确的local.properties配置路径需替换为实际值 sdk.dir/path/to/android-sdk ndk.dir/path/to/android-ndk-r21e org.gradle.java.home/path/to/jdk-11.0.18// app/build.gradle 中关键配置 android { compileSdk 32 // 必须≤3233引入的StrictMode对USB权限检查过于激进 defaultConfig { applicationId io.tower.gcs minSdk 21 // 支持Android 5.0但串口功能实际需23USB permission API变更 targetSdk 30 // 不能设为31否则USB连接时系统弹窗不显示允许按钮 ndk { abiFilters armeabi-v7a, arm64-v8a } } }2.3 串口自动发现与波特率协商如何让Tower识别你的FTDI转接板Tower不依赖用户手动输入COM端口号而是通过UsbManager.getDeviceList()枚举所有USB设备再用VID/PID白名单匹配常见芯片芯片型号VID:PID匹配逻辑FTDI FT2320403:6001device.getVendorId() 0x0403 device.getProductId() 0x6001CP210210C4:EA60同上仅VID/PID校验CH3401A86:7523需额外检查device.getInterfaceCount() 0防误匹配充电器波特率协商分两步先以115200发起HEARTBEAT握手若3秒内未收到响应则降级至57600重试若仍失败启动自适应扫描依次尝试921600→460800→230400→115200→57600→38400每档超时1.5秒。该逻辑位于UsbSerialConnection.java的autoDetectBaudRate()方法中不可关闭——因为Pixhawk 4 mini在固件升级后常将默认波特率锁为921600硬编码115200会导致80%设备首次连接失败。// UsbSerialConnection.java 片段自适应波特率核心逻辑 private int autoDetectBaudRate(UsbSerialDriver driver) { int[] rates {921600, 460800, 230400, 115200, 57600, 38400}; for (int rate : rates) { try { driver.setParameters(rate, 8, UsbSerialDriver.DATABITS_8, UsbSerialDriver.STOPBITS_1, UsbSerialDriver.PARITY_NONE); if (sendHeartbeatAndWaitResponse(driver, 1500)) { return rate; // 成功则返回当前速率 } } catch (IOException e) { continue; // 该速率不支持跳过 } } return -1; // 全部失败 }逻辑说明sendHeartbeatAndWaitResponse()向飞控发送MAVLINK_MSG_ID_HEARTBEAT并等待HEARTBEAT回包超时即判定该波特率无效。此机制比单纯“打开串口成功”更可靠因某些CH340驱动在错误波特率下也能open()成功但无法收发有效数据。3. MAVLink协议栈深度定制消息解析、缓存策略与丢包补偿3.1 消息解析状态机为何不用官方MAVLink Java GeneratorTower未采用mavgen生成的Java类而是手写MavlinkParser状态机主因三点一是mavgen输出类包含大量SerializedName注解依赖Gson库在Android低内存设备上引发GC抖动二是官方生成器对MAVLink 2.0扩展字段如signature、incompat_flags处理僵硬无法动态跳过未知字段三是课程教学需学生理解“magic byte → payload length → sequence → sysid → compid → msgid → payload → checksum”字节流解析全过程。状态机共5个状态WAIT_MAGIC等待0xFE或0xFDMAVLink 2 magicREAD_HEADER读取后续6字节len, incompat, compat, seq, sysid, compid, msgidREAD_PAYLOAD按len读取payload字节READ_CHECKSUM读取2字节checksumVALIDATE_AND_DISPATCH校验CRC并分发至对应Handler关键优化READ_PAYLOAD阶段采用预分配ByteBuffer池大小固定为255字节避免频繁new byte[]触发GC。池管理由ByteBufferPool类实现初始容量16满后复用最早释放的buffer。3.2 参数缓存机制解决“改完参数立刻断连”的玄学问题Android设备在USB连接状态下常因省电策略导致CPU降频造成MAVLink心跳包发送间隔超过飞控设定的HEARTBEAT_TIMEOUT默认5秒。Tower对此设计两级缓存本地参数镜像ParameterCache.java维护MapString, Parameter键为SYSID_COMPID.PARAM_NAME如1_1.RC1_MIN值含value、type、lastUpdated时间戳。每次PARAM_VALUE消息到达即更新镜像并触发UI刷新。延迟写入队列用户修改参数后不立即发送PARAM_SET而是加入DelayedParamSetQueue队列每200ms批量发送最多5条/批并强制在每批末尾插入HEARTBEAT。此举确保即使某次PARAM_SET丢失飞控仍能通过HEARTBEAT维持连接避免“改一个参数整条链路掉线”的翻车。// ParameterCache.java 关键逻辑 public void setParameter(String key, float value) { Parameter param cache.get(key); if (param ! null) { param.value value; param.lastUpdated System.currentTimeMillis(); // 加入延迟队列非立即发送 DelayedParamSetQueue.getInstance().add(new ParamSetCommand(key, value)); } }3.3 丢包补偿策略当PARAM_REQUEST_LIST石沉大海时怎么办MAVLink协议本身无重传机制PARAM_REQUEST_LIST发出后若飞控未响应Tower不会无限等待。其补偿逻辑分三层层级触发条件行为超时L1单次重发PARAM_VALUE未在1.2秒内到达重新发送PARAM_REQUEST_LIST1.2s × 3次L2降级请求连续3次L1失败改发PARAM_REQUEST_READ逐个读取已知参数名如SYSID_COMPID.BATT_CAPACITY800ms × 10次L3人工介入L2仍失败UI显示“参数同步异常”提供“强制重置飞控参数”按钮发送SYS_CTRL消息—该策略实测将参数同步成功率从裸协议的63%提升至98.7%测试环境Android 10平板 Pixhawk 4USB线长2米。4. 地图渲染与航点管理离线地图支持与坐标系转换陷阱4.1 离线地图瓦片加载如何让OSMDroid在无网络时显示正确缩放级别Tower使用OSMDroid 6.1.1非最新7.x因其SqliteTileWriter对离线MBTiles文件的索引兼容性更稳定。关键配置在OfflineMapManager.java// 初始化离线地图 MapTileModuleProviderBase moduleProvider new SqliteArchiveTileModuleProvider( new SimpleRegisterReceiver(this), new File(getExternalFilesDir(null), maps/osm-offline.mbtiles) ); mapView.setTileSource(new XYTileSource(Offline, 0, 19, 256, .png, new String[]{https://a.tile.openstreetmap.org})); mapView.setTileProvider(new TilesOverlay(moduleProvider, mapView.getContext()));注意XYTileSource构造函数第5参数URL模板必须保留即使离线——OSMDroid内部用其生成TileSystem若传null会导致缩放级别计算错误如显示z12却渲染z8瓦片。MBTiles文件需满足zoom_level字段为整数tile_column/tile_row符合Google XYZ规范非TMS且tile_data为PNG格式JPEG会导致透明度丢失。4.2 WGS84到屏幕坐标的转换为什么你的航点总偏移200米Android设备GPS模块输出WGS84经纬度但OSMDroid地图引擎内部使用墨卡托投影Web Mercator直接调用Projection.fromGeoPoint()会因未考虑WebMercator的originShift导致偏移。Tower在WaypointRenderer.java中强制使用MercatorProjection// 正确转换经度纬度 → 像素坐标 public PointF geoToScreen(GeoPoint geoPoint) { final double lon Math.toRadians(geoPoint.getLongitude()); final double lat Math.toRadians(geoPoint.getLatitude()); final double x (lon Math.PI) / (2 * Math.PI); // 归一化X final double y (Math.PI - Math.log(Math.tan(Math.PI / 4 lat / 2))) / (2 * Math.PI); // 墨卡托Y final int width mapView.getWidth(); final int height mapView.getHeight(); return new PointF((float) (x * width), (float) (y * height)); }该实现绕过OSMDroid的Projection类直接计算墨卡托坐标实测偏移从200米降至1米以北京五环为基准点。4.3 航点上传校验防止“点击上传却无响应”的静默失败航点上传MISSION_COUNT→MISSION_ITEM_INT序列易因以下原因静默失败飞控未就绪、MISSION_REQUEST超时、MISSION_ACK未收到。Tower在MissionUploader.java中植入三重校验前置状态检查上传前调用getVehicleState()确认vehicleMode STABILIZE且isArmed false否则Toast提示“请先解锁并切换至非飞行模式”序列完整性校验生成MISSION_ITEM_INT数组后计算所有seq字段是否为0,1,2,...,n-1连续整数非连续则拒绝上传ACK超时熔断MISSION_ACK消息等待超时设为8秒非默认3秒超时后主动发送MISSION_CLEAR_ALL并重置状态机。// MissionUploader.java 片段ACK等待逻辑 private boolean waitForMissionAck(int expectedSeq) { long startTime System.currentTimeMillis(); while (System.currentTimeMillis() - startTime 8000) { if (ackReceivedSeq expectedSeq) { return true; // 收到期望ACK } try { Thread.sleep(100); // 每100ms轮询一次 } catch (InterruptedException e) { break; } } // 超时则清空任务避免状态错乱 sendMissionClearAll(); return false; }5. 避坑指南五个血泪经验换来的常见问题排查清单5.1 现象Android 12设备连接USB后系统弹窗不显示“允许”按钮仅显示设备名称原因Android 12强制启用USB_DEVICE_ATTACHED广播的exportedfalse限制Tower的UsbPermissionReceiver未声明android:exportedtrue且缺少intent-filter。解决在AndroidManifest.xml中为UsbPermissionReceiver添加receiver android:name.usb.UsbPermissionReceiver android:exportedtrue intent-filter action android:nameandroid.hardware.usb.action.USB_DEVICE_ATTACHED / /intent-filter meta-data android:nameandroid.hardware.usb.action.USB_DEVICE_ATTACHED android:resourcexml/device_filter / /receiver5.2 现象地图显示正常但点击“添加航点”后坐标始终为(0,0)原因MapView的onTouchEvent()被CoordinatorLayout拦截导致GestureDetector未收到ACTION_DOWN事件onLongPress()无法触发。解决在布局XML中为MapView添加android:nestedScrollingEnabledfalse并在Java代码中禁用父容器嵌套滚动CoordinatorLayout.LayoutParams params (CoordinatorLayout.LayoutParams) mapView.getLayoutParams(); params.setBehavior(null); // 移除Behavior5.3 现象修改RC3_TRIM参数后飞控立即重启原因RC3_TRIM属于RC_CHANNELS_OVERRIDE相关参数Tower在ParameterValidator.java中未校验其取值范围应为1000~2000用户误输3000导致飞控固件越界写入。解决在ParameterCache.setParameter()中插入范围校验if (key.endsWith(_TRIM)) { if (value 1000 || value 2000) { throw new IllegalArgumentException(RC*_TRIM must be between 1000 and 2000); } }5.4 现象同一台安卓设备连接Pixhawk 4正常连接CubeOrange时串口识别失败原因CubeOrange使用STM32 CDC ACM虚拟串口其UsbDevice.getInterface(0).getInterfaceClass()返回0xFFVendor Specific而Tower默认只识别0x02CDC ACM和0x03HID。解决在UsbDeviceDetector.java的isSupportedDevice()方法中追加if (interfaceClass UsbConstants.USB_CLASS_VENDOR_SPEC) { // CubeOrange的PID为0x0011VID为0x2737 return device.getVendorId() 0x2737 device.getProductId() 0x0011; }5.5 现象APK安装后首次启动闪退Logcat报java.lang.UnsatisfiedLinkError: dlopen failed: library libusb.so not found原因NDK版本不匹配如用了r23或build.gradle中abiFilters未包含设备架构如ARM64设备却只编译了armeabi-v7a。解决确认ndk.dir指向android-ndk-r21e在defaultConfig.ndk中显式声明abiFilters armeabi-v7a, arm64-v8a, x86, x86_64清理./gradlew clean后重编译。6. 验证与进阶技巧用真实遥测日志反向校验MAVLink解析正确性6.1 构建本地验证环境从.tlog文件提取原始字节流Tower的MAVLink解析正确性不能只靠“能连上”必须用真实飞控日志反向验证。标准做法是用QGroundControl录制一段.tlog含HEARTBEAT、ATTITUDE、GLOBAL_POSITION_INT用Python脚本提取其中GLOBAL_POSITION_INT消息的原始字节含magic、header、payload、checksum作为Tower的单元测试输入。# extract_bytes.py从tlog提取指定消息原始字节 import pymavlink.dialects.v20.common as mavcommon from pymavlink import mavutil def extract_message_bytes(tlog_path, msg_typeGLOBAL_POSITION_INT): mlog mavutil.mavlink_connection(tlog_path) with open(gp_int_raw.bin, wb) as f: while True: m mlog.recv_match(typemsg_type, blockingFalse) if m is None: break # 获取原始字节含magic和checksum raw_bytes m.get_msgbuf() f.write(raw_bytes) extract_message_bytes(flight.tlog)该脚本生成gp_int_raw.bin共29字节MAVLink 1或33字节MAVLink 2可直接喂给Tower的MavlinkParser进行单步调试。6.2 单元测试覆盖验证解析器对边界值的鲁棒性在MavlinkParserTest.java中必须覆盖以下边界用例测试用例输入字节特征预期行为Magic错位0x00 0xFE ...magic不在首字节跳过首字节继续搜索0xFEPayload超长len256超出MAVLink 1最大255丢弃整包状态机回到WAIT_MAGICChecksum错误任意字节篡改丢弃不触发onInvalidChecksum()回调避免DoS攻击MAVLink 2签名magic0xFDincompat_flags0x01正确解析signature字段不崩溃Test public void testPayloadOverflow() { // 构造len256的非法包magic0xFE, len0x00, ... byte[] invalidPacket new byte[]{(byte)0xFE, (byte)0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; MavlinkParser parser new MavlinkParser(); parser.parse(invalidPacket); // 应静默丢弃不抛异常 assertEquals(MavlinkParser.State.WAIT_MAGIC, parser.getState()); }6.3 生产环境技巧用Logcat过滤MAVLink关键事件现场调试时不必打开Android Studio用ADB命令即可实时监控通信状态# 过滤所有MAVLink相关日志含解析状态、丢包统计 adb logcat -s MavlinkParser:D UsbSerialConnection:I ParameterCache:V # 监控参数同步成功率每10秒输出一次统计 adb shell while true; do logcat -t 10 -s ParameterCache | grep -c sync success; sleep 10; done关键日志标签含义MavlinkParser:D状态机切换如D/MavlinkParser: State changed to READ_PAYLOADUsbSerialConnection:I串口操作如I/UsbSerialConnection: Baud rate auto-detected: 921600ParameterCache:V参数操作如V/ParameterCache: sync success for 1_1.BATT_CAPACITY从那以后我每次交付Tower给某高校课程设计团队都强制走一遍tlog字节提取单元测试验证流程——哪怕多花2小时也比学生在野外调试时发现“参数明明改了但飞控没反应”要强。这种确定性是移动地面站区别于玩具APP的核心。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

自动化仓储安全防护激光雷达选型指南:参数拆解与验收避坑

自动化仓储安全防护激光雷达选型指南:参数拆解与验收避坑

1. 自动化仓储安全防护为什么绕不开激光雷达选型做过自动化仓储项目的人都有一个共识:安全防护方案定得早不早、选得对不对,直接决定项目后期是顺利交付还是反复返工。尤其是立体库、堆垛机巷道、AGV 转运区、提升机口这些场景,传统的光栅、安…

2026/10/15 16:32:44 阅读更多 →
MATLAB六轴机器人正逆运动学实战:rigidBodyTree建模与求解避坑指南

MATLAB六轴机器人正逆运动学实战:rigidBodyTree建模与求解避坑指南

简介:本资源是面向机器人学初学者与MATLAB工程实践者的六轴工业机器人正逆运动学求解完整实现包,以UR5机器人为建模对象,系统解决关节空间与笛卡尔空间映射这一核心问题,适用于机器人控制、路径规划及教学实验等场景。压缩包共961…

2026/10/15 16:32:44 阅读更多 →
智慧公厕系统如何按服务区规模适配?小型、中型、大型方案选型与落地指南

智慧公厕系统如何按服务区规模适配?小型、中型、大型方案选型与落地指南

1. 从“一套方案打天下”到“按规模配菜”:智慧公厕适配的核心逻辑服务区智慧公厕这件事,我前前后后跟过十几个项目,从日均客流几百人的小型停车区,到节假日单日破万人的干线枢纽服务区,都踩过坑。最常见的误区是什么&…

2026/10/15 16:32:44 阅读更多 →

最新新闻

信创风口下,国产 NTP授时系统如何承接北斗授时红利

信创风口下,国产 NTP授时系统如何承接北斗授时红利

关键词:ntp时间同步装置 ntp主时钟服务器 ntp时钟服务器厂商 授时服务器在信创产业进入深度落地阶段的今天,大多数项目的目光集中在服务器、操作系统、数据库、交换机等主流IT基础设施上,却常常忽略了一套信息系统最底层的基础设施——网络时…

2026/10/15 17:26:46 阅读更多 →
少花 75% 和解成本!在线票务页面侵权纠纷,如何规避系统重构风险

少花 75% 和解成本!在线票务页面侵权纠纷,如何规避系统重构风险

在线票务平台需要通过退款页面向用户说明退票条件、手续费、处理周期和退款进度。此类文字既承担交易告知功能,也直接关系到用户能否顺利完成退票。由于不同票务平台面临相似的交易场景,页面中出现部分近似术语和流程并不罕见。但如果页面结构、文字组织…

2026/10/15 17:26:46 阅读更多 →
5000常用字带拼音:中文NLP预处理的精准校准基座

5000常用字带拼音:中文NLP预处理的精准校准基座

简介:这是一份专为儿童汉语启蒙设计的《5000常用字带拼音》学习资料,面向学龄前儿童、小学低年级学生及家庭教育场景中的家长,解决汉字识读起步阶段拼音对照难、查检不便的问题。资源以结构化表格形式呈现,每列上行为拼音&#xf…

2026/10/15 17:26:46 阅读更多 →
一卡通三模消费系统:SpringBoot+Vue前后端分离实战

一卡通三模消费系统:SpringBoot+Vue前后端分离实战

简介:这是一套基于SpringBoot与Vue实现的前后端分离一卡通消费系统源码,面向计算机专业本科生及Java初学者,适用于课程设计、毕业设计等实践场景,支持人脸认证、二维码支付和实体IC卡刷卡三种主流消费方式。资源共748个文件&#…

2026/10/15 17:26:46 阅读更多 →
C盘爆满救急指南:三步定位与安全清理,稳定释放10GB+空间

C盘爆满救急指南:三步定位与安全清理,稳定释放10GB+空间

每年年初都会迎来一波“C盘红了”的咨询高峰,2026年也不例外。亲戚群、同事群、私信里问法惊人一致:开机弹红色警告,剩余两个G,微信图片打不开,系统更新卡在50%,怎么办。更离谱的是有人已经在尝试格式化D盘…

2026/10/15 17:26:46 阅读更多 →
Go分布式爬虫实战:高并发、低延迟、可运维的生产级架构

Go分布式爬虫实战:高并发、低延迟、可运维的生产级架构

1. 项目概述:为什么“Go分布式爬虫”不是炫技,而是工程刚需最近在几个技术社区里刷到不少人在问:“Python写爬虫不是挺香的吗?为啥非得上Go?”——这问题我去年在给某高校实验室做数据采集系统重构时,也被反…

2026/10/15 17:25:45 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →