<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>运动学 on imcuer 的矩阵</title><link>https://www.imcuer.com/tags/%E8%BF%90%E5%8A%A8%E5%AD%A6/</link><description>Recent content in 运动学 on imcuer 的矩阵</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Mon, 19 Oct 2026 06:40:00 +0800</lastBuildDate><atom:link href="https://www.imcuer.com/tags/%E8%BF%90%E5%8A%A8%E5%AD%A6/index.xml" rel="self" type="application/rss+xml"/><item><title>机器人手记：给硅基生命造一具躯体</title><link>https://www.imcuer.com/p/robotics-notes/</link><pubDate>Mon, 19 Oct 2026 06:40:00 +0800</pubDate><guid>https://www.imcuer.com/p/robotics-notes/</guid><description>&lt;h2 id="为什么机器人比纯软件难一个数量级"&gt;为什么机器人比纯软件难一个数量级&#10;&lt;/h2&gt;&lt;p&gt;写软件时，世界是&lt;strong&gt;离散的、确定的、可回滚的&lt;/strong&gt;——&lt;code&gt;git reset --hard&lt;/code&gt; 能解决大部分人生难题。&lt;/p&gt;&#10;&lt;p&gt;机器人不一样：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;电机有惯性，地面有摩擦，传感器有噪声&lt;/li&gt;&#10;&lt;li&gt;没有 Ctrl+Z。机械臂撞到人，就是撞到了&lt;/li&gt;&#10;&lt;li&gt;宇宙不会抛出异常，它直接抛出你的机器人&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;物理世界是最严格的代码审查员。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="运动学机器人的几何直觉"&gt;运动学：机器人的&amp;quot;几何直觉&amp;quot;&#10;&lt;/h2&gt;&lt;p&gt;正运动学（FK）：已知各关节角度，求末端在哪里。&lt;/p&gt;&#10;$$\mathbf{x} = f(\boldsymbol{\theta}), \quad \boldsymbol{\theta} = [\theta_1, \theta_2, \dots, \theta_n]^T$$&lt;p&gt;逆运动学（IK）才是硬菜：已知想让末端去 $\mathbf{x}$，反求各关节该转多少。&lt;/p&gt;&#10;$$\boldsymbol{\theta} = f^{-1}(\mathbf{x})$$&lt;p&gt;问题在于 $f^{-1}$ 通常没有解析解，甚至&lt;strong&gt;有无穷多解&lt;/strong&gt;——你的手可以伸到同一个杯子，肘部却可以摆出完全不同的姿势。机器人得自己&amp;quot;决定&amp;quot;怎么动，这里面全是优化问题。&lt;/p&gt;&#10;&lt;h2 id="一个两轮小车的速度分解"&gt;一个两轮小车的速度分解&#10;&lt;/h2&gt;&lt;p&gt;差速驱动是入门第一课。左轮 $v_l$、右轮 $v_r$、轮距 $L$：&lt;/p&gt;&#10;$$v = \frac{v_r + v_l}{2}, \qquad \omega = \frac{v_r - v_l}{L}$$&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;math&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;diff_drive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v_l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v_r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;一步航位推算：由轮速更新位姿&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v_r&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;v_l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v_r&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;v_l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;theta&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;theta&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;看着简单？等轮胎打滑、编码器丢脉冲、地面有个 2° 的斜坡，你就明白为什么机器人博士要读五年。&lt;/p&gt;&#10;&lt;h2 id="ros2机器人的神经系统"&gt;ROS2：机器人的神经系统&#10;&lt;/h2&gt;&lt;p&gt;把机器人拆成节点（Node），节点之间用话题（Topic）发消息：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[摄像头节点] --/image_raw--&amp;gt; [视觉节点] --/cmd_vel--&amp;gt; [底盘节点] --&amp;gt; 电机&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;ROS2 相比 ROS1 的杀手锏是 &lt;strong&gt;DDS 通信&lt;/strong&gt;——去中心化的发布订阅，天生为分布式实时系统而生。之前 ROS1 那个 &lt;code&gt;roscore&lt;/code&gt; 单点故障，终于进了历史垃圾堆。&lt;/p&gt;&#10;&lt;h2 id="物理彩蛋倒立摆"&gt;物理彩蛋：倒立摆&#10;&lt;/h2&gt;&lt;p&gt;机器人学的&amp;quot;Hello World&amp;quot;不是走路，是&lt;strong&gt;倒立摆&lt;/strong&gt;——一根杆子立在移动小车上不许倒。&lt;/p&gt;&#10;&lt;p&gt;它是不稳定平衡点问题：$\theta = 0$ 处势能最高，任何微扰都会发散，必须持续反馈控制。这和人生一样——&lt;strong&gt;所谓稳定，不过是持续的主动纠偏&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;h2 id="折腾清单"&gt;折腾清单&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 攒一台差速底盘，跑通 SLAM（gmapping → Cartographer）&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 给机械臂写 IK 求解器，先数值解再解析解&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 倒立摆实物：电位器测角度 + PID 调参地狱&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 终极目标：把 LLM 接上机器人，让它听懂&amp;quot;帮我把桌上的可乐拿过来&amp;quot;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item></channel></rss>