<?xml version="1.0" encoding="UTF-8"?>
    <feed xmlns="http://www.w3.org/2005/Atom">
      <title>sorodo</title>
      <link href="/atom.xml" rel="self"/>
      <link href="/feed" rel="self"/>
      <link href="https://www.sorodo.xyz"/>
      <updated>2026-06-30T18:42:18.640Z</updated>
      <id>https://www.sorodo.xyz</id>
      <author>
        <name>sorodo猫娘</name>
      </author>
      <generator>Mix Space CMS</generator>
      <lastBuildDate>2026-06-30T18:42:18.640Z</lastBuildDate>
      <language>zh-CN</language>
      <image>
          <url>https://s3.bmp.ovh/imgs/2024/05/28/0d526b71da9a5101.jpg</url>
          <title>sorodo</title>
          <link>https://www.sorodo.xyz</link>
      </image>
        <entry>
            <title>Codex 在 SSH Remote 场景下登录 403 （ Country, region, or territory not supported） 问题留档</title>
            <link href='https://www.sorodo.xyz/posts/default/codex403'/>
            <id>https://www.sorodo.xyz/posts/default/codex403</id>
            <published>2026-06-11T07:10:01.642Z</published>
            <updated>null</updated>
            <content type='html'><![CDATA[
              <blockquote>该渲染由 Kami API 生成，可能存在排版问题，最佳体验请前往：<a href='https://www.sorodo.xyz/posts/default/codex403'>https://www.sorodo.xyz/posts/default/codex403</a></blockquote>
<div><div><h2 id="背景">背景</h2><p>这次遇到的问题表面上很简单：在 Windsurf 里登录 Codex 插件时，反复报错：</p><p><code>Token exchange failed: token endpoint returned status 403 Forbidden: Country, region, or territory not supported</code></p><p>但实际排查下来，这不是一个单点问题，而是一个典型的 <strong>SSH Remote + 浏览器登录 + 远端 token exchange + 代理出口风控</strong> 叠加问题。</p><p>本文记录一次完整排障过程，重点回答四个问题：</p><ol start="1"><li>Windsurf / Codex 在 SSH Remote 下的登录流程到底是什么。</li><li>为什么“浏览器能打开登录页”并不等于“最终一定能登录成功”。</li><li>为什么修改远端机器的 <code>.bashrc</code> 这类配置有时真的会生效。</li><li>这次问题的根因、有效做法、以及后续可复用的排查思路是什么。</li></ol><hr/><h2 id="现象">现象</h2><p>登录 Codex 时，Windsurf 日志中反复出现：</p><ul><li><code>TypeError: fetch failed</code></li><li><code>oauth token exchange returned non-success status status=403 Forbidden</code></li><li><code>unsupported_country_region_territory</code></li></ul><p>关键日志位于：</p><ul><li><code>~/.windsurf-server/data/logs/20260611T120845/exthost2/openai.chatgpt/Codex.log</code></li><li><code>~/.windsurf-server/data/logs/20260611T120845/exthost4/openai.chatgpt/Codex.log</code></li></ul><p>后续多次重试后，最新一轮仍然是同样的失败点：</p><ul><li>浏览器登录流程走到了 callback</li><li>但 <strong>token exchange</strong> 阶段仍然返回 <code>403 Forbidden</code></li><li>错误码为 <code>unsupported_country_region_territory</code></li></ul><p>说明问题是 <strong>服务端对当前出口 IP / 区域 / 风险特征做了拒绝</strong>。</p><hr/><h2 id="一、ssh-remote-下的实际登录链路">一、SSH Remote 下的实际登录链路</h2><p>排查中可以确认：</p><ul><li>Windsurf 的远端扩展宿主进程运行在 <strong>远端机器</strong> 上</li><li>远端环境里存在 <code>BROWSER=.../helpers/browser.sh</code></li><li>这个 <code>browser.sh</code> 实际调用的是 <code>server-cli.js --openExternal</code></li></ul><p>表明：</p><ol start="1"><li><strong>打开浏览器</strong> 这个动作，会被从远端请求转发到客户端侧执行</li><li>但很多真正的网络请求，尤其是 <strong>Codex / ChatGPT 相关的 token exchange</strong>，仍然发生在 <strong>远端进程</strong> 中</li></ol><p>换句话说，这个流程至少分成两段：</p><h3 id="1.-浏览器阶段">1. 浏览器阶段</h3><ul><li>本地浏览器打开登录页</li><li>用户完成账号登录</li><li>页面回调回 Windsurf / Codex</li></ul><h3 id="2.-ide-/-远端服务阶段">2. IDE / 远端服务阶段</h3><ul><li>远端 Windsurf / Codex 进程继续完成 token exchange</li><li>与 <code>chatgpt.com</code>、<code>ab.chatgpt.com</code>、插件同步接口等发生通信</li></ul><p>这就是为什么：</p><ul><li><strong>本地浏览器代理</strong> 可能影响登录页是否正常打开</li><li><strong>远端代理环境</strong> 又会影响最终 token exchange 是否成功</li></ul><p>如果只改其中一边，另一边仍然可能失败。</p><hr/><h2 id="二、以前改浏览器代理曾经成功">二、以前改浏览器代理曾经成功</h2><p>之前遇到过类似问题，而且通过“改浏览器代理”解决过。这个经验并不矛盾，反而很关键。</p><p>它通常对应两种可能：</p><h3 id="1.-当时失败点主要发生在浏览器侧">1. 当时失败点主要发生在浏览器侧</h3><p>例如：</p><ul><li>浏览器没有走系统代理</li><li>浏览器插件指定了一个更干净的节点</li><li>登录页本身被地区 / 风控拦截</li></ul><p>这种情况下，只改浏览器代理，确实可能直接解决问题。</p><h3 id="2.-浏览器和-ide-当时碰巧走到了同一个可用出口">2. 浏览器和 IDE 当时碰巧走到了同一个可用出口</h3><p>即使 Windsurf / Codex 的后续 token exchange 在远端执行，只要：</p><ul><li>浏览器出口够干净</li><li>远端出口也足够干净</li><li>或两边实际落到同一类可用出口</li></ul><p>也可能顺利成功。</p><p>但这一次情况不同：</p><ul><li>浏览器链路不一定是唯一问题</li><li>远端进程本身也明确参与 token exchange</li><li>远端实际出口质量很差</li></ul><p>所以只改浏览器代理，未必能再复现之前的成功。</p><hr/><h2 id="三、这次排查出的几个关键事实">三、这次排查出的几个关键事实</h2><h3 id="1.-日志失败点始终一致">1. 日志失败点始终一致</h3><p>无论重试多少次，核心错误都没有变：</p><ul><li><code>unsupported_country_region_territory</code></li><li><code>Token exchange failed</code></li></ul><p>这说明不是一次性的偶发异常，而是稳定的环境问题。</p><h3 id="2.-远端-windsurf-进程没有真正继承代理环境">2. 远端 Windsurf 进程没有真正继承代理环境</h3><p>这是本次排查最重要的发现之一。</p><p>虽然已经做过：</p><ul><li><code>http.proxy</code></li><li><code>http.proxySupport</code></li><li>远端 <code>.bashrc</code> 中加入 <code>http_proxy / https_proxy / all_proxy</code></li><li><code>remote.windsurfSSH.httpProxy</code></li><li><code>remote.windsurfSSH.httpsProxy</code></li></ul><p>但真正查看远端 <code>extensionHost</code> 和其父进程环境时，仍然发现：</p><ul><li>没有 <code>http_proxy</code></li><li>没有 <code>https_proxy</code></li><li>没有 <code>all_proxy</code></li></ul><p>同时还能看到：</p><ul><li><code>--useHostProxy=false</code></li></ul><p>这说明：</p><ul><li>远端进程的启动链路并没有可靠继承 shell 中的代理导出</li><li>即使设置文件已经写入，也不代表当前在跑的远端 server 一定已经重新加载</li></ul><h3 id="3.-“重启登录”并不等于远端-server-被真正重启">3. “重启登录”并不等于远端 server 被真正重启</h3><p>进一步查看进程树发现：</p><ul><li>新的 <code>extensionHost</code> 是后来重新拉起的</li><li>但远端 <code>windsurf-server</code> 的父进程其实还是 <strong>12:08 启动的老进程</strong></li></ul><p>这说明很多看起来像“已经重启”的操作，实际上只是：</p><ul><li>重启了部分子进程</li><li>或重新打开了登录流程</li><li>但没有让远端 server 主进程按新环境重新启动</li></ul><p>只要这个老父进程还在，后续子进程就很可能继续继承旧环境。</p><hr/><h2 id="四、为什么改远端-`.bashrc`-有时有效">四、为什么改远端 <code>.bashrc</code> 有时有效</h2><p>以前改.bashrc成功过。</p><p>有些人会说：</p><blockquote><p>浏览器明明在本地开，为什么改远端 <code>.bashrc</code> 会有用？</p></blockquote><p>答案是：</p><ul><li><strong>打开浏览器</strong> 不等于 <strong>所有登录相关请求都在本地执行</strong></li><li>SSH Remote 场景下，远端 Windsurf / Codex 进程仍然负责一部分关键请求</li><li>只要这些请求发生在远端，它们就会受到远端环境变量、远端 server 启动参数、远端代理设置的影响</li></ul><p>所以改远端 <code>.bashrc</code> 并不是“玄学”，而是可能确实影响：</p><ul><li>远端 extension host</li><li>远端 app-server</li><li>远端插件同步</li><li>远端 token exchange</li></ul><p>不过前提是：</p><ul><li>这些变量真的被启动链路继承到了</li><li>对应进程也确实被重新拉起</li></ul><p>如果只是改了 <code>.bashrc</code>，但老 server 没退出，那就可能“看起来改了，实际没生效”。</p><hr/><h2 id="五、修正">五、修正</h2><h3 id="1.-在远端-windsurf-用户设置中手动指定代理">1. 在远端 Windsurf 用户设置中手动指定代理</h3><p>修改：</p><ul><li><code>~/.windsurf-server/data/User/settings.json</code></li></ul><p>内容包括：</p><pre><code class="lang-json">{
  &quot;http.proxy&quot;: &quot;http://127.0.0.1:7897&quot;,
  &quot;http.proxySupport&quot;: &quot;override&quot;,
  &quot;remote.windsurfSSH.httpProxy&quot;: &quot;http://127.0.0.1:7897&quot;,
  &quot;remote.windsurfSSH.httpsProxy&quot;: &quot;http://127.0.0.1:7897&quot;
}</code></pre><h3 id="2.-在远端-`.bashrc`-中导出代理环境变量">2. 在远端 <code>.bashrc</code> 中导出代理环境变量</h3><p>加入了：</p><ul><li><code>http_proxy</code></li><li><code>https_proxy</code></li><li><code>all_proxy</code></li><li><code>HTTP_PROXY</code></li><li><code>HTTPS_PROXY</code></li><li><code>ALL_PROXY</code></li><li><code>no_proxy</code></li><li><code>NO_PROXY</code></li></ul><p>而且特意放在了 <code>.bashrc</code> 里“非交互 shell 提前 return”之前。</p><h3 id="3.-修改远端-`windsurf-server`-启动脚本">3. 修改远端 <code>windsurf-server</code> 启动脚本</h3><p>进一步将代理导出直接写入：</p><ul><li><code>~/.windsurf-server/bin/&lt;commit&gt;/bin/windsurf-server</code></li></ul><p>目的是绕开 shell 继承不稳定的问题，让后续 server 主进程和其子进程在启动时显式拥有代理环境。</p><h3 id="4.-切换默认浏览器到-chromium">4. 切换默认浏览器到 Chromium</h3><p>因为本地发现：</p><ul><li><code>Chromium</code> 没有单独代理扩展</li><li>没有额外 <code>proxy</code> 配置</li><li>比一个配置不明确的 Firefox 环境更容易和系统代理保持一致</li></ul><p>这个操作的目标是减少：</p><ul><li>本地浏览器出口</li><li>远端 Windsurf 登录链路</li></ul><p>之间的不一致性。</p><hr/><h2 id="六、若问题仍然没有消失">六、若问题仍然没有消失</h2><p>到这里还没有最终彻底登录成功，原因主要有两个：</p><h3 id="1.-远端老-server-仍未被完全重启">1. 远端老 server 仍未被完全重启</h3><p>虽然配置和脚本都改了，但运行中的老 <code>windsurf-server</code> 进程没有完全退出并重启。</p><p>因此：</p><ul><li>新配置可能尚未真正进入生效态</li><li>新的 <code>extensionHost</code> 仍可能被老父进程按旧环境拉起</li></ul><h3 id="2.-即使代理生效，当前代理出口本身仍可能不够干净">2. 即使代理生效，当前代理出口本身仍可能不够干净</h3><p>从前面的节点测试可知，这批节点大概率共享同类高风险机房出口。</p><p>所以最终问题很可能是 <strong>双重叠加</strong>：</p><ul><li>一方面，远端代理链路没有完全正确注入</li><li>另一方面，现有代理出口本身也可能已被风控 / 地域限制命中</li></ul><p>也就是说，这不是一个“只改一处就一定成功”的问题。</p><hr/><h2 id="七、最终根因总结">七、最终根因总结</h2><p>如果要用一句话概括这次问题，可以写成：</p><blockquote><p>这是一个由 <strong>SSH Remote 登录链路分裂</strong>、<strong>远端代理继承不稳定</strong>、以及 <strong>代理出口本身被风控/地域限制</strong> 共同导致的登录失败问题。</p></blockquote><p>更细一点，可以拆成三条：</p><h3 id="根因-1：登录流程并非纯本地">根因 1：登录流程并非纯本地</h3><ul><li>浏览器可能在本地打开</li><li>但 token exchange 明确发生在远端进程</li><li>因此不能只看本地浏览器代理</li></ul><h3 id="根因-2：远端代理配置没有真正进入运行中的-server-进程">根因 2：远端代理配置没有真正进入运行中的 server 进程</h3><ul><li>改了 <code>.bashrc</code></li><li>改了 <code>settings.json</code></li><li>但老 <code>windsurf-server</code> 没彻底退出</li><li>导致新配置没有完全被真正运行的父进程继承</li></ul><h3 id="根因-3：当前-clash-节点出口质量差">根因 3：当前 Clash 节点出口质量差</h3><ul><li>多个节点实际共用同类洛杉矶机房出口</li><li><code>hosting: true</code></li><li>这类出口更容易触发 OpenAI / ChatGPT / Codex 的地区与风控限制</li></ul><hr/><h2 id="经验">经验</h2><p>这次最有价值的经验不是“把某个开关打开了”，而是下面这句话：</p><blockquote><p>在 SSH Remote 场景下，任何涉及 OAuth / 浏览器回调 / token exchange 的问题，都应该默认按“本地 + 远端双端排查”来处理。</p></blockquote><p>只排本地，容易漏掉远端 token exchange。</p><p>只排远端，又容易忽略浏览器实际打开位置和本地代理扩展。</p><p>而如果代理出口本身质量差，那么即使两边都配对了，最终也仍然可能被服务端 403。</p></div></div>
              <p style='text-align: right'>
              <a href='https://www.sorodo.xyz/posts/default/codex403#comments'>看完了？说点什么呢</a>
              </p>
            ]]>
            </content>
            </entry>
          <entry>
            <title>Tailscale远程配置</title>
            <link href='https://www.sorodo.xyz/posts/Ref-utils/tailscale'/>
            <id>https://www.sorodo.xyz/posts/Ref-utils/tailscale</id>
            <published>2026-04-17T02:41:10.239Z</published>
            <updated>2026-04-28T06:50:22.161Z</updated>
            <content type='html'><![CDATA[
              <blockquote>该渲染由 Kami API 生成，可能存在排版问题，最佳体验请前往：<a href='https://www.sorodo.xyz/posts/Ref-utils/tailscale'>https://www.sorodo.xyz/posts/Ref-utils/tailscale</a></blockquote>
<div><div><h3 id="前言">前言</h3><p>为了防止公网暴露，最后还是放弃了反向ssh的方法。Tailscale一开始以为会延迟很高，但是在正确配置之后，也能实现低延迟的舒适ssh</p><p>应用场景：个人主机PC在家庭/内网等需要远程ssh连接的情况。</p><h3 id="tailscale安装&amp;使用">Tailscale安装&amp;使用</h3><p>没啥说的，巨简单</p><p><a href="https://tailscale.com/">https://tailscale.com/</a></p><h3 id="p2p">P2P</h3><p>正常走DERP默认国外的那几个服务器，在国内使用延迟会很高，如果不想自建DERP的话，优先打通P2P。</p><p>首先确认一下当前的主机是否支持P2P，(部分内网会拦截）。</p><pre><code class="lang-powershell">tailscale status

tailscale netcheck</code></pre><p>查看是不是有如下的：</p><p>UDP: true</p><p>MappingVariesByDestIP: false</p><p>IPv4: yes</p><p>IPv6: yes</p><p>尤其是对于其中的MappingVariesByDestIP，如果为true的话很可能你是在公司内网或者酒店网络等环境（hard NAT）。个人建议是换手机热点。</p><p>接下来放行防火墙。</p><p>对于Linux:</p><pre><code class="lang-bash">sudo ufw allow 41641/udp</code></pre><p>对于win: 注意是powershell不是cmd</p><pre><code class="lang-powershell">New-NetFirewallRule -DisplayName &quot;Tailscale UDP&quot; ` -Direction Inbound -Protocol UDP -LocalPort 41641 -Action Allow

New-NetFirewallRule -DisplayName &quot;Tailscale UDP OUT&quot; ` -Direction Outbound -Protocol UDP -LocalPort 41641 -Action Allow</code></pre><p>或者云服务器安全组：放行 UDP 41641</p><p>有必要重启一下tailscale。</p><pre><code class="lang-bash">sudo tailscale down
sudo tailscale up --reset</code></pre><p>最后可以直接测试是否打通</p><pre><code class="lang-bash">tailscale status
tailscale ping &lt;对端ip&gt;</code></pre><p>如果是pong ... via xx.xx.xx.xxx:xxxx in xxms 没有DERP等字样就是成了</p></div></div>
              <p style='text-align: right'>
              <a href='https://www.sorodo.xyz/posts/Ref-utils/tailscale#comments'>看完了？说点什么呢</a>
              </p>
            ]]>
            </content>
            </entry>
          <entry>
            <title>github 自查指令表</title>
            <link href='https://www.sorodo.xyz/posts/default/git'/>
            <id>https://www.sorodo.xyz/posts/default/git</id>
            <published>2026-03-19T03:40:02.162Z</published>
            <updated>2026-04-20T03:37:50.062Z</updated>
            <content type='html'><![CDATA[
              <blockquote>该渲染由 Kami API 生成，可能存在排版问题，最佳体验请前往：<a href='https://www.sorodo.xyz/posts/default/git'>https://www.sorodo.xyz/posts/default/git</a></blockquote>
<div><div><h3 id="配置-git-环境">配置 Git 环境</h3><p>在每台主机上安装 Git
确保所有主机都已经安装了 Git。对于 Linux 和 macOS 用户可以通过包管理器安装，Windows 用户可以下载并安装 Git for Windows。</p><p>设置用户信息
在每台主机上设置你的用户名和邮箱地址：</p><pre><code class="lang-bash">git config --global user.name &quot;Your Name&quot;
git config --global user.email &quot;you@example.com&quot;</code></pre><p><strong>初始化或克隆仓库</strong></p><p>初始化新的仓库
如果你正在启动一个新的项目，可以在其中一台主机上初始化一个 Git 仓库：</p><pre><code class="lang-bash">cd your_project_directory
git init</code></pre><p><strong>克隆现有的仓库</strong>
如果要从 GitHub 或其他远程仓库开始工作，在任何主机上运行以下命令克隆仓库：</p><pre><code class="lang-bash">git clone https://github.com/yourusername/your-repo.git</code></pre><h3 id="**分支管理**"><strong>分支管理</strong></h3><h5 id="查看当前分支">查看当前分支</h5><p>查看所有本地分支，并标识出当前所在的分支：</p><pre><code class="lang-bash">git branch</code></pre><h5 id="创建新分支">创建新分支</h5><p>在任意主机上基于当前分支创建一个新分支：</p><pre><code class="lang-bash">git checkout -b new-branch-name
# 或者使用 Git 2.23+ 版本的 switch 命令 git switch -c new-branch-name</code></pre><h5 id="切换分支">切换分支</h5><p>切换到已存在的分支：</p><pre><code class="lang-bash">git checkout existing-branch-name
# 或者使用 Git 2.23+ 版本的 switch 命令 git switch existing-branch-name</code></pre><p>推送新分支至远程
当你在一个主机上创建了一个新分支，并希望将其推送到远程仓库时：</p><pre><code class="lang-bash">git push -u origin new-branch-name</code></pre><h4 id="同步与更新代码">同步与更新代码</h4><h5 id="拉取最新更改">拉取最新更改</h5><p>在进行任何更改之前，建议先拉取最新的更改以避免冲突：</p><p>本质等于 git fetch + git merge</p><pre><code class="lang-bash">git pull origin main</code></pre><h5 id="提交更改">提交更改</h5><p>完成修改后，添加文件到暂存区，然后提交：</p><pre><code class="lang-bash">git add .
git commit -m &quot;描述你的更改&quot;</code></pre><h5 id="推送更改">推送更改</h5><p>将本地的更改推送到远程仓库：</p><pre><code class="lang-bash">git push origin current-branch-name</code></pre><h4 id="处理冲突">处理冲突</h4><p>当多个主机对同一文件进行了不同的修改时，可能会发生冲突。解决步骤如下：</p><p>执行 git pull 时遇到冲突。
手动编辑冲突文件，选择保留哪些更改。
标记冲突为已解决：git add conflicted-file
完成合并：git commit</p><h4 id="分支合并">分支合并</h4><p>合并分支
假设你想把 feature 分支的工作合并到主分支中：</p><pre><code class="lang-bash">git checkout main
git merge feature</code></pre><h4 id="删除分支">删除分支</h4><h5 id="删除本地分支">删除本地分支</h5><p>一旦确认不再需要某个分支，可以删除它：</p><pre><code class="lang-bash">git branch -d branch-name</code></pre><h5 id="删除远程分支">删除远程分支</h5><p>如果你想从远程仓库中删除一个分支：</p><pre><code class="lang-bash">git push origin --delete branch-name</code></pre></div></div>
              <p style='text-align: right'>
              <a href='https://www.sorodo.xyz/posts/default/git#comments'>看完了？说点什么呢</a>
              </p>
            ]]>
            </content>
            </entry>
          <entry>
            <title>rtabmap手记</title>
            <link href='https://www.sorodo.xyz/posts/Ref-utils/rtabmap'/>
            <id>https://www.sorodo.xyz/posts/Ref-utils/rtabmap</id>
            <published>2026-03-11T06:25:23.736Z</published>
            <updated>2026-04-29T01:20:40.884Z</updated>
            <content type='html'><![CDATA[
              <blockquote>该渲染由 Kami API 生成，可能存在排版问题，最佳体验请前往：<a href='https://www.sorodo.xyz/posts/Ref-utils/rtabmap'>https://www.sorodo.xyz/posts/Ref-utils/rtabmap</a></blockquote>
<div><div><h2 id="前言">前言</h2><p>属实是SLAM里面最强大的后端。</p><h3 id="官方前端">官方前端</h3><p>在 rtabmap/corelib/include/rtabmap/core/Odometry.h 中定义了以下14 种前端类型：</p><p>默认可用的是0和1，其余的前端要单独选择编译。</p><pre><code class="lang-txt">0    F2M (Feature-to-Map)    视觉    RTAB-Map 自研的特征点法里程计
1    F2F (Feature-to-Feature)    视觉    RTAB-Map 自研的帧间特征匹配里程计（默认）
2    Fovis    视觉    基于直接法的视觉里程计
3    Viso2    视觉    基于特征的立体视觉里程计
4    DVO    视觉    密集视觉里程计
5    ORB-SLAM2/3    视觉    🌟 完整的 ORB-SLAM 系列
6    Okvis    VIO    紧耦合单目/立体视觉惯性里程计
7    LOAM    激光    经典激光雷达里程计
8    MSCKF    VIO    多状态约束卡尔曼滤波
9    VINS-Fusion    VIO    🌟 紧耦合 VIO+GPS 融合
10    OpenVINS    VIO    🌟 基于 ESKF 的多相机 VIO
11    FLOAM    激光    快速激光里程计
12    Open3D    视觉    Open3D 视觉里程计
13    CuVSLAM    视觉    GPU 加速的视觉 SLAM</code></pre><h3 id="rtabmap占据栅格图">rtabmap占据栅格图</h3><p>参考<a href="https://leiyiming.com/2016/10/27/rtabmap/">https://leiyiming.com/2016/10/27/rtabmap/</a></p><p>对于双目视觉，在ros2环境下，现在只需要设定raytracing即可。</p><h4 id="rtabmap建图参数">rtabmap建图参数</h4><table><thead><tr><th style="text-align:left">参数</th><th style="text-align:center">默认值</th><th style="text-align:left">说明</th></tr></thead><tbody><tr><td style="text-align:left">delete_db_on_start</td><td style="text-align:center">false</td><td style="text-align:left">启动时是否清空之前的建图数据，false为保留</td></tr><tr><td style="text-align:left">Grid/CellSize</td><td style="text-align:center">0.05</td><td style="text-align:left">栅格分辨率（米）</td></tr><tr><td style="text-align:left">Grid/MapFrameProjection</td><td style="text-align:center">false</td><td style="text-align:left">控制点云投影的坐标系：false为base_link坐标系，true为map坐标系</td></tr><tr><td style="text-align:left">Grid/Sensor</td><td style="text-align:center">1</td><td style="text-align:left">1表示从深度图创建栅格，0表示从激光扫描创建栅格</td></tr><tr><td style="text-align:left">Grid/3D</td><td style="text-align:center">true</td><td style="text-align:left">是否生成 3D 占用栅格</td></tr><tr><td style="text-align:left">Grid/MinGroundHeight</td><td style="text-align:center">0.0</td><td style="text-align:left">最小地面高度，低于此高度的点不被视为地面</td></tr><tr><td style="text-align:left">Grid/MaxGroundHeight</td><td style="text-align:center">0.0</td><td style="text-align:left">最大地面高度，高于此高度的点不被视为地面</td></tr><tr><td style="text-align:left">Grid/MaxObstacleHeight</td><td style="text-align:center">0.0</td><td style="text-align:left">最大障碍物高度，高于此高度的点不被视为障碍物</td></tr><tr><td style="text-align:left">Grid/NormalsSegmentation</td><td style="text-align:center">true</td><td style="text-align:left">true：使用基于法线的智能地面分割；false：使用简单的基于高度阈值的分割</td></tr><tr><td style="text-align:left">Grid/MaxGroundAngle</td><td style="text-align:center">45</td><td style="text-align:left">当 NormalsSegmentation=true 时，判断“地面”的法线角度阈值</td></tr></tbody></table><p>地图保存：</p><pre><code class="lang-bash">
ros2 run nav2_map_server map_saver_cli -f ~/SLAM/maps/mymap1 --ros-args -p map_topic:=/rtabmap/map

# or

 ros2 run nav2_map_server map_saver_cli -t /rtabmap/map -f ~/SLAM/maps/mymap1</code></pre><h3 id="深度学习描述子">深度学习描述子</h3><p>superpoint等深度学习描述子需要编译（需要torch），否则会默认找适用的描述子，如GFTT/ORB </p><pre><code class="lang-text">0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 
5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK 8=GFTT/ORB 
9=KAZE 10=ORB-OCTREE 11=SuperPoint 12=SURF/FREAK 
13=GFTT/DAISY 14=SURF/DAISY 15=PyDetector 16=SuperPoint-Rpautrat</code></pre><h3 id="rtabmap-viz">rtabmap viz</h3><p>一键启动，但是功能堆多了很吃cpu，会卡卡的。</p><pre><code class="lang-bash">ros2 run rtabmap_viz rtabmap_viz</code></pre><h3 id="视觉和激光联合部分">视觉和激光联合部分</h3><p>Reg\Strategy=1 是 ICP，Reg\Force3DoF=true 会把约束压成 x, y, yaw，这正适合平面机器人 + 单线雷达。RTAB-Map 参数文档里 Reg/Strategy 的定义就是 0=Vis, 1=Icp, 2=VisIcp，Reg/Force3DoF 会把 z、roll、pitch 置零。</p><p>Grid\Sensor=0 表示 occupancy grid 从 laser scan 生成；Grid\ScanDecimation 是建栅格前对 laser scan 降采样。 Grid\CellSize=0.05 是 5 cm 栅格，CPU 紧张时可以改成 0.08 或 0.10。</p><p>Rtabmap\DetectionRate=1 表示 RTAB-Map 会按 1 Hz 处理输入图像；Mem\ImagePreDecimation 会在视觉特征检测前缩小图像；Kp\MaxFeatures 限制每帧提取特征数；Mem\LaserScanDownsampleStepSize 会在创建签名时降采样激光 scan。</p><p>Icp\Iterations、Icp\MaxCorrespondenceDistance、Icp\MaxTranslation、Icp\MaxRotation、Icp\CorrespondenceRatio 分别控制 ICP 最大迭代、点对应距离、可接受平移/旋转修正和匹配比例；Icp\PointToPlane=false 是因为单线 2D scan 的法向/平面约束不如 3D LiDAR 稳定，保守起步先用 point-to-point。</p><pre><code class="lang-ini">[Core]

; --------------------------
; 处理频率
; --------------------------
Rtabmap\DetectionRate=1
Rtabmap\ImageBufferSize=1
Rtabmap\TimeThr=300
Rtabmap\StatisticLogged=false

; --------------------------
; 内存/特征
; --------------------------
Mem\IncrementalMemory=true
Mem\ImagePreDecimation=2
Mem\LaserScanDownsampleStepSize=2
Kp\MaxFeatures=500

; --------------------------
; 图节点
; --------------------------
RGBD\Enabled=true
RGBD\CreateOccupancyGrid=true
RGBD\LinearUpdate=0.08
RGBD\AngularUpdate=0.08
RGBD\NeighborLinkRefining=true
RGBD\ProximityBySpace=true
RGBD\ProximityByTime=false
RGBD\ProximityPathMaxNeighbors=5
RGBD\LocalBundleOnLoopClosure=false

; --------------------------
; Visual + ICP
; --------------------------
Reg\Strategy=2
Reg\Force3DoF=true
Reg\RepeatOnce=true

; --------------------------
; 视觉约束门限
; --------------------------
Vis\MinInliers=20
Vis\PnPReprojError=3

; 如果是 stereo/RGB-D，通常可用 PnP / 3D约束；
; 如果是纯单目，谨慎尝试 Vis\EstimationType=2，但不要假设它能稳定提供尺度。
; Vis\EstimationType=1

; --------------------------
; ICP
; --------------------------
Icp\Strategy=0
Icp\PointToPlane=false
Icp\Iterations=15
Icp\MaxCorrespondenceDistance=0.10
Icp\CorrespondenceRatio=0.30
Icp\MaxTranslation=0.25
Icp\MaxRotation=0.30
Icp\RangeMin=0.10
Icp\RangeMax=8.0
Icp\VoxelSize=0.03

; --------------------------
; 栅格
; --------------------------
Grid\Sensor=0
Grid\CellSize=0.05
Grid\RangeMin=0.10
Grid\RangeMax=8.0
Grid\ScanDecimation=2
Grid\Scan2dUnknownSpaceFilled=false

Optimizer\Iterations=50</code></pre><p>如果是单目 + IMU + 单线雷达，谨慎地启用 Reg\Strategy=2。单目图像本身没有直接深度，单线雷达也不能给整幅图像特征点补深度，所以这时候 Visual+ICP 不是“视觉特征点和 scan 点直接合并”，而是注册/约束层面的组合。RTAB-Map 的参数里 Reg/Strategy=2 是 VisIcp，但视觉注册是否稳定取决于你的视觉输入形式。</p></div></div>
              <p style='text-align: right'>
              <a href='https://www.sorodo.xyz/posts/Ref-utils/rtabmap#comments'>看完了？说点什么呢</a>
              </p>
            ]]>
            </content>
            </entry>
          <entry>
            <title>黄金瀑布与投资水帘洞</title>
            <link href='https://www.sorodo.xyz/notes/13'/>
            <id>https://www.sorodo.xyz/notes/13</id>
            <published>2026-02-03T17:39:04.165Z</published>
            <updated>null</updated>
            <content type='html'><![CDATA[
              <blockquote>该渲染由 Kami API 生成，可能存在排版问题，最佳体验请前往：<a href='https://www.sorodo.xyz/notes/13'>https://www.sorodo.xyz/notes/13</a></blockquote>
<div><div><h2 id="前言">前言</h2><p>2026年1月30日，大门焊死，从伦敦金跳水到国内连续跌停，红了一个礼拜的大盘终于是被贵金属们扣上了绿帽子。</p><p>由衷感叹，都说贵金属避险，这下贵金属是必定风险了。</p><p>而现在已经来到二月的新一轮周期，外盘继续跌了三天，国内开市的第一天又是迎来大面积的跌停。连续的下跌不知道的还以为爆发什么金融危机了。</p><p>当然，事出反常必有妖，也算是读博有点闲钱投资之后亲自见证了这一轮大事件，属实是给我来了个下马威（虽然在下跌之前就把黄金转移到有色金属，但是有色一样被拖累）。之前天天念叨的财神爷也是当天把整个市场画出了最像他的K线。</p><p><img alt="80c6a4a769d55e2989c2e3ca8bb60658.jpg" src="https://s3.bmp.ovh/2026/02/03/4FGlvgH1.jpg"/></p><p>当然很多人就吐槽是美联储主席任命那一回事。总之也是天天给我推那些神秘营销号的各种奇葩分析，不想看都不行，感觉在污染我正在大学象牙塔里面保护好好的纯真大脑，为了在学死之后可以把自己尸体卖一个好价钱，我决定亲自复盘一下这次历史大事件，过滤一下营销号们的污染杂质。</p><h2 id="复盘——水往高处流，除非见鬼了">复盘——水往高处流，除非见鬼了</h2><p>当然，暴跌之前首先是有涨的。但是投资者都知道期货这玩意大都是缓涨急跌。但好巧不巧的是，在暴跌的前夕出现了急涨——一周涨了30%。真的是，要是存了3年的工资投进去，一个礼拜就能赚一年工资，想想就眼红（一点也不）。对于那些高杠杆的赌狗来说，那断然是不能拒绝这种诱惑了，更何况还是贵金属。</p><img src="https://s3.bmp.ovh/2026/02/04/dKAtBLEB.jpg" alt="喜欢可爱的杠杆大师久留美吗"/><p>我这种表述显然有误，因为出现急涨的前提反而更多是因为高杠杆的投机者入场。不过不论怎么说，当市场出现大量高杠杆之后，作为学过力学的工科生来说，材料结构够不够硬，决定这个杠杆能翘多高咯。</p><p>再往前一步，吸引这些高杠杆的投资者的当然就是黄金的稳定，大幅的上涨。这里能说的点就太多了，不过主要原因还是我们的金毛财神兼职万税爷天天想着刺激他那边消费顺便配合一波关税政策搞得美联储基本走向宽松政策。加上老钟最近的宣传确实也给了点力，大伙是真觉得美元式微了，最典型的就是去年调整利率时候黄金依旧涨——不搭理你了。</p><p>好吧，到这一步，RSI都飙升到90了，做空的人都没得活了，大批散户入场一拥而上，看似是上涨的天下了。有钱能使鬼推磨啊，这种逆天的涨势只会让人愈发恐慌，交易倒是实打实得一直飙升。</p><p>这个时候，久留美的作者因为逆风做空白银已经被平仓收割了（说了高杠杆一堆赌狗）</p><p><img alt="fb6a1c87704ad88872aa27818de6322f_720.png" src="https://s3.bmp.ovh/2026/02/04/QZlfOoFD.png"/></p><h2 id="重现——沃什：怪我咯？">重现——沃什：怪我咯？</h2><p>30号，老特头提名了沃什，这时咱们营销号大哥就会说哎呀，鸽派转鹰派啦，黄金下跌的真正原因来啦~</p><p>然而事实是，提名完之后黄金还涨了好几个小时。可能写稿子的机器人不关心炒股。</p><p>当然找这个原因也并非有误，只可惜要深究好几层。第一层来说，鸽派转鹰派，就是一个明确信号；但是很明显黄金不是在这个消息出来之后应声而落的，所以第一层并不能说服我。稍微自己查一下会知道，沃什早就从鹰变鸽了，不影响美联储降息的大方向；只可惜无法解释迟来的下跌。如果你一路追高黄金在大气层，对比一下就能明白，之前的预期是大鸽傀儡美联储作为急剧上涨的基本盘，而现在换来一个从鹰变鸽的小涨派——市场是基于预期的，时间就是生命。</p><p>那么大涨的根基变为了小涨，材料硬度不够了，该逃顶吗？</p><p>散户不清楚，老投资者肯定先出了一波仓了，关键在于主力军，那么谁是主力军？</p><p>AI。</p><p>想了想还是挺残酷的，但是刚刚好AI就符合这个条件，市场预期动摇，其实就触发斩杀技能了。就算散户的认知里面还在投（当韭菜），但是对于一个黑箱来说，在这种恰好的顶位营造一波收割是最有胜率的大法，什么时候到顶？只需要他们3ms延时的光纤信号转化为他们GPU里面的电势阱里面。也许是一个大户在思考一个小时之后准备出手，也许是当天同时发的COMEX贵金属交割不足的新闻，也可能是快机一步的另一个黑箱率先决策的抛售，短短一分钟之内，一个直角三角形形成了。</p><p>而后续？就轮到散户的恐慌抛售了—— 直到下一个上涨。</p><p><img alt="image.png" src="https://s3.bmp.ovh/2026/02/04/PwdYbSrc.png"/></p><p>根基在此，一轮抛售结束就该抄底了，毕竟黄金不是股票，上涨趋势还在，只是变弱了而不是消失了，冷静的投资者必然会在中间一个恰好的时机加仓杀入，可喜可贺可喜可贺，一轮涨跌结束了，吗？</p><p>虽然是难得一遇的暴跌和迅速回升，但也不至于说载入史册。因为故事才刚刚开始。</p><h2 id="再现——什么叫煽风点火大王啊">再现——什么叫煽风点火大王啊</h2><p>回顾一下暴跌这几天的K线：</p><p><img alt="image.png" src="https://s3.bmp.ovh/2026/02/04/1OXDII0B.png"/></p><p>国内慢9h，这里还显示的29号，那个时候还是懂王提名的时间段，这虽然跌了点，变化幅度很大（对应暴跌之后V型回涨），收盘还不是大跌。那么提名第二天发生了啥大事吗？</p><p>这一查，还真有。<a href="https://news.qq.com/rain/a/20260131A045NR00">腾讯网：历史性崩盘后，CME再上调金银交易保证金</a></p><p>时间点刚刚好掐在国内周五，伦敦金应声下跌，国内收盘时间紧随其后。</p><p>保证金上调先杀了一波高杠杆份子。而周一生效之后更是滚雪球，收割平仓，保证金上调更容易触发平仓，再跌再平仓，高杠杆玩家都哭了。</p><p>对于老投资者还有AI们自然也不蠢。。你猜猜谁跑的快。</p><p>最后轮到散户，看着一个直插地心的绿色棒子，也该恐慌性抛售了。不过这个就有时间差了，细心点看K线全部长得和我训练AI时候的loss曲线似得（急降变缓）</p><p>这一新闻正好对应全部贵金属的下跌。CME年度煽风点火大王，直接促成史上最强暴跌。</p><h2 id="马后炮——你也想成为久留美吗">马后炮——你也想成为久留美吗</h2><p>分析完是真爽，写论文做项目可没有这么好逻辑清晰的又方便的。</p><p>当然，写到这一步也只是自己搜刮点垃圾货在瞎编瞎盘——论文是怎样水成的。不会真有人能发现我写的独自一人碎碎念觉得自己也行了吧。</p><p>很明显前面结论是在这一轮连环爆仓结束之后就可以杀进去了，主线没变，只是被一些外因打了组合拳。但即便如此我也并没有选择加仓，而是攥着老钱继续观望。很多还没提到的消息比如COMEX早在1月27就减仓，而在暴跌之前国内更是多家机构发布了投资预警信号，先对的，国内ETF激增但是还未陷入极端拥挤。市场就是一个巨大的变量，那些在收盘之前看黄金V形回调加仓的人，何尝也不算是分析到位？但是他们算得出来接踵而至的CME保证金上调吗？</p><p>也可能我敲完这段文字，有些和我一样想法且行动力强的已经如狼似虎准备抄底了：</p><p><img alt="d0ead407747adbda898832a78447877c.jpg" src="https://s3.bmp.ovh/2026/02/04/xeD4yWhJ.jpg"/></p><p>不过不论跌涨，我钱其实大头都在短债里面，甚至增持了绿电。。无他，增值稳定，不用盯盘，但是看经济这边的热点笑话还是必不可少的消遣。</p><p>毕竟，科技股和现在贵金属这种打打杀杀的市场可是充斥着狗大户和机器人。真玩脱了就是被资本做局或者是被终结者爆杀了。（真不想研究视觉AI了，明明NLP这一类时序AI更好玩啊kora!）</p><p><img alt="bde126d406afc8813b907c701dea33b6.jpg" src="https://s3.bmp.ovh/2026/02/04/CwGhbFG1.jpg"/></p></div></div>
              <p style='text-align: right'>
              <a href='https://www.sorodo.xyz/notes/13#comments'>看完了？说点什么呢</a>
              </p>
            ]]>
            </content>
            </entry>
          <entry>
            <title>恋文と13歳の女優 阅读记录</title>
            <link href='https://www.sorodo.xyz/notes/12'/>
            <id>https://www.sorodo.xyz/notes/12</id>
            <published>2025-11-07T09:30:03.999Z</published>
            <updated>null</updated>
            <content type='html'><![CDATA[
              <blockquote>该渲染由 Kami API 生成，可能存在排版问题，最佳体验请前往：<a href='https://www.sorodo.xyz/notes/12'>https://www.sorodo.xyz/notes/12</a></blockquote>
<div><div><p>之前朋友给了一个开源的看图软件Mihon，贴一贴：<a href="https://mihon.app/">传送门</a></p><p>机缘巧合下了一个之前想看的漫画。</p><p>首先来点最新两话的组合拳。</p><p><img src="https://s3.bmp.ovh/imgs/2025/11/07/cc706e76892c7dbb.jpg"/></p><p><img src="https://s3.bmp.ovh/imgs/2025/11/07/52a4c1ce6ab22b27.jpg"/></p><p><img src="https://s3.bmp.ovh/imgs/2025/11/07/edb9839dd8ddc0ca.jpg"/></p><p>美味，实在是美味的表情。</p><p>全篇对话和文字寥寥无几，一个眼神，一个刻意的小动作，故意地遮挡，一刀切中人物核心矛盾。</p></div></div>
              <p style='text-align: right'>
              <a href='https://www.sorodo.xyz/notes/12#comments'>看完了？说点什么呢</a>
              </p>
            ]]>
            </content>
            </entry>
          <entry>
            <title>wandb使用手册</title>
            <link href='https://www.sorodo.xyz/posts/Ref-utils/wandb'/>
            <id>https://www.sorodo.xyz/posts/Ref-utils/wandb</id>
            <published>2025-11-05T11:46:51.371Z</published>
            <updated>null</updated>
            <content type='html'><![CDATA[
              <blockquote>该渲染由 Kami API 生成，可能存在排版问题，最佳体验请前往：<a href='https://www.sorodo.xyz/posts/Ref-utils/wandb'>https://www.sorodo.xyz/posts/Ref-utils/wandb</a></blockquote>
<div><div><p>先贴一个<a href="https://blog.csdn.net/shinuone/article/details/138538792">https://blog.csdn.net/shinuone/article/details/138538792</a></p><p>后面再做。</p></div></div>
              <p style='text-align: right'>
              <a href='https://www.sorodo.xyz/posts/Ref-utils/wandb#comments'>看完了？说点什么呢</a>
              </p>
            ]]>
            </content>
            </entry>
          <entry>
            <title>多版本CUDA切换</title>
            <link href='https://www.sorodo.xyz/posts/Ref-utils/switch-cuda'/>
            <id>https://www.sorodo.xyz/posts/Ref-utils/switch-cuda</id>
            <published>2025-11-05T10:01:02.039Z</published>
            <updated>2025-11-05T11:30:17.657Z</updated>
            <content type='html'><![CDATA[
              <blockquote>该渲染由 Kami API 生成，可能存在排版问题，最佳体验请前往：<a href='https://www.sorodo.xyz/posts/Ref-utils/switch-cuda'>https://www.sorodo.xyz/posts/Ref-utils/switch-cuda</a></blockquote>
<div><div><h3 id="cuda的相关名词区分">CUDA的相关名词区分</h3><p>CUDA，引用一下百科里面的说法——</p><p>CUDA（Compute Unified Devices Architectured，统一计算架构）是由英伟达（NVIDIA）所推出的一种软硬件集成技术，是该公司对于GPGPU的正式名称。透过这个技术，用户可利用NVIDIA的GPU进行图像处理之外的运算，亦是首次可以利用GPU作为C-编译器的开发环境。</p><p>对于我们做人工智能的学习来说，主要要区分两个CUDA——一个是显卡的驱动CUDA，一个是在我们做AI开发时候使用的CUDATookit（工具包）。其中对于我们的显卡驱动，我们常用的有两个查看方法</p><pre><code class="lang-bash">nvidia-smi
nvcc -V</code></pre><p>这两个命令查看的CUDA其实是不同的，前者指代的是你的显卡所支持的CUDA最高版本（你也可以查看显卡当前的信息），对于新来的电脑，CUDA通常都会预安装，所以两个指令查看的CUDA版本基本上是相同的。</p><p>对于第二个指令，则是当前path（系统变量）里面指向的CUDA版本。</p><p>当然，在绝大部分AI开发和学习的任务来说，不用特地指定CUDA的版本；基本上选择安装越高的越好。然而对于部分比较“远古”的深度学习网络且做了比较深度的CUDA开发和优化来说，过高的CUDA驱动是不适合的（比如干自驾常用的spconv的一些较老的版本复现起来都是在11.2以下）。而对于不同的显卡，有时候也不得不出现CUDA需要自降身价的情况。而不同的学习任务需要不同的CUDA工具包，有时候对于系统的CUDA是兼容的，有时候不得不也得来做一个适配。</p><p>关于CUDATookit，百科的定义如下：CUDA 开发包（CUDA Toolkit ）只能将自家的CUDA C-语言（对OpenCL只有链接的功能），也就是执行于GPU的部分编译成PTX中间语言或是特定NVIDIA GPU架构的机器代码（NVIDIA 官方称为 &quot;device code&quot;）；而执行于中央处理器部分的C / C++代码（NVIDIA 官方称为 &quot;host code&quot;）仍依赖于外部的编译器。</p><p>这一块是我们可以使用指令来直接安装的。也封装在我们的conda 环境库里面。通常在下载pytorch的过程中就直接安装好了。</p><h3 id="cuda驱动的安装">CUDA驱动的安装</h3><p>针对CUDA驱动的安装，一般建议是通过官网的run文件安装。</p><p>直接贴点别人的blog。</p><p><a href="https://zhuanlan.zhihu.com/p/691711768">https://zhuanlan.zhihu.com/p/691711768</a></p><h3 id="cuda的转换函数">CUDA的转换函数</h3><p>为了方便管理多个不同的科研代码，这里介绍一种用命令行随时切换的trick</p><p>但是注意适用前提是安装路径都是默认的位置。</p><p>打开~/.bashrc</p><pre><code class="lang-bash">vim ~/.bashrc</code></pre><p>然后在结尾写入如下代码</p><pre><code class="lang-bash"># 这里的cuda-12.2代表每次开机时候的默认CUDA驱动环境
export PATH=/usr/local/cuda-12.2/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-12.2/lib64:$LD_LIBRARY_PATH
# 这里增加一个不同项目运行时候的CUDA转换
# &gt;&gt;&gt; CUDA &gt;&gt;&gt;
# CUDA 版本切换函数
function switch_cuda() {
   version=$1
   export PATH=/usr/local/cuda-$version/bin:$PATH
   export LD_LIBRARY_PATH=/usr/local/cuda-$version/lib64:$LD_LIBRARY_PATH
   echo &quot;Switched to CUDA $version&quot;
}
# &lt;&lt;&lt; CUDA end &lt;&lt;&lt;</code></pre><p>最后开机默认是12.2的CUDA，如果需要切换系统CUDA的版本路径（如11.3），则命令行输入：</p><pre><code class="lang-bash">switch_cuda 11.3</code></pre></div></div>
              <p style='text-align: right'>
              <a href='https://www.sorodo.xyz/posts/Ref-utils/switch-cuda#comments'>看完了？说点什么呢</a>
              </p>
            ]]>
            </content>
            </entry>
          <entry>
            <title>论文简记：Fog Simulation on Real LiDAR Point Clouds for 3D Object Detection in Adverse Weather</title>
            <link href='https://www.sorodo.xyz/posts/paper_ref/fgo-simu-real'/>
            <id>https://www.sorodo.xyz/posts/paper_ref/fgo-simu-real</id>
            <published>2025-06-30T11:49:19.342Z</published>
            <updated>2026-04-09T05:38:01.501Z</updated>
            <content type='html'><![CDATA[
              <blockquote>该渲染由 Kami API 生成，可能存在排版问题，最佳体验请前往：<a href='https://www.sorodo.xyz/posts/paper_ref/fgo-simu-real'>https://www.sorodo.xyz/posts/paper_ref/fgo-simu-real</a></blockquote>
<div><div><h3 id="前言">前言</h3><p>关于雾天场景激光雷达仿真的工作。</p><p>传送门：<a href="https://github.com/MartinHahner/LiDAR_fog_sim">【Github】</a></p><h3 id="相关工作">相关工作</h3><h3 id="方法论">方法论</h3><h5 id="传输模型">传输模型</h5><p>论文第 3.1 节中，LiDAR 接收信号 $ P_R(R) $ 表达为系统脉冲 $ P_T(t) $ 与环境脉冲响应 $ H(R) $ 的卷积：</p><p><img src="https://s3.bmp.ovh/imgs/2025/07/11/d90bc94ad3bd2b71.png"/></p><ul><li>$ C_A $ ：系统常数</li><li>$ P_T(t) $ ：发射脉冲形状，使用 sin² 近似</li><li>$ H(R) = H_C(R) H_T(R) $  分解为光学通道和目标响应</li></ul><h5 id="光学通道响应-$h_c(r)$">光学通道响应 $H_C(R)$</h5><p>通过公式 (4)-(7) 定义：</p><p><img src="https://s3.bmp.ovh/imgs/2025/07/11/9301c956ccc241ef.png"/></p><ul><li>$ T^2 $：往返路径的双重衰减作用</li><li>$ \xi(R) $：光束照明面积与接收面积的比值，随着距离线性过度至 1</li></ul><h5 id="硬目标响应-$h_t^\text{hard}$">硬目标响应 $H_T^\text{hard}$</h5><p>论文里面的硬目标指代传统固体目标在雾中的反射。</p><p>定义为 Dirac 函数（公式 9）：</p><p><img src="https://s3.bmp.ovh/imgs/2025/07/11/c526580d466cf411.png"/></p><p>带入晴朗天气条件下，总响应为（公式 12）：</p><p><img src="https://s3.bmp.ovh/imgs/2025/07/11/ab84f32b0e241dfb.png"/></p><p>相当于一个聚焦在 $ R = R_0 + \frac{c\tau_H}{2} $ 的脉冲峰值 </p><h5 id="雾中软响应：backscatter（软目标）">雾中软响应：Backscatter（软目标）</h5><p>在雾中，除了物体反射，还会出现雾粒子对激光的后向散射。目标响应变为包含软目标（也是主要的噪声来源）：</p><ul><li>使用积分近似，源码中通过 Simpson 方法数值积分（见 <code>SIMPSON(I(R,R0,α,τH))</code>）</li><li>得到每个距离位置 $ R $ 处的软衰减强度 $ I(R,R_0,α,τ_H) $</li></ul><p>代码中保留最大处为主回波：</p><pre><code class="lang-python">IR = SIMPSON(...)
itmp = max(IR), Rtmp = argmax(IR)
isoft = CAP0 * β * itmp</code></pre><p>表示距离 $ R_tmp $ 上某种形式的背景散射噪声最强。</p><h5 id="核心总结——硬目标与软目标">核心总结——硬目标与软目标</h5><p>源码中对比两个信号：</p><ul><li><strong>硬信号</strong>：$ i_{\text{hard}} = i \cdot e^{-2αR_0} $</li><li><strong>软信号</strong>：$ i_{\text{soft}} = C_A P_0 · β · itmp $</li></ul><p>当 $ i<em>{\text{soft}} $ &gt; $ i</em>{\text{hard}} $ 时，就用软信号替换该点，并随机扰动其$ x,y,z $ 位置，模拟雾中的噪点。否则，仅修改强度，不动坐标。</p><h4 id="物理意义">物理意义</h4><table><thead><tr><th>模块</th><th>作用</th><th>数学/代码实现</th></tr></thead><tbody><tr><td>光束衰减</td><td>硬目标信号指数减弱</td><td>$ e^{-2αR_0} $，<code>i_hard</code></td></tr><tr><td>背向散射</td><td>雾中引入软信号峰</td><td>数值积分 + 最大值 <code>itmp</code>, <code>i_soft</code></td></tr><tr><td>点替换机制</td><td>当雾噪超越反射信号时引入散射点</td><td>比较软/硬信号，引入位置扰动</td></tr></tbody></table><p><code>theory.py</code> 精确落地了论文中第 3.2 节“Algorithm 1”：</p><p><img src="https://s3.bmp.ovh/imgs/2025/07/29/b79c918fc47cc8ee.png"/></p><p>首先是公式参数对应表：</p><table><thead><tr><th>参数</th><th>含义</th><th>单位</th><th>物理意义</th></tr></thead><tbody><tr><td>$ p $</td><td>点的位置（3D坐标）</td><td>米</td><td>激光点原始位置</td></tr><tr><td>$ i $</td><td>原始强度</td><td>任意单位</td><td>无雾条件下点的回波强度</td></tr><tr><td>$ \alpha $</td><td>消光系数（extinction coefficient）</td><td>$ \text{m}^{-1} $</td><td>控制衰减程度，来源于能见度</td></tr><tr><td>$ \beta $</td><td>体积散射系数（volume backscatter）</td><td>$ \text{m}^{-1} $</td><td>控制雾中粒子产生的后向散射强度</td></tr><tr><td>$ \beta_0 $</td><td>物体的反射强度（硬目标反射）</td><td>任意单位</td><td>固定反射系数，模拟固体表面对激光的反射能力</td></tr><tr><td>$ \tau_H $</td><td>系统脉冲宽度</td><td>秒</td><td>模拟激光脉冲在时间上的持续宽度，影响时间卷积平滑效果</td></tr></tbody></table><hr/><p>算法一详细描述：</p><p><code>R0 ← ||p||</code></p><p>计算从 LiDAR 到目标点的距离：</p><ul><li>即光往返一半距离（单位：米）</li><li>作为主变量参与后续所有衰减与散射计算</li></ul><p><code>x, y, z ← p</code></p><p>记录原始点的三维坐标，为后续可能的扰动做准备。</p><p><code>CAP0 ← i × R0² / β₀</code></p><p>公式 (12) 的推导：</p><p>$
i = \frac{C_A P_0 \beta_0}{R_0^2} \Rightarrow CAP0 = C_A P_0 = \frac{i \cdot R_0^2}{\beta_0}
$</p><p> <strong>物理含义</strong>：估算无雾下系统发射功率与接收系数组合的常数项。</p><p> <code>i_hard ← i × exp(−2αR0)</code></p><p>公式 (17)：</p><p>$
i_{\text{hard}} = i \cdot T^2(R_0) = i \cdot e^{-2 \alpha R_0}
$</p><ul><li>激光往返路径均受雾的衰减，乘上 2 倍</li><li>表示在雾中仍可到达的反射强度</li></ul><p> <code>for R in (0, 0.1, …, R0) do</code></p><p>以 10cm 为间隔，从起点到目标点积分每一处雾粒子的后向散射贡献。</p><p><code>IR ← SIMPSON(I(R, R0, α, τH))</code></p><ul><li>使用数值积分（Simpson 法）计算软目标贡献；</li><li>函数 $I(R, R_0, \alpha, \tau_H)$ 为第 (18) 式：</li></ul><p>$
I(R, R_0, \alpha, \tau_H) = \text{background backscatter intensity at range } R
$</p><p> <code>i_tmp ← max(IR)</code></p><p>从所有位置 $ R $ 的后向散射中找出最大值（雾中最强背景光位置）。</p><p><code>R_tmp ← argmax(IR)</code></p><p>记录上述最大背景信号出现的位置。</p><p> <code>i_soft ← CAP0 × β × i_tmp</code></p><p>公式 (18)：</p><p>$
i_{\text{soft}} = C_A P_0 \beta \cdot \max I(R, ...)
$</p><ul><li>表示雾背景下的软目标强度</li><li>会与硬目标强度进行对比，决定是否保留点</li></ul><p> <code>if i_soft &gt; i_hard then</code></p><p>判断是否“雾遮蔽”现象发生：</p><ul><li>如果背景散射比目标反射更强，该点无法被探测</li><li><p>此时应将该点改为“雾噪声点”</p><p><code>s ← R_tmp / R0</code></p></li></ul><p>比例因子，表示噪声点距离与原始目标点的比例。</p><p> <code>r ← RANDOM_UNIFORM_FLOAT(−1,1)</code></p><p>加入 [-1, 1] 的随机扰动，模拟在不同方向雾粒子的偏移。</p><p> <code>n ← 2^p</code></p><p>设定噪声幅度 $\epsilon \in (\frac{1}{2}, 2)$，用于扰动幅度。</p><p> <code>x ← s × x + n × r</code>（同理 y, z）</p><p>将点的位置扰动，生成非结构化散点云：</p><ul><li>$s \cdot x$：距离缩放</li><li>$n \cdot r$：方向随机偏移，模拟雾噪声分布</li></ul><p><code>i ← i_soft</code></p><p>更新该点的强度为背景信号强度。</p><p> <code>else i ← i_hard</code></p><p>若硬反射信号更强，则保留原始坐标，仅更新强度为衰减后的值。</p><p><code>return x, y, z, i</code></p><p>输出新的点云数据（已仿真雾影响）</p><hr/><h2 id="✅-总结：核心机制一览表">✅ 总结：核心机制一览表</h2><table><thead><tr><th>模块</th><th>机制</th><th>数学表达</th><th>效果</th></tr></thead><tbody><tr><td>硬目标衰减</td><td>指数下降</td><td>$ e^{-2\alpha R} $</td><td>远处点强度变低</td></tr><tr><td>雾散射积分</td><td>数值积分</td><td>$ \int I(R) dR $</td><td>模拟背景雾帘</td></tr><tr><td>点丢弃逻辑</td><td>强度对比</td><td>$ i<em>{\text{soft}} $ &gt; $ i</em>{\text{hard}} $</td><td>远点更可能丢失</td></tr><tr><td>噪声扰动</td><td>随机方向加偏移</td><td>$ n \cdot r $</td><td>模拟雾中虚假点出现</td></tr><tr><td>输出</td><td>点的坐标和强度变化</td><td>-</td><td>仿真雾下点云效果</td></tr></tbody></table><hr/><ol start="1"><li>对单个光束：计算衰减后的硬目标强度</li><li>积分估计雾中散射峰值位置</li><li>比较后决定是否替换为“软目标”（雾噪点）</li><li>对坐标加入随机扰动，视觉上呈圆弧噪声云</li></ol><p>上述过程直观地复现了雾中 LiDAR 点云特征：<strong>远处点弱化、雾中噪声点散布、点位置轻微偏移</strong>，与真实雾中点云高度吻合。</p><hr/><h4 id="激光反射衰减">激光反射衰减</h4><p>衰减会降低接收的信号功率，该信号功率与应测量的视线中的实体对象范围相对应，而反向散射则在不正确范围内的接收信号功率中产生一个虚假的峰。</p><p>结果是每当捕获场景出现雾气时，获得的激光雷达点云将包含一些虚假的回波信号。</p><h3 id="附录">附录</h3><p>激光雷达Lidar底层原理技术详解：<a href="https://www.eet-china.com/mp/a205857.html">https://www.eet-china.com/mp/a205857.html</a></p></div></div>
              <p style='text-align: right'>
              <a href='https://www.sorodo.xyz/posts/paper_ref/fgo-simu-real#comments'>看完了？说点什么呢</a>
              </p>
            ]]>
            </content>
            </entry>
          <entry>
            <title>清明霓虹行</title>
            <link href='https://www.sorodo.xyz/notes/11'/>
            <id>https://www.sorodo.xyz/notes/11</id>
            <published>2025-06-29T10:16:23.510Z</published>
            <updated>null</updated>
            <content type='html'><![CDATA[
              <blockquote>该渲染由 Kami API 生成，可能存在排版问题，最佳体验请前往：<a href='https://www.sorodo.xyz/notes/11'>https://www.sorodo.xyz/notes/11</a></blockquote>
<div><div><h3 id="前言">前言</h3><p>这一切的根源可能要从一个白色矮子开始，再从一个不情之请萌芽。但是终归是一个难忘的旅途。</p><h3 id="旅程的起点站，跨洋的前奏诗">旅程的起点站，跨洋的前奏诗</h3><p>午间，前往最上海的武汉地点——汉口火车站。</p><p>当然，主要说的是物价，其次才是旧租界风格。不得已吃了个天价牛肉粉，然后拍拍肚子启程。</p><p>风景一路向后飞奔而去，我也算得以抛弃当时不想参与的实习项目，把不喜欢的事情先甩在脑后。而离职后我在回顾中再写下这段文字，只觉得当时甚至应该更加珍惜出游的这段时间，直到如今，我依然会把那段满是奇葩的实习定义为我的枷锁而非平台。不过当时其神人程度还未开始展开。但可以肯定的是，当感觉到远离武汉之后，我只觉得一身轻松。</p><p>落地上海，汐美学院参上~，邦邦嘎邦——获得战利品，Clover Days的绘马——话说这边还有F批（什么）</p><p><img src="https://s3.bmp.ovh/imgs/2025/05/21/3237c28b9676d77f.jpg"/></p><p>在一旁的则是葱，而且刚刚我才吃完烩面加了不少葱（无端）</p><p><img src="https://s3.bmp.ovh/imgs/2025/06/01/3b24aaf043f5f29e.jpg"/></p><p>随后前往机场，虽说比较早，毕竟飞机不像高铁那样方便，提早登机总是有必要的。不过实际上是在机场半睡半醒了几个小时。</p><p>半只脚刚到机场，周围基本上就逐渐是国外面孔了。接近转钟，而飞机则要两点多才出发，此时的机场万籁俱寂，外面昏黄的灯光稀稀疏疏地映着机场跑道，但是候机厅内的灯光依旧保留了一半，我并不喜欢太明亮的灯照在候机座位旁边，因为十分影响我睡觉。</p><p>走了一圈蹭到一个充电位才坐下，然后依旧是扶手横栏设计，防止乘客横躺占位，当然也影响睡觉。</p><p>半睡半醒躺了大半天，最后发现飞机又延误了。</p><p>第一次飞行倒是出国，也是感慨国内高铁发展太快了，从没让我考虑过航班。飞机起飞时候强大的推背感让人十分舒适——果然人总是喜欢加速度的，无论是在游乐场还是公路。</p><p>依旧是半睡半醒，不时望着窗外机翼闪烁的导航灯。引擎的轰鸣声伴随着跨洋的夜空稀稀拉拉地催我入睡。然而来不及真的被睡魔打败，天空便开始微微泛蓝，在光电白蹲了四年的我第一反应就是瑞利散射——太阳即将要冒出地平线的前兆，此时看了看一旁呼呼大睡的码头，思索了一下打搅美梦不是什么文明的行为，遂怼着廉航的破碎玻璃窗照了几张。</p><p>阳光配上海岸线，可惜我的语文功底难以描绘。借用雾霭相随的话来说，蔚蓝色的天空，是任何颜料都难以描绘的。更何况是一个超高空的视角。</p><p><img src="https://s3.bmp.ovh/imgs/2025/06/29/57609f31d44a5ddd.jpg"/></p><p><img src="https://s3.bmp.ovh/imgs/2025/06/29/43c84f80a9bca53f.jpg"/></p><p>落地，开始被爱国手机制裁，虽然插了流量卡依旧被繁琐的外网连接给上debuff。直到走到大巴上，周围文字和语言都不一样的时候，才感慨一下，真的出国了。</p><h3 id="浅草才能没马蹄">浅草才能没马蹄</h3><p>asakusa。</p><h3 id="天狼星的心脏">天狼星的心脏</h3><h3 id="花水电车">花水电车</h3><h3 id="夜樱街道">夜樱街道</h3><h3 id="steins-gate">steins gate</h3><h3 id="轮回">轮回</h3></div></div>
              <p style='text-align: right'>
              <a href='https://www.sorodo.xyz/notes/11#comments'>看完了？说点什么呢</a>
              </p>
            ]]>
            </content>
            </entry>
          
    </feed>