<?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-05-15T22:52:55.181Z</updated>
      <id>https://www.sorodo.xyz</id>
      <author>
        <name>sorodo猫娘</name>
      </author>
      <generator>Mix Space CMS</generator>
      <lastBuildDate>2026-05-15T22:52:55.181Z</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>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>
          <entry>
            <title>经典阅读：BEVFusion</title>
            <link href='https://www.sorodo.xyz/posts/paper_ref/bevfusion'/>
            <id>https://www.sorodo.xyz/posts/paper_ref/bevfusion</id>
            <published>2025-06-13T06:30:20.782Z</published>
            <updated>2025-06-14T03:17:25.188Z</updated>
            <content type='html'><![CDATA[
              <blockquote>该渲染由 Kami API 生成，可能存在排版问题，最佳体验请前往：<a href='https://www.sorodo.xyz/posts/paper_ref/bevfusion'>https://www.sorodo.xyz/posts/paper_ref/bevfusion</a></blockquote>
<div><div><h3 id="前言">前言</h3><p>项目地址：<a href="https://github.com/ADLab-AutoDrive/BEVFusion.git">【1】BEVFusion: A Simple and Robust LiDAR-Camera Fusion Framework. NeurIPS 2022 | 北大&amp;阿里提出</a></p><p>项目地址：<a href="https://github.com/mit-han-lab/bevfusion.git">【2】BEVFusion: Multi-Task Multi-Sensor Fusion with Unified Bird’s-Eye View Representation ICRA 2023 | MIT提出</a></p><h2 id="bevfusion:-a-simple-and-robust-lidar-camera-fusion-framework">BEVFusion: A Simple and Robust LiDAR-Camera Fusion Framework</h2><p>参考：<a href="https://zhuanlan.zhihu.com/p/672102996">【多传感器融合】BEVFusion: 激光雷达和视觉融合框架 </a></p><h3 id="背景相关">背景相关</h3><p>当前在工业界普遍使用的是后融合，因为这种方案比较灵活，鲁棒性也更好，不同模态的输出的结果通过人工设计的算法和规则进行整合，不同模态在不同情况下会有不同的使用优先级，因此能够更好的处理单一传感器失效时对系统的影响。</p><p>但是后融合缺点也很多：</p><ul><li><p>一是信息的利用不是很充分。</p></li><li><p>二是把系统链路变得更加复杂，链路越长，越容易出问题。</p></li><li><p>三是当规则越堆叠越多之后维护代价会很高。</p><p>学术界目前比较推崇的是前融合方案，能够更好的利用神经网络端到端的特性。</p></li></ul><p>但是前融合的方案少有能够直接上车的，原因作者认为是目前的前融合方案鲁棒性达不到实际要求, 尤其是当雷达信号出现问题时，目前的前融合方案几乎都无法处理。</p><p>前融合当前问题：</p><p>作者对比了激光雷达相机融合方法的不同框架，分析之前框架的问题。</p><p>a）<strong>点级融合机制</strong>，将图像特征投影到原始点云上；或点云投影到图像；然后进行特征提取。将点云根据外参和相机内参投影到图，然后进行特征提取；或图像投影点云上，后面就可以通过常用的点云3D检测算法进行处理。</p><p>b）<strong>特征级融合机制</strong>，在每个视图的图像特征上投影点云特征；或每个视图的图像点上投影 点云特征。先对雷达点云进行特征提取，然后将特征或者初始预测值按照外参和相机内参，将图像带你投影到点云中。或先图像提取的2D特征，然后将图像特征投影到点云特征中，再接上对应的任务头，目前MVXNet, TransFusion、DeepFusion属于这种类型的工作。</p><p>这两种方案有以下问题：（我归类为数据匹配干扰+噪声问题）</p><p>校准问题：汽车在行驶过程中可能会遇到不平坦的路面或其他震动，这些都可能导致激光雷达和相机的外部参数发生变化（例如，它们相对于车辆的位置和方向）。这种变化会使得原本准确的点云和图像之间的对应关系出现偏差，进而影响融合数据的准确性。</p><p>相机噪声：多种因素可能导致相机噪声，例如镜头上的污渍、水珠或雾气会阻挡视线，降低图像质量。此外，技术故障如卡帧或摄像机完全损坏也会影响图像数据的完整性和可用性。</p><p>激光雷达噪声：激光雷达在某些情况下可能无法有效探测某些物体。例如，对于某些材料或颜色（如深色车辆），激光雷达的反射率可能非常低，导致返回的点云数据不完整。此外，由于设计或安装限制，某些激光雷达的视场（FOV）可能无法覆盖360度全景，这在特定车型中更为常见，可能导致数据盲区。</p><p>其中DeepFusion通过点云坐标去Query图像特性 ，一定程度兼容“校准问题”和“相机噪声问题”</p><p>c) 作者提出了一种新颖而简单的框架，将摄像头网络与激光雷达输入分开的框架。一分支提取点云特征预测3D信息，另一分支也会提取图像特征预测3D信息，再将两者特征投射到统一的BEV空间，在这个空间上进行融合。</p><p>在这种方法中，激光雷达和视觉没有了主次依赖关系，提供了类似于后期融合的灵活性。</p><h3 id="方法论">方法论</h3><p>框架：</p><p><img src="https://s3.bmp.ovh/imgs/2025/06/13/318edd5751cc7323.png"/></p><h4 id="视觉分支">视觉分支</h4><p>相关论文：<a href="https://arxiv.org/abs/2008.05711">Lift, Splat, Shoot: Encoding Images From Arbitrary Camera Rigs by Implicitly Unprojecting to 3D</a></p><p>解析：<a href="https://zhuanlan.zhihu.com/p/589146284">LSS (Lift, Splat, Shoot) 论文+源码万字长文解析</a></p><p>基于Lift-Splat-Shoot实现——一种用于自动驾驶感知的算法，由NVIDIA提出。它通过将多视角相机图像转换为3D空间中的特征表示来实现从2D图像到BEV（Bird&#x27;s Eye View，鸟瞰图）的转换。具体来说，Lift-Splat-Shoot算法包含三个关键步骤：</p><p>Lift：提升，即从每个相机的2D图像中提取特征，并为每个特征点估计深度，然后通过相机内参将这些特征点映射到3D空间中，形成一个3D特征点云。这个过程中，每个像素点会映射到3D空间中的多个点，每个点携带特征向量，这些点构成了一个截锥体形状的图像特征点云。</p><p>Splat：拍扁，即将所有相机的3D特征点云通过相机外参转换到自车坐标系，并忽略高度信息，自上而下投影到BEV坐标系下，形成BEV特征图。如果多个点投影到同一个BEV栅格，这些点的特征向量会被累加起来，形成该栅格的特征向量。</p><p>Shoot：射入，是指在BEV特征图上进行运动规划，通过将模板轨迹投影到网络输出的BEV cost map中，实现可解释的端到端运动规划。</p><p>Lift-Splat-Shoot算法在目标分割、地图分割等任务上取得了优于基线方法和之前工作的结果，因为它能够有效融合多视角相机信息，并生成统一的BEV表示，适用于自动驾驶中的感知和规划任务。</p></div></div>
              <p style='text-align: right'>
              <a href='https://www.sorodo.xyz/posts/paper_ref/bevfusion#comments'>看完了？说点什么呢</a>
              </p>
            ]]>
            </content>
            </entry>
          
    </feed>