news 2026/10/1 16:37:41

Jetson Thor人形机器人实战:从系统烧录到ROS2与AI模型部署

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Jetson Thor人形机器人实战:从系统烧录到ROS2与AI模型部署

1. 为什么人形团队会把计算核心押在 Jetson Thor 上

1.1 人形机器人的算法栈,到底逼出了什么样的算力需求

我们这个人形机器人项目做到第二轮样机时,一个很现实的问题就摆在桌面上了:原来的 Jetson Orin 已经快被榨干了。双足平衡控制的模型推理、上半身力控,再加上视觉感知、路径规划,随便拎出来一项都能吃满一个 GPU 核心,更别说现在做人形几乎都会叠加 VLM(视觉语言模型)或者端到端策略。芯片选型如果跟不上算法迭代,整机做得再机械也跑不起来。

Jetson Thor 进入我们视野,核心原因有四条:一是它的 AI 算力相比上一代有明显的代差,官方公开资料里提到 FP4 精度下能达到 800 TFLOPS 左右,这个数字对人形机器人这种"感知-规划-控制"全链路都在边缘端跑的负载来说非常重要;二是它基于 Blackwell 架构,对 Transformer 类模型、稀疏注意力这些新结构的支持好很多;三是它把安全引擎也集成进来了,机器人不是游戏机,控制器一旦出问题要有硬件级兜底;四是周边生态保持了 NVIDIA 一贯的做法,JetPack、CUDA、TensorRT、Isaac ROS 一整套工具链直接沿袭下来,团队迁移成本可控。

1.2 双足机器人的"大脑"和自动驾驶芯片到底差在哪

很多人会拿 Thor 和汽车域的 DRIVE Thor 比,其实两者在机器人场景上是有意做了区分的。人形机器人不像自动驾驶那样只需要处理"车在一条路上怎么走",它的 I/O 更加杂:多个激光雷达、双目或鱼眼相机、IMU、关节编码器、力传感器、电机驱动器、甚至手上的触觉阵列,全都挤在一个不太大的嵌入式板卡上。Jetson Thor 这套平台在设计取舍上更接近"实时感知 + 实时控制"的融合,它不追求把这些数据全部拉回服务器,而是希望在机载端完成从"看到"到"动起来"的闭环。

从我们实测的体感看,Thor 和 Orin 之间的迁移不是单纯"算力翻倍"这么简单。Blackwell 架构对 INT8/FP4 量化推理的加速特别明显,这直接推高了我们在边缘端部署大模型的信心。过去在 Orin 上跑一个 YOLOv8 或者轻量 BEV 感知网络,需要反复抠 TensorRT 的算子、压缩输入分辨率才能稳住帧率;在 Thor 上,同一个模型甚至不用怎么调反而不那么吃力了,省下来的精力可以放回到数据集和模型本身。

1.3 换平台之前的三个现实提醒

先说清楚,Thor 不是"装完系统马上就能用"的即插即用设备。我们的准备阶段大概花了一周半,主要花在系统烧录、JetPack 版本适配、以及确认 NVIDIA 的 PyTorch 轮子是否跟当前 JetPack 对齐上。如果你手里已经有基于 Orin 开发的代码,THOR 上大部分 Python 层的 ROS2 工程可以直接跑,但底层算子、TensorRT 引擎文件一定要重新导出,别想着把engine文件拷过去就行。

第二个提醒是功耗和散热。性能上去了,发热也实打实上去了。机载端如果没有风道设计,长时间满负载跑模型很容易触发降频,到时候的神话就没有意义。我们最后是在底盘和躯干之间单独做了一层铜片散热架,才把长期负载的温度压在安全线以内。

第三个提醒是存储规划。现在的模型动辄几个 GB,加上 conda 环境、Docker 镜像、ROS2 工作空间,一块 256GB 的 NVMe SSD 很快就会见底。建议你从一开始就把系统、数据集、容器目录分开规划,不要像我最初那样全塞在默认分区里,后面扩容麻烦得要命。

2. 烧录与系统初始化:从空板到 Ubuntu 的 Day 0

2.1 手边必须具备的硬件和环境清单

在动任何软件之前,先确认你手头的东西是不是齐全的。我们那批板子到手的时候,除了模块本体、载板和电源适配器之外,还额外准备了这些:一条质量好一点的 USB-C 数据线、一块至少 256GB 的 NVMe SSD、一个能稳定输出 5V/10A 以上的直流电源、以及一台装有 Ubuntu 22.04 的 x86 主机。很多朋友省略了最后一项,想直接用 Windows 笔记本烧录,NVIDIA 官方工具对 Windows 的支持始终不顺手,后续依赖解析也容易出问题,我建议老老实实准备一台 Linux 机器。

存储盘这里多说一句:Jetson 系列从 Orin 开始就强烈建议从 eMMC 迁移到 NVMe 启动。Thor 上的大模型场景更吃这块盘,随机读写速度直接决定了图片加载、数据集读取、模型加载这些操作的响应时间。项目初期你就买一块口碑稳定的 PCIe Gen4 NVMe 盘,别在存储上省钱。

2.2 用 SDK Manager 完成首次烧录的全流程

NVIDIA 官方提供的烧录入口是 SDK Manager,它会负责下载 JetPack、L4T 内核、rootfs,并把系统完整写到目标设备上。步骤不难,但每步都有容易踩的细节:

  1. 在 x86 Ubuntu 主机上下载 SDK Manager 并安装。
  2. 把 Thor 模块插到载板上,接好电源,用 USB-C 线把板子和主机连起来。
  3. 按住载板上的恢复键不放,同时短按一下复位键,继续保持恢复键约两秒,让板子进入烧录模式。主机端可以通过lsusb确认是否出现 NVIDIA 相关设备,看到设备 ID 就说明进入状态了。
  4. 打开 SDK Manager,登录 NVIDIA 开发者账号,选择目标设备型号,然后勾选要安装的 JetPack 版本。这里千万注意版本号,不要默认选最新 RC 版本,尽量挑已经发布一段时间的稳定版,RC 版的内核、驱动、用户态组件经常有不配套的问题。
  5. SDK Manager 会先下载一堆安装包,时间很久,主要是那几个 GB 的大件。下载完成后点 Flash,烧录过程大概半小时左右,视 USB 接口速度和 CPU 性能浮动。

按我们实际经验,第一次烧录最容易翻车的地方是 USB 连接不稳定。如果你发现刷到一半 CRC 校验失败,先换一条短一点的 USB-C 线、换个 USB 3.0 直连口再试,别连着扩展坞刷,后者会引入很多莫名其妙的传输错误。

2.3 开机后的账号、磁盘与基础检查命令

烧录完成后,系统会自动重启进入 Ubuntu 首次配置流程,这个和普通 PC 装系统一样,建一个普通用户账号,记住密码就行。之后立刻做三件事:

  • 用df -h确认系统是不是跑在 NVMe 上,如果默认还在 eMMC,需要手动把系统迁移过去,或者重刷时在 SDK Manager 里指定根目录存储设备。
  • 用uname -a确认内核版本和 JetPack 版本是否匹配,把内核版本号记下来,后面装实时内核或驱动排查都要用到。
  • 用l4t_fs_info或dpkg -l | grep nvidia-l4t看一下 L4T 组件的具体版本,开会记录卡上的基线版本,方便出问题时对齐大家的排查起点。

这一步其实没那么性感,但非常值得花半小时记录清楚。团队里配合的时候,"你的 L4T 版本是多少"这句话反复出现在我们的故障群聊天记录里,版本一不一致,行为就完全不一样。

3. 基础环境调校:镜像源、包管理器与远程开发

3.1 把 apt 和 pip 源先换到国内镜像

板子默认的软件源在国外,国内网络环境下一跑apt update就很容易出现连接超时。别硬扛,直接把源换成国内常用镜像。Jetson 是 ARM64 架构,Ubuntu 源路径通常是http://ports.ubuntu.com/ubuntu-ports,很多新手拿 x86 的archive.ubuntu.com来改就会出大问题。

最简单的方式是先把原文件备份,然后全局替换:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i 's|http://ports.ubuntu.com/ubuntu-ports|https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports|g' /etc/apt/sources.list sudo apt update

有些 JetPack 版本里,apt 源不止写在/etc/apt/sources.list,还分布在/etc/apt/sources.list.d/下面的.sources文件里,记得也要一起检查。改完之后装依赖的速度会快一个量级,这个动作能省下后面几小时的无谓等待。

pip 也是一样的道理,创建用户级配置文件:

mkdir -p ~/.pip cat > ~/.pip/pip.conf <<EOF [global] index-url = https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple extra-index-url = https://mirrors.aliyun.com/pypi/simple/ EOF

这里我多说一句,网上很多教程喜欢把extra-index-url和index-url混着写,如果你还需要安装 NVIDIA 自家的 wheel 包,一定不要把两个 source 串在一起导致依赖解析错乱。我的习惯是日常 Python 包走清华源,NVIDIA 专有库单独通过--extra-index-url临时指定,这样最稳。

3.2 conda 环境和 Python 解释器的选择策略

很多开发者的第一反应是在板子上装 Anaconda,然后conda create -n robot python=3.10。这个思路能用,但我要提醒一个关键区别:Jetson 平台的很多关键库是针对系统 Python 或特定 JetPack 版本编译的,conda 环境里的 Python 版本如果和 L4T 的固件不匹配,经常会碰到 "binary wheel 不可用" 的问题。

我最终采用的策略是分两层管理:Python 层面保留系统默认 Python 3.10,再用 conda 单独建一个纯 Python 环境跑通用算法代码,例如训练好的模型后处理脚本、数据转换脚本;而涉及 PyTorch、TensorRT、ROS2 的部分,尽量用系统 Python 或 NVIDIA 预置容器。这么做的原因很实际:conda 里装 PyTorch 可以,但如果还要同时编译几万个 ROS2 消息包,conda 和 JetPack 的底层链会打架,排查起来非常头疼。

miniforge 安装脚本可以直接从清华镜像下载,安装后顺手配一下 conda 源:

cat > ~/.condarc <<EOF channels: - conda-forge show_channel_urls: true EOF

之后建环境就正常用,但建完立刻做一件事:

conda info --envs which python

确认你当前的python路径是不是指向目标环境,很多人在板子上同时装了系统 Python、conda、还有 ROS2 的虚拟环境,三个python混在一起,最终把包装错位置的悲剧就是这样发生的。

3.3 VS Code 远程开发配置:比直接在板子上写代码靠谱太多

Thor 板卡的开发场景,我强烈建议走远程开发模式,而不是直接在板子上接显示器鼠标键盘。机器人平台的桌面环境能省则省,把计算资源留给推理任务,而且同一时间可能有多个同事要连板子调试,SSH 是唯一合理的方案。

VS Code 远程开发的配置要点很常规,先说最简单的 Remote-SSH:

  1. 在板子上生成公钥:ssh-keygen -t ed25519。
  2. 把公钥加到主机的~/.ssh/authorized_keys里。
  3. 打开 VS Code,装 Remote-SSH 插件,连接目标主机的 IP 和用户名。
  4. 插件市场里的 Python、Pylance、ROS 扩展都安装在远程端,本地端只负责界面。

这套玩法人人会用,但我在实际项目中额外加了两个配置:一是把 SSH 的ServerAliveInterval设成 30 秒,防止板子休眠后连接被断开;二是把远程端的 Python 解释器路径固定指向对应环境,通过设置项里的python.defaultInterpreterPath配好,避免每次打开项目还要手动选路径。

如果你更习惯容器化开发,可以直接在板子上跑一个 NVIDIA 的 Isaac ROS Docker 镜像,然后用 VS Code 的 Dev Containers 插件附加到运行中的容器里。这个方案最干净,它把依赖隔离在镜像里,不会污染宿主机,调试完把镜像一提交,团队其他人也能拿到一模一样的环境。

3.4 面向多人的共享环境:用户权限与目录规划

团队三个人以上用同一块板子的情况,权限和目录规划就特别重要。我的做法是:系统目录保持干净,凡是安装包一律sudo apt install或放进 Docker;共享的 conda 环境放在/opt/conda/,由robot组的人共同维护;个人可写的数据放在各自的家目录下。

这样做的好处是不用隔三差五全组停下手里的活去恢复环境。有人把依赖搞坏了,其他成员还有干净的 Docker 或另一个 conda 环境可以切过去,不至于整条产线瘫痪在板子上。

4. 深度学习与视觉模型环境:CUDA、PyTorch、TensorRT 的组合拳

4.1 先确认 JetPack 预置的底层组件版本

JetPack 在烧录时已经把 CUDA、cuDNN、TensorRT、VPI 这些核心库装好了,不需要也不能用 x86 上的方式再去单独装 CUDA driver。第一步是摸清板子上到底是什么版本:

dpkg -l | grep nvidia-l4t-core ls /usr/local/cuda dpkg -l | grep -E "tensorrt|libcudnn"

实际排查中,我发现最坑的是/usr/bin/python3里顺手pip install nvidia-cuda-runtime这类库,它会把 PyPI 上的一堆与板载驱动不匹配的二进制文件安装进来,重则直接覆盖掉 JetPack 的库文件。所以大家在 Jetson 平台上装包前一定要有"底层库只信 JetPack,不再用 pip 改"的意识。

4.2 安装 PyTorch 的正确来源

如果你直接pip install torch,大概率装不上或者装上之后用不了 GPU。PyTorch 在 PyPI 上针对 Linux ARM64 的轮子比较有限,跟 Jetson 的 CUDA 版本无法通过 pip 自带的依赖机制自动匹配。NVIDIA 官方为 JetPack 发布了单独编译的 PyTorch wheel,这才是正确选择。

具体操作按官方指引来:

python -m pip install --no-cache-dir \ --extra-index-url https://developer.download.nvidia.com/compute/robotics/jetpack/pytorch/whl/ \ torch torchvision

我这里特别想强调"先装底层再装上层"的顺序。把 torch 装完后,马上去验证它能不能正确调用 CUDA:

python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"

如果你看到torch.cuda.is_available()返回 False,不外乎三种原因:CUDA 版本和 wheel 不匹配、权限不足无法读取设备节点、NUMA 或系统内存配置导致设备初始化失败。优先检查ls -l /dev/nvidia*,权限不对就加当前用户到视频组。

4.3 目标检测模型在 Thor 上的部署:YOLOv11 实测

我们项目中用 YOLOv11 做上层的目标检测任务,跑在 x86 GPU 上很顺利,一迁移到板子上就遇到麻烦:直接拿 PyTorch 模型推理,帧率低得可怜。原因很直接,边缘端必须把模型转成 TensorRT engine 才能榨干硬件性能。

转换流程大致如下:

  1. 在板子上安装 Ultralytics 框架,并用它自带的export功能先导出 ONNX。
  2. 用 TensorRT 的trtexec工具把 ONNX 变成 engine,这一步是真正花时间的地方。
trtexec \ --onnx=yolov11n.onnx \ --saveEngine=yolov11n.engine \ --fp16 \ --workspace=2048
  1. 推理阶段用 TensorRT Python API 加载 engine,而不是直接把图片塞给 PyTorch。这样一改,端到端延迟明显降下来。

这个过程中容易翻车的细节有两个:一是 ONNX 导出时代码里如果有动态尺寸输入,转换时要声明--minShapes、--optShapes和--maxShapes;二是板载 GPU 的显存是跟系统内存共享的,转换时--workspace不要给太大,不然直接 OOM。我们试过 4GB workspace 就崩了,回退到 2GB 才稳定。

4.4 BEVFormer 这类感知网络如何处理

BEVFormer 这类的 BEV(Bird's Eye View)感知模型,在推向实际机器人时往往更复杂。它通常包含多视角相机投影、Transformer encoder、时序信息融合,直接 ONNX 导出经常踩算子不兼容的坑。

我现在的姿势是:模型训练和调优全部在服务器 GPU 上完成,板上除了推理引擎,不保留完整训练框架。推理阶段把 BEVFormer 的完整模型拆成两个部分来部署——前端的图像特征提取用 TensorRT 处理,后端的时序融合如果算子实在太特殊,就先在板子上跑一个精简版本,或者使用 TensorRT 的插件机制去补。这不是最优解,但在"能稳定上线"面前,它是相对可靠的选择。

5. ROS2 与 Isaac ROS:让感知和运动控制对上电

5.1 ROS2 Humble 的安装与版本对齐

Thor 板载系统是 Ubuntu 22.04,对应的 ROS2 版本是 Humble,千万别装 Jazzy 这类更高版本,依赖链会跟 JetPack 很多组件冲突。ROS2 同样是 apt 安装最省心,把 ROS2 的国内镜像源添加好之后:

sudo apt install ros-humble-ros-base source /opt/ros/humble/setup.bash

对机器人项目来说只装 ros-base 往往不够,至少还得补上ros-humble-vision-opencv、ros-humble-camera-calibration、ros-humble-nav2这些常用包。我的经验是先把 ros-base 跑起来,再按任务一个个加,没必要一步到位装完整得 desktop 版,也没必要去手动编译那些官方源里已经有的包。

5.2 Isaac ROS 的选择:容器优先,宿主机其次

Isaac ROS 是 NVIDIA 针对机器人场景的加速库集合,包含了视觉里程计、位姿估计、目标检测、运动规划等预编译模块,名字常以isaac_ros_*开头。在 Thor 上部署它有两种路线:一种是把 apt 源和 Docker 镜像一起装进宿主机,一种是直接拉取 NVIDIA 官方 Isaac ROS Docker 镜像,在里面跑全部感知流程。

我个人在项目中期彻底转向了容器优先的方式。原因很现实:宿主机上的依赖环境太容易因为不同同事装包而崩掉,容器则可以被看作是"一次编译,处处运行"。Isaac ROS 官方仓库维护了一套 Docker Compose 文件和预先构建好的镜像,操作下来基本就是把容器跑起来,再把摄像头和传感器设备通过--device或 compose 里的devices字段映射进去。

一个不得不注意的细节是,容器内外共享 GPU 加速需要 NVIDIA Container Toolkit,JetPack 默认已经把 runtime 和镜像都准备好,你只需要在启动容器时加上--runtime nvidia,或者在 compose 里声明runtime: nvidia即可。

5.3 与电机驱动通信的环境配置:SocketCAN 与实时补丁

人形机器人的执行端通常是关节伺服电机,底层通信常见两种:CAN 总线和 EtherCAT。Thor 板载不一定直接引出这两种接口,需要搭桥芯片或者 USB-CAN 适配器,环境层面我们要做的是把协议栈准备好。

CAN 这边很简单:

sudo apt install can-utils sudo modprobe can_dev sudo ip link set can0 type can bitrate 1000000 sudo ip link set can0 up

把网络层建起来之后,上层就可以直接通过socketcan或者canopen库跟驱动器收发报文。这里的关键是位速率必须和电机驱动器匹配,常见的有 500Kbps 和 1Mbps,不对齐就总是收不到数据,还以为是硬件坏了。

如果关节数众多、需要更高实时性,就要考虑 EtherCAT 和实时内核。JetPack 提供了一些实时优化配置,但真的部署起来不是装个内核补丁就完事,主板时钟同步、网卡驱动、EtherCAT 主站栈都要逐一验证。我建议不要为了"看起来先进"硬上实时方案,先把你手上的关节数量和带宽需求计算清楚,如果 CAN 就够,别给自己找额外工作量。

6. 实测中最容易翻车的几个环节与应急处理建议

6.1 磁盘空间爆炸:大模型项目的第一杀手

一个典型的人形机器人项目,数据流向是这样的:相机实时视频流 -> 视觉模型推理结果 -> 运动规划 -> 控制指令,其中模型文件、日志、容器镜像、评估数据集都堆在本地盘上。最初我把整个板子当成一台"大号手机"来用,一段时间后df -h一看,根分区 96% 满了,系统开始出现各种奇怪问题,Docker 容器拉不下来,conda 环境创建失败,连 apt 都跑不动。

这个问题的根源是容器和包缓存没有定期清理。解决方案不复杂:常规巡检脚本里加上docker system prune -af和pip cache purge;大文件交给外挂存储;模型文件统一放到单独的数据分区。彻底盘活之后,板子才稳定下来。

6.2 内存不足时的性能调优:swap 和 zram

Thor 的内存虽然不小,但在跑 VLM 或大分辨率 BEV 网络时还是经常会撞上限。在没法立刻加内存的前提上,最常见的手段是增加 swap 或启用 zram。简单来说,swap 是拿磁盘做虚拟内存,zram 是把内存压缩后再拿来当虚拟内存。机器人场景磁盘寿命和延迟都很宝贵,我建议优先用 zram,把压缩内存放在同一块物理 RAM 上,速度和响应都更稳定。

要临时启用 zram 的话,可以用 systemd 服务配置,压制出 2-4GB 的压缩内存。但必须清醒:这个手段只是缓解,真正的瓶颈浇灭不掉。遇到需要吃掉大量连续内存的算子,我最后绕不过的方法还是把输入分辨率降一点、模型裁剪一点。做部署优化永远不是单点难题,是整个尺度一起权衡。

6.3 板子死机或无法 SSH 后的恢复路径

机器人平台跑在野外、在支架上、在移动底盘里,不可能总是拔电重插。一旦板子系统完全没有响应,SSH 又连不上,我们只能走下面的恢复顺序:

  • 先试板子上的硬件复位键,很多载板支持长按强制重启。
  • 确认串口线是否还连得上,JetPack 系统默认配置了串口调试台,可以抓住最后一丝线索看日志。
  • 还是不行,就把板子拆回开发工位,重新通过 SDK Manager 进入烧录模式,做一次无损重刷。
  • 如果重要数据没有备份,这一步会非常痛。所以现在我们强制规定:任何重要模型文件、参数、代码都必须提交到远端 Git 仓库,板上永远不留唯一副本。

远程板子的崩溃无法完全避免,但能让恢复时间从几天压缩到半小时的,唯一靠的就是"数据全部远端化"这个习惯。

6.4 给团队的环境备份与可复现习惯

环境配置这层工作,最怕的是"这台板子上能跑,换台板子就疯了"的玄学。我们从最早的古早阶段就吃够了这种亏,后来逼出了三个固定习惯:

第一,每块板子的 L4T、JetPack、CUDA、TensorRT 版本全部记录在一个共享文档里,任何人要改版本必须先同步到文档再动手。

第二,conda 环境每完成一个重要节点,都执行conda env export把 yaml 文件提交到仓库,容器则把 Dockerfile 和 compose 文件纳入版本管理,这样随时可以重建一模一样的运行环境。

第三,重大项目节点用 Docker 镜像快照或二进制的 rootfs 备份做整盘留存,量级可能比较大,但换来的是其他团队成员在十分钟内就能得到一个一模一样的板子。

很多环境问题看起来像是"疑难杂症",排查半天最后发现就是依赖版本错了一个小版本号。把"版本可复现"这四个字刻进流程里,能替你挡掉绝大多数远程调试的黑夜。

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

逆变器产线热测试:实验室级精度与量产节拍的平衡术

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

作者头像 李华
网站建设 2026/10/1 16:35:23

全闪AI存储一体机如何喂饱GPU:F9000X Turbo技术拆解与实操指南

1. 全闪AI存储一体机到底在解决什么问题第一次看到“全闪AI存储一体机”这个词&#xff0c;很多人脑子里冒出来的画面可能是&#xff1a;一台塞满固态硬盘的服务器&#xff0c;加个“AI”前缀好卖货。但如果你真正在机房蹲过&#xff0c;看过训练任务因为数据读不过来导致GPU利…

作者头像 李华
网站建设 2026/10/1 16:35:11

软件测试流程八环节实战:需求评审、用例设计到缺陷跟踪

做测试这行待久了&#xff0c;你会发现一个挺有意思的现象&#xff1a;几乎所有人都能背出软件测试流程的那八个环节&#xff0c;需求分析评审、测试计划、测试用例、用例评审、执行测试、跟踪定位bug、测试报告、缺陷报告&#xff0c;顺序一个不差。但真到了项目里&#xff0c…

作者头像 李华
网站建设 2026/10/1 16:34:45

Vue项目集成krpano热点:从坐标定位到交互桥接实战指南

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

作者头像 李华
网站建设 2026/10/1 16:33:23

微信小程序组件通信:用selectComponent获取组件实例的实战指南

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

作者头像 李华