<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>Pigeon Server Team</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <icon>https://pigeon-server.cn/icon.png</icon>
  <id>https://pigeon-server.cn/</id>
  <link href="https://pigeon-server.cn/" rel="alternate"/>
  <link href="https://pigeon-server.cn/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, Pigeon Server Team</rights>
  <subtitle>探索 AI · IoT · 嵌入式 · 架构</subtitle>
  <title>鸽子的回忆录</title>
  <updated>2026-05-29T13:16:48.762Z</updated>
  <entry>
    <author>
      <name>Pigeon Server Team</name>
    </author>
    <category term="工程实践" scheme="https://pigeon-server.cn/categories/%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5/"/>
    <category term="架构" scheme="https://pigeon-server.cn/categories/%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5/%E6%9E%B6%E6%9E%84/"/>
    <category term="CI" scheme="https://pigeon-server.cn/tags/CI/"/>
    <category term="代码检查" scheme="https://pigeon-server.cn/tags/%E4%BB%A3%E7%A0%81%E6%A3%80%E6%9F%A5/"/>
    <category term="架构约束" scheme="https://pigeon-server.cn/tags/%E6%9E%B6%E6%9E%84%E7%BA%A6%E6%9D%9F/"/>
    <category term="Python" scheme="https://pigeon-server.cn/tags/Python/"/>
    <category term="AST" scheme="https://pigeon-server.cn/tags/AST/"/>
    <id>https://pigeon-server.cn/posts/architecture-constraints-as-ci-scripts/</id>
    <link href="https://pigeon-server.cn/posts/architecture-constraints-as-ci-scripts/"/>
    <published>2025-06-01T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>项目做到一定规模，你会发现自己写了一大堆”约定”：别用]]>
    </summary>
    <title>架构约束不该只在文档里——让它变成跑不过的 CI 脚本</title>
    <updated>2026-05-29T13:16:48.762Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pigeon Server Team</name>
    </author>
    <category term="架构" scheme="https://pigeon-server.cn/categories/%E6%9E%B6%E6%9E%84/"/>
    <category term="Docker" scheme="https://pigeon-server.cn/categories/%E6%9E%B6%E6%9E%84/Docker/"/>
    <category term="Python" scheme="https://pigeon-server.cn/tags/Python/"/>
    <category term="Docker" scheme="https://pigeon-server.cn/tags/Docker/"/>
    <category term="WebSocket" scheme="https://pigeon-server.cn/tags/WebSocket/"/>
    <category term="远程管理" scheme="https://pigeon-server.cn/tags/%E8%BF%9C%E7%A8%8B%E7%AE%A1%E7%90%86/"/>
    <id>https://pigeon-server.cn/posts/docker-remote-management-over-websocket/</id>
    <link href="https://pigeon-server.cn/posts/docker-remote-management-over-websocket/"/>
    <published>2025-05-31T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>ServerManager 做的是远程管理节点——浏览器连 Panel，Panel 通过
WebSocket 连 Node，Node 在本地操作
Docker。听起来链路不长，但要把镜像、容器、网络、卷、配置、Compose
六类资源的四十多个操作都可靠地搬上]]>
    </summary>
    <title>把 Docker 搬上 WebSocket：六类资源四十个操作的远程管理实战</title>
    <updated>2026-05-29T13:10:23.229Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pigeon Server Team</name>
    </author>
    <category term="架构" scheme="https://pigeon-server.cn/categories/%E6%9E%B6%E6%9E%84/"/>
    <category term="重构" scheme="https://pigeon-server.cn/categories/%E6%9E%B6%E6%9E%84/%E9%87%8D%E6%9E%84/"/>
    <category term="Python" scheme="https://pigeon-server.cn/tags/Python/"/>
    <category term="重构" scheme="https://pigeon-server.cn/tags/%E9%87%8D%E6%9E%84/"/>
    <category term="WebSocket" scheme="https://pigeon-server.cn/tags/WebSocket/"/>
    <category term="协议设计" scheme="https://pigeon-server.cn/tags/%E5%8D%8F%E8%AE%AE%E8%AE%BE%E8%AE%A1/"/>
    <id>https://pigeon-server.cn/posts/from-getattr-to-action-registry-protocol-declaration/</id>
    <link href="https://pigeon-server.cn/posts/from-getattr-to-action-registry-protocol-declaration/"/>
    <published>2025-05-31T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>ServerManager 节点端的代码最早是用
<code>getattr(self, action_name)</code> 来分发 WebSocket
消息的——消息里带个]]>
    </summary>
    <title>从 getattr 分发到 Action Registry：WebSocket 协议从草台班子到正规军</title>
    <updated>2026-05-29T13:07:36.124Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pigeon Server Team</name>
    </author>
    <category term="安全" scheme="https://pigeon-server.cn/categories/%E5%AE%89%E5%85%A8/"/>
    <category term="架构" scheme="https://pigeon-server.cn/categories/%E5%AE%89%E5%85%A8/%E6%9E%B6%E6%9E%84/"/>
    <category term="WebSocket" scheme="https://pigeon-server.cn/tags/WebSocket/"/>
    <category term="Fernet" scheme="https://pigeon-server.cn/tags/Fernet/"/>
    <category term="加密票据" scheme="https://pigeon-server.cn/tags/%E5%8A%A0%E5%AF%86%E7%A5%A8%E6%8D%AE/"/>
    <category term="密码安全" scheme="https://pigeon-server.cn/tags/%E5%AF%86%E7%A0%81%E5%AE%89%E5%85%A8/"/>
    <id>https://pigeon-server.cn/posts/fernet-ticket-terminal-password-secure-transport/</id>
    <link href="https://pigeon-server.cn/posts/fernet-ticket-terminal-password-secure-transport/"/>
    <published>2025-05-30T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>前面两篇分别聊了 WebSocket 节点管理的工程问题和 HMAC
签名防篡改。但有个场景一直没细说——用户在浏览器里点”连接终端”，填入 SSH
密码，这条密码怎么安全地送到远端节点？</p>
<p>最直觉的做法是浏览器把密码明文扔给 Panel，Panel]]>
    </summary>
    <title>终端密码怎么在 WebSocket 上安全地走一趟？</title>
    <updated>2026-05-29T13:03:24.377Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pigeon Server Team</name>
    </author>
    <category term="安全" scheme="https://pigeon-server.cn/categories/%E5%AE%89%E5%85%A8/"/>
    <category term="架构" scheme="https://pigeon-server.cn/categories/%E5%AE%89%E5%85%A8/%E6%9E%B6%E6%9E%84/"/>
    <category term="WebSocket" scheme="https://pigeon-server.cn/tags/WebSocket/"/>
    <category term="文件下载" scheme="https://pigeon-server.cn/tags/%E6%96%87%E4%BB%B6%E4%B8%8B%E8%BD%BD/"/>
    <category term="MinIO" scheme="https://pigeon-server.cn/tags/MinIO/"/>
    <category term="路径逃逸" scheme="https://pigeon-server.cn/tags/%E8%B7%AF%E5%BE%84%E9%80%83%E9%80%B8/"/>
    <category term="SHA-256" scheme="https://pigeon-server.cn/tags/SHA-256/"/>
    <id>https://pigeon-server.cn/posts/file-download-security-chain-minio-streaming-hash-path-escape/</id>
    <link href="https://pigeon-server.cn/posts/file-download-security-chain-minio-streaming-hash-path-escape/"/>
    <published>2025-05-30T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>ServerManager 的一个常见操作是：Panel
决定往某个节点下发一个文件——可能是安装包、配置文件、或者插件资源包。文件存在
MinIO 对象存储里，节点需要通过某种方式拿到它。</p>
<p>听起来简单——发个 URL]]>
    </summary>
    <title>文件从服务器落到节点：一条下载链路的安全缝合</title>
    <updated>2026-05-29T13:05:18.395Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pigeon Server Team</name>
    </author>
    <category term="架构" scheme="https://pigeon-server.cn/categories/%E6%9E%B6%E6%9E%84/"/>
    <category term="Django" scheme="https://pigeon-server.cn/categories/%E6%9E%B6%E6%9E%84/Django/"/>
    <category term="Outbox" scheme="https://pigeon-server.cn/tags/Outbox/"/>
    <category term="事务" scheme="https://pigeon-server.cn/tags/%E4%BA%8B%E5%8A%A1/"/>
    <category term="可靠投递" scheme="https://pigeon-server.cn/tags/%E5%8F%AF%E9%9D%A0%E6%8A%95%E9%80%92/"/>
    <category term="Django" scheme="https://pigeon-server.cn/tags/Django/"/>
    <id>https://pigeon-server.cn/posts/django-transactional-outbox-pattern/</id>
    <link href="https://pigeon-server.cn/posts/django-transactional-outbox-pattern/"/>
    <published>2025-05-29T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>分布式系统里有个经典问题：业务数据写数据库成功了，但通知消息还没发出去——进程就挂了。或者反过来，消息先发了，业务数据入库失败——消费端收到了一个不存在的事件。</p>
<p>Django]]>
    </summary>
    <title>事务性 Outbox 模式在 Django 里的落地：消息绝不丢，也绝不提前到</title>
    <updated>2026-05-29T12:54:30.615Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pigeon Server Team</name>
    </author>
    <category term="架构" scheme="https://pigeon-server.cn/categories/%E6%9E%B6%E6%9E%84/"/>
    <category term="Django" scheme="https://pigeon-server.cn/categories/%E6%9E%B6%E6%9E%84/Django/"/>
    <category term="Django" scheme="https://pigeon-server.cn/tags/Django/"/>
    <category term="整洁架构" scheme="https://pigeon-server.cn/tags/%E6%95%B4%E6%B4%81%E6%9E%B6%E6%9E%84/"/>
    <category term="重构" scheme="https://pigeon-server.cn/tags/%E9%87%8D%E6%9E%84/"/>
    <category term="领域驱动设计" scheme="https://pigeon-server.cn/tags/%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1/"/>
    <id>https://pigeon-server.cn/posts/django-clean-architecture-refactoring/</id>
    <link href="https://pigeon-server.cn/posts/django-clean-architecture-refactoring/"/>
    <published>2025-05-29T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>Django 的开发哲学是”快”——一个 <code>models.py</code>，一个
<code>views.py</code>，加几行 URL
配置，功能就上线了。这里面没有业务层的概念，Model
既管持久化又管业务逻辑，View 既管]]>
    </summary>
    <title>Django 项目的整洁架构重构：从面条代码到契约先行</title>
    <updated>2026-05-29T13:18:28.215Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pigeon Server Team</name>
    </author>
    <category term="Python" scheme="https://pigeon-server.cn/categories/Python/"/>
    <category term="安全" scheme="https://pigeon-server.cn/categories/Python/%E5%AE%89%E5%85%A8/"/>
    <category term="Django" scheme="https://pigeon-server.cn/tags/Django/"/>
    <category term="插件系统" scheme="https://pigeon-server.cn/tags/%E6%8F%92%E4%BB%B6%E7%B3%BB%E7%BB%9F/"/>
    <category term="沙箱" scheme="https://pigeon-server.cn/tags/%E6%B2%99%E7%AE%B1/"/>
    <category term="RestrictedPython" scheme="https://pigeon-server.cn/tags/RestrictedPython/"/>
    <id>https://pigeon-server.cn/posts/python-plugin-sandbox-seven-layers-of-defense/</id>
    <link href="https://pigeon-server.cn/posts/python-plugin-sandbox-seven-layers-of-defense/"/>
    <published>2025-05-29T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>ServerManager
是一个服务器集群管理系统，有个野心不小的插件系统——让用户自己写 Python
代码跑在服务端，而且不用开子进程、不用容器隔离，直接在 Django]]>
    </summary>
    <title>在同一个进程里跑不可信代码：Python 插件沙箱的七层防线</title>
    <updated>2026-05-29T12:43:02.703Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pigeon Server Team</name>
    </author>
    <category term="架构" scheme="https://pigeon-server.cn/categories/%E6%9E%B6%E6%9E%84/"/>
    <category term="网络" scheme="https://pigeon-server.cn/categories/%E6%9E%B6%E6%9E%84/%E7%BD%91%E7%BB%9C/"/>
    <category term="WebSocket" scheme="https://pigeon-server.cn/tags/WebSocket/"/>
    <category term="远程桌面" scheme="https://pigeon-server.cn/tags/%E8%BF%9C%E7%A8%8B%E6%A1%8C%E9%9D%A2/"/>
    <category term="RDP" scheme="https://pigeon-server.cn/tags/RDP/"/>
    <category term="VNC" scheme="https://pigeon-server.cn/tags/VNC/"/>
    <category term="Guacamole" scheme="https://pigeon-server.cn/tags/Guacamole/"/>
    <category term="Node.js" scheme="https://pigeon-server.cn/tags/Node-js/"/>
    <id>https://pigeon-server.cn/posts/remote-desktop-gateway-tcp-tunneling/</id>
    <link href="https://pigeon-server.cn/posts/remote-desktop-gateway-tcp-tunneling/"/>
    <published>2025-05-29T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>在浏览器里连上一台远程服务器的桌面——这听起来像是个浏览器 RDP
客户端就能搞定的事，对吧？Apache Guacamole 就是干这个的：浏览器里跑
JavaScript，通过 guacd（Guacamole proxy daemon）把 RDP/VNC]]>
    </summary>
    <title>浏览器里开 RDP：三层远程桌面网关的 TCP 隧道把戏</title>
    <updated>2026-05-29T12:47:49.862Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pigeon Server Team</name>
    </author>
    <category term="数据库" scheme="https://pigeon-server.cn/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    <category term="架构" scheme="https://pigeon-server.cn/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/%E6%9E%B6%E6%9E%84/"/>
    <category term="Django" scheme="https://pigeon-server.cn/tags/Django/"/>
    <category term="TDengine" scheme="https://pigeon-server.cn/tags/TDengine/"/>
    <category term="时序数据库" scheme="https://pigeon-server.cn/tags/%E6%97%B6%E5%BA%8F%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    <category term="Redis" scheme="https://pigeon-server.cn/tags/Redis/"/>
    <category term="监控" scheme="https://pigeon-server.cn/tags/%E7%9B%91%E6%8E%A7/"/>
    <id>https://pigeon-server.cn/posts/tdengine-timeseries-django-hybrid-storage/</id>
    <link href="https://pigeon-server.cn/posts/tdengine-timeseries-django-hybrid-storage/"/>
    <published>2025-05-29T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>管服务器的，监控数据是个大头——CPU
使用率、每核占用、内存、网络流量、GPU
温度和显存，每个节点每几秒就报一次。ServerManager
用了三层数据架构来存这些东西：PostgreSQL 管业务数据，Redis
缓实时状态，TDengine]]>
    </summary>
    <title>TDengine 时序数据在 Django 里的分层接入：Redis 缓实时，超级表存历史</title>
    <updated>2026-05-29T12:51:10.379Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pigeon Server Team</name>
    </author>
    <category term="前端" scheme="https://pigeon-server.cn/categories/%E5%89%8D%E7%AB%AF/"/>
    <category term="架构" scheme="https://pigeon-server.cn/categories/%E5%89%8D%E7%AB%AF/%E6%9E%B6%E6%9E%84/"/>
    <category term="插件系统" scheme="https://pigeon-server.cn/tags/%E6%8F%92%E4%BB%B6%E7%B3%BB%E7%BB%9F/"/>
    <category term="Vue3" scheme="https://pigeon-server.cn/tags/Vue3/"/>
    <category term="运行时加载" scheme="https://pigeon-server.cn/tags/%E8%BF%90%E8%A1%8C%E6%97%B6%E5%8A%A0%E8%BD%BD/"/>
    <category term="vue3-sfc-loader" scheme="https://pigeon-server.cn/tags/vue3-sfc-loader/"/>
    <id>https://pigeon-server.cn/posts/vue3-runtime-plugin-component-injection/</id>
    <link href="https://pigeon-server.cn/posts/vue3-runtime-plugin-component-injection/"/>
    <published>2025-05-29T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>一般的 Vue
项目，组件是在构建时打包进去的——<code>import MyComponent from './MyComponent.vue'</code>，Webpack/Vite
把它打进]]>
    </summary>
    <title>把 Vue 3 组件在运行时塞进页面：插件系统的前端注入术</title>
    <updated>2026-05-29T12:53:03.917Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pigeon Server Team</name>
    </author>
    <category term="安全" scheme="https://pigeon-server.cn/categories/%E5%AE%89%E5%85%A8/"/>
    <category term="架构" scheme="https://pigeon-server.cn/categories/%E5%AE%89%E5%85%A8/%E6%9E%B6%E6%9E%84/"/>
    <category term="Django" scheme="https://pigeon-server.cn/tags/Django/"/>
    <category term="WebSocket" scheme="https://pigeon-server.cn/tags/WebSocket/"/>
    <category term="HMAC" scheme="https://pigeon-server.cn/tags/HMAC/"/>
    <category term="签名验证" scheme="https://pigeon-server.cn/tags/%E7%AD%BE%E5%90%8D%E9%AA%8C%E8%AF%81/"/>
    <category term="Channels" scheme="https://pigeon-server.cn/tags/Channels/"/>
    <id>https://pigeon-server.cn/posts/websocket-hmac-signature-protocol/</id>
    <link href="https://pigeon-server.cn/posts/websocket-hmac-signature-protocol/"/>
    <published>2025-05-29T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>前面写过一篇关于 WebSocket
节点管理的文章，聊了连接保活、重连、认证这些事。但连接建立只是开始——消息在
WebSocket
连接上明文飞来飞去，中间人要是能插一脚，就能伪造指令让节点执行任意]]>
    </summary>
    <title>WebSocket 消息防篡改：给控制指令加 HMAC 签名</title>
    <updated>2026-05-29T12:45:48.772Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pigeon Server Team</name>
    </author>
    <category term="边缘计算" scheme="https://pigeon-server.cn/categories/%E8%BE%B9%E7%BC%98%E8%AE%A1%E7%AE%97/"/>
    <category term="AI" scheme="https://pigeon-server.cn/categories/%E8%BE%B9%E7%BC%98%E8%AE%A1%E7%AE%97/AI/"/>
    <category term="YOLO" scheme="https://pigeon-server.cn/tags/YOLO/"/>
    <category term="ONNX" scheme="https://pigeon-server.cn/tags/ONNX/"/>
    <category term="SSIM" scheme="https://pigeon-server.cn/tags/SSIM/"/>
    <category term="变化检测" scheme="https://pigeon-server.cn/tags/%E5%8F%98%E5%8C%96%E6%A3%80%E6%B5%8B/"/>
    <category term="边缘推理" scheme="https://pigeon-server.cn/tags/%E8%BE%B9%E7%BC%98%E6%8E%A8%E7%90%86/"/>
    <id>https://pigeon-server.cn/posts/edge-yolo-ssim-change-detection-upload/</id>
    <link href="https://pigeon-server.cn/posts/edge-yolo-ssim-change-detection-upload/"/>
    <published>2025-03-25T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>巡检车上的 YOLO 推理节点跑在树莓派上，每秒处理 2
帧。检测到病虫害就往后端上传图片。问题在于：车停着不动的时候，相机拍到的画面几乎一样，YOLO
检测到的框也几乎一样——但每帧都上传，后端收到的全是重复图片。</p>
<p>一帧 JPEG 85 质量大约]]>
    </summary>
    <title>边缘端 YOLO 推理——SSIM 变化检测 + bbox 签名去重，别把相似的帧都上传了</title>
    <updated>2026-05-29T13:54:59.342Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pigeon Server Team</name>
    </author>
    <category term="机器人" scheme="https://pigeon-server.cn/categories/%E6%9C%BA%E5%99%A8%E4%BA%BA/"/>
    <category term="ROS2" scheme="https://pigeon-server.cn/categories/%E6%9C%BA%E5%99%A8%E4%BA%BA/ROS2/"/>
    <category term="Nav2" scheme="https://pigeon-server.cn/tags/Nav2/"/>
    <category term="生命周期" scheme="https://pigeon-server.cn/tags/%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/"/>
    <category term="竞态条件" scheme="https://pigeon-server.cn/tags/%E7%AB%9E%E6%80%81%E6%9D%A1%E4%BB%B6/"/>
    <category term="workaround" scheme="https://pigeon-server.cn/tags/workaround/"/>
    <id>https://pigeon-server.cn/posts/nav2-bt-navigator-startup-race-condition/</id>
    <link href="https://pigeon-server.cn/posts/nav2-bt-navigator-startup-race-condition/"/>
    <published>2025-03-22T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>Nav2 启动后偶尔导航不工作。看日志，<code>bt_navigator</code> 报
“backup action server not available”，然后加载 BT XML 失败，节点进入
inactive]]>
    </summary>
    <title>Nav2 的 bt_navigator 启动竞态——等 action server 就绪再激活</title>
    <updated>2026-05-29T13:53:56.209Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pigeon Server Team</name>
    </author>
    <category term="机器人" scheme="https://pigeon-server.cn/categories/%E6%9C%BA%E5%99%A8%E4%BA%BA/"/>
    <category term="传感器融合" scheme="https://pigeon-server.cn/categories/%E6%9C%BA%E5%99%A8%E4%BA%BA/%E4%BC%A0%E6%84%9F%E5%99%A8%E8%9E%8D%E5%90%88/"/>
    <category term="ROS2" scheme="https://pigeon-server.cn/tags/ROS2/"/>
    <category term="激光雷达" scheme="https://pigeon-server.cn/tags/%E6%BF%80%E5%85%89%E9%9B%B7%E8%BE%BE/"/>
    <category term="深度相机" scheme="https://pigeon-server.cn/tags/%E6%B7%B1%E5%BA%A6%E7%9B%B8%E6%9C%BA/"/>
    <category term="传感器融合" scheme="https://pigeon-server.cn/tags/%E4%BC%A0%E6%84%9F%E5%99%A8%E8%9E%8D%E5%90%88/"/>
    <id>https://pigeon-server.cn/posts/scan-fusion-lidar-depth-fixed-size/</id>
    <link href="https://pigeon-server.cn/posts/scan-fusion-lidar-depth-fixed-size/"/>
    <published>2025-03-18T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>巡检车上装了两个距离传感器：MS200 激光雷达和 Aurora 930 Pro
深度相机。激光雷达 360°
扫描但前方有盲区，深度相机只看前方但近距离精度高。SLAM 和 Nav2
需要一条统一的]]>
    </summary>
    <title>Scan Fusion——激光雷达和深度相机怎么合成一条扫描线</title>
    <updated>2026-05-29T13:53:11.129Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pigeon Server Team</name>
    </author>
    <category term="机器人" scheme="https://pigeon-server.cn/categories/%E6%9C%BA%E5%99%A8%E4%BA%BA/"/>
    <category term="算法" scheme="https://pigeon-server.cn/categories/%E6%9C%BA%E5%99%A8%E4%BA%BA/%E7%AE%97%E6%B3%95/"/>
    <category term="Nav2" scheme="https://pigeon-server.cn/tags/Nav2/"/>
    <category term="脱困" scheme="https://pigeon-server.cn/tags/%E8%84%B1%E5%9B%B0/"/>
    <category term="代价地图" scheme="https://pigeon-server.cn/tags/%E4%BB%A3%E4%BB%B7%E5%9C%B0%E5%9B%BE/"/>
    <category term="射线投射" scheme="https://pigeon-server.cn/tags/%E5%B0%84%E7%BA%BF%E6%8A%95%E5%B0%84/"/>
    <id>https://pigeon-server.cn/posts/wedge-ray-costmap-recovery-stuck-escape/</id>
    <link href="https://pigeon-server.cn/posts/wedge-ray-costmap-recovery-stuck-escape/"/>
    <published>2025-03-15T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>巡检车在甘蔗田里跑，卡住是家常便饭。可能是轮子陷进泥里，可能是两侧甘蔗秆夹住了，也可能是
Nav2]]>
    </summary>
    <title>巡检车卡住了怎么办——12 楔射线脱困算法</title>
    <updated>2026-05-29T13:52:09.466Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pigeon Server Team</name>
    </author>
    <category term="IoT" scheme="https://pigeon-server.cn/categories/IoT/"/>
    <category term="安全" scheme="https://pigeon-server.cn/categories/IoT/%E5%AE%89%E5%85%A8/"/>
    <category term="WebSocket" scheme="https://pigeon-server.cn/tags/WebSocket/"/>
    <category term="自签证书" scheme="https://pigeon-server.cn/tags/%E8%87%AA%E7%AD%BE%E8%AF%81%E4%B9%A6/"/>
    <category term="请求签名" scheme="https://pigeon-server.cn/tags/%E8%AF%B7%E6%B1%82%E7%AD%BE%E5%90%8D/"/>
    <category term="零信任" scheme="https://pigeon-server.cn/tags/%E9%9B%B6%E4%BF%A1%E4%BB%BB/"/>
    <id>https://pigeon-server.cn/posts/rover-edge-cloud-comm-cert-signing-websocket/</id>
    <link href="https://pigeon-server.cn/posts/rover-edge-cloud-comm-cert-signing-websocket/"/>
    <published>2025-03-12T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>IoT
设备跟后端通信，最怕三件事：别人冒充你的设备发假数据、数据在半路被改了、连着连着断了没人管。</p>
<p>我们的巡检车跑在果园里，通过 WiFi]]>
    </summary>
    <title>小车怎么跟后端安全通信——自签证书、请求签名和那个 WebSocket 重连</title>
    <updated>2026-05-29T13:51:16.047Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pigeon Server Team</name>
    </author>
    <category term="机器人" scheme="https://pigeon-server.cn/categories/%E6%9C%BA%E5%99%A8%E4%BA%BA/"/>
    <category term="算法" scheme="https://pigeon-server.cn/categories/%E6%9C%BA%E5%99%A8%E4%BA%BA/%E7%AE%97%E6%B3%95/"/>
    <category term="前沿探索" scheme="https://pigeon-server.cn/tags/%E5%89%8D%E6%B2%BF%E6%8E%A2%E7%B4%A2/"/>
    <category term="SLAM" scheme="https://pigeon-server.cn/tags/SLAM/"/>
    <category term="通道感知" scheme="https://pigeon-server.cn/tags/%E9%80%9A%E9%81%93%E6%84%9F%E7%9F%A5/"/>
    <category term="ROS2" scheme="https://pigeon-server.cn/tags/ROS2/"/>
    <id>https://pigeon-server.cn/posts/channel-aware-frontier-exploration-sugarcane/</id>
    <link href="https://pigeon-server.cn/posts/channel-aware-frontier-exploration-sugarcane/"/>
    <published>2025-03-08T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>通用的前沿探索算法不管用——至少在甘蔗田里不管用。</p>
<p>甘蔗田的结构是平行的狭长通道，行距大约 1.5 米，行长约 100
米。通用算法选前沿点只看距离和簇大小，结果车走到一条通道尽头，转]]>
    </summary>
    <title>甘蔗田里的自主探索——通道感知的前沿探索算法</title>
    <updated>2026-05-29T13:50:00.163Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pigeon Server Team</name>
    </author>
    <category term="机器人" scheme="https://pigeon-server.cn/categories/%E6%9C%BA%E5%99%A8%E4%BA%BA/"/>
    <category term="嵌入式" scheme="https://pigeon-server.cn/categories/%E6%9C%BA%E5%99%A8%E4%BA%BA/%E5%B5%8C%E5%85%A5%E5%BC%8F/"/>
    <category term="ROS2" scheme="https://pigeon-server.cn/tags/ROS2/"/>
    <category term="IMU" scheme="https://pigeon-server.cn/tags/IMU/"/>
    <category term="安全检测" scheme="https://pigeon-server.cn/tags/%E5%AE%89%E5%85%A8%E6%A3%80%E6%B5%8B/"/>
    <category term="状态机" scheme="https://pigeon-server.cn/tags/%E7%8A%B6%E6%80%81%E6%9C%BA/"/>
    <id>https://pigeon-server.cn/posts/imu-safety-state-machine-pickup-fall-tipover/</id>
    <link href="https://pigeon-server.cn/posts/imu-safety-state-machine-pickup-fall-tipover/"/>
    <published>2025-03-05T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>巡检车在甘蔗田里跑着跑着，有人走过来把它搬走了——系统完全不知道，导航还在傻乎乎地算路径，电机还在空转。更离谱的：车从台阶上摔下去了，IMU
数据疯狂跳动，但代码只是在日志里打了几行 warning，该走的路还在走。</p>
<p>这些事真发生过。后来我写了一套基于]]>
    </summary>
    <title>IMU 安全状态机——让巡检车在被搬起来的时候知道自己被搬起来了</title>
    <updated>2026-05-29T13:47:01.273Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pigeon Server Team</name>
    </author>
    <category term="IoT" scheme="https://pigeon-server.cn/categories/IoT/"/>
    <category term="网络协议" scheme="https://pigeon-server.cn/categories/IoT/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/"/>
    <category term="mDNS" scheme="https://pigeon-server.cn/tags/mDNS/"/>
    <category term="Zeroconf" scheme="https://pigeon-server.cn/tags/Zeroconf/"/>
    <category term="服务发现" scheme="https://pigeon-server.cn/tags/%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0/"/>
    <category term="零配置" scheme="https://pigeon-server.cn/tags/%E9%9B%B6%E9%85%8D%E7%BD%AE/"/>
    <id>https://pigeon-server.cn/posts/mdns-service-discovery-triple-fallback/</id>
    <link href="https://pigeon-server.cn/posts/mdns-service-discovery-triple-fallback/"/>
    <published>2025-03-01T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>IoT 项目有个很实际的问题：后端的 IP 地址怎么告诉设备？</p>
<p>Web 应用有域名，配个 DNS 就完事。IoT 设备跑在内网，没域名，IP 还是
DHCP
动态分配的。你要在每台传感器、每个智能插座上硬编码后端地址？下次路由器重启
IP]]>
    </summary>
    <title>mDNS 服务发现——让 IoT 设备零配置找到后端的那三重降级</title>
    <updated>2026-05-29T13:20:39.223Z</updated>
  </entry>
</feed>
