这一节的两个例子,一个在「看懂」,一个在「动手」。 前者难在数据量大,后者难在时间紧。 有意思的是,两边最后都落到同一件事上:把「算得准」换成「来得及时」。
14.2 讲的是传感器每秒吐数据,这一节讲两个更极端的场景。 脑扫描是「一次就几十 MB」,机器人是「三十四毫秒必须动」。 10.3 讲图像识别,这一节的三维重建、目标检测用的是同一套思路, 只是数据从二维图片变成了体素和点云。
一、一次脑扫描有多大
功能核磁的每个体素是三毫米见方的一小块,全脑五万个:
| 项目 | 数量 |
|---|---|
| 体素边长 | 3 毫米 |
| 全脑体素个数 | 50000 |
| 时间点 | 200 |
| 单次扫描 | 40.0 MB |
| 一千个人 | 40.0 GB |
| 五万体素乘两百个时间点,是四千万个数,四千万字节正好 40 MB; | |
| 再乘一千个人,正好 40 GB。两个 40 不是笔误。 | |
| 而且这是一个人的「一次」扫描。纵向研究还要乘上次数。 | |
| 脑科学的存储压力,就是这么被三个乘数堆出来的。 |
二、功能连接:一起动的算一伙
五万个体素两两算相关,是十二亿对——算不完也用不上。 常规做法是先划成感兴趣区,这里取 200 个,算 200 乘 200 的相关矩阵。
| 项目 | 数量 |
|---|---|
| 两两组合 | 19900 对 |
| 相关矩阵里最大的相关 | 0.788 |
| 网内平均相关 | 0.496 |
| 网间平均相关 | -0.033 |
| 网内 0.496、网间 -0.033,差得很干净—— | |
| 这就是「功能连接」的全部依据:一起动的,多半是一伙的。 | |
| 注意这只是相关,不是因果。 | |
| 两块脑区同时亮,可能是第三块在指挥它们;也可能是同一个刺激分别激活了它们。 | |
| 从相关到因果,中间还差一整个实验设计。 |
三、逆运动学:每一组解都要挑
两根连杆各长一米,给手的目标位置,反推肩、肘两个关节角:
| 目标点 | 解一 | 解二 | 回代误差 |
|---|---|---|---|
| (1.2, 0.6) | -21.3 度 / 95.7 度 | 74.4 度 / -95.7 度 | 2.48e-16 |
| (0.0, 1.5) | 48.6 度 / 82.8 度 | 131.4 度 / -82.8 度 | 1.11e-16 |
| (1.9, 0.0) | -18.2 度 / 36.4 度 | 18.2 度 / -36.4 度 | 0.00e+00 |
| 回代误差都在 1e-16 量级,说明解是对的——代回正解公式,手正好落在目标点上。 | |||
| 注意每个点都有两组解:肘向上或者肘向下。 | |||
| 挑哪个不是数学问题,是看会不会撞到桌子。 | |||
| 数学给的是「所有可能」,工程要的是「其中一个能用的」。 | |||
| 还有一件数学管不了的事:够不着。 | |||
| 目标 (2.5, 0) 超出两连杆全长 2.0,算出的余弦 2.125 大于 1,无解。 | |||
| 真实控制器一定要先判可达性,否则 acos 直接报错。 |
四、延迟会变成距离
一条「机械臂接住滚来的球」的控制回路,各环节的典型耗时:
| 环节 | 耗时 |
|---|---|
| 相机曝光与读出 | 8.0 毫秒 |
| 图像传输 | 3.0 毫秒 |
| 目标检测推理 | 12.0 毫秒 |
| 轨迹规划 | 4.0 毫秒 |
| 下发指令 | 1.0 毫秒 |
| 伺服响应 | 6.0 毫秒 |
| 合计 | 34.0 毫秒 |
| 球以每秒 2 米滚过来,34 毫秒里它走了 7 厘米。 | |
| 这个距离必须提前补偿——不能瞄准「现在看到的位置」,要瞄准「到时它会在的位置」。 | |
| 所以机器人控制里,预测和目标检测一样重要,甚至更重要。 | |
| 检测告诉你「它在哪」,预测告诉你「该往哪抓」。 | |
| 这两个例子的共同点在这儿: | |
| 脑功能分析是「数据太多,得先降维」;机器人是「时间太少,得先预测」。 | |
| 一个砍数据,一个补时间,都是为了让结果来得及用上。 |
五、动手 Demo:一边看脑,一边动手
四段:一次扫描的体量、功能连接矩阵、逆运动学的两组解、控制回路的延迟。 脑数据是造出来的,相关矩阵是真算的;机器人那两段是真的解方程、真的代回去验算。 没有接任何脑机接口,也没有真机械臂。
def fk(t1, t2, L1=1.0, L2=1.0): # 正解:给关节角,算手在哪
x = L1 * np.cos(t1) + L2 * np.cos(t1 + t2)
y = L1 * np.sin(t1) + L2 * np.sin(t1 + t2)
return x, y
def ik(x, y, L1=1.0, L2=1.0): # 逆解:给手的位置,反推关节角
c2 = (x * x + y * y - L1 ** 2 - L2 ** 2) / (2 * L1 * L2)
if abs(c2) > 1:
return None # 够不着,先判可达性再算
t2 = [np.arccos(c2), -np.arccos(c2)] # 肘上、肘下两组解
return t2
实跑输出:
--------------------------------------------------------------------
一边看脑,一边动手
--------------------------------------------------------------------
==============================================================
[1] 一次脑扫描有多大
项目 数量
体素边长 3 毫米
全脑体素个数 50000
时间点 200
单次扫描 40.0 MB
一千个人 40.0 GB
**每个体素就是一个小方块里的平均活动,三毫米见方。**
**脑子小,可架不住要几百个时间点、几千个人,一凑就是几十 GB。**
**而且这是一个人的「一次」扫描,纵向研究还要乘上次数。**
**两个 40 不是笔误:四千万字节正好 40 MB,乘一千正好 40 GB。**
[2] 功能连接:哪些区域一起动
五万个体素两两算相关,是十二亿对——算不完也用不上。
常规做法是先划成感兴趣区(ROI),这里取 200 个,算 200 乘 200 的相关矩阵。
项目 数量
两两组合 19900 对
相关矩阵里最大的相关 0.788
相关最高的五对(区号从 0 开始):
区号 相关系数 是不是同一组
1 与 5 0.788 是
9 与 53 0.775 是
25 与 50 0.775 是
1 与 30 0.772 是
43 与 52 0.770 是
**网内平均相关 0.496,网间平均相关 -0.033。**
**差得很干净——这就是「功能连接」的全部依据:一起动的,多半是一伙的。**
**注意这只是相关,不是因果。两块脑区同时亮,可能是第三块在指挥它们。**
[3] 机器人:知道手要伸到哪,反推关节怎么转
两根连杆各长 1 米,肩关节角 θ1、肘关节角 θ2,手的位置是:
x = L1·cosθ1 + L2·cos(θ1+θ2)
y = L1·sinθ1 + L2·sin(θ1+θ2)
目标点 解一 解二 回代误差
(1.2, 0.6) θ1=-21.3° θ2=95.7° θ1=74.4° θ2=-95.7° 2.48e-16
(0.0, 1.5) θ1=48.6° θ2=82.8° θ1=131.4° θ2=-82.8° 1.11e-16
(1.9, 0.0) θ1=-18.2° θ2=36.4° θ1=18.2° θ2=-36.4° 0.00e+00
**回代误差都在 1e-16 量级,说明解是对的。**
**注意每个点都有两组解:肘向上或者肘向下。机器人得挑一个——**
**挑哪个不是数学问题,是要看会不会撞到桌子。**
还有一件数学管不了的事:**够不着**。
目标 (2.5, 0) 两连杆全长 2.0,算出的余弦 2.125 大于 1,无解
**超出范围时 acos 会报错,所以真实控制器一定要先判可达性。**
[4] 从看到到动手,中间有多少延迟
一条「机械臂接住滚来的球」的控制回路,各环节的典型耗时:
环节 耗时
相机曝光与读出 8.0 毫秒
图像传输 3.0 毫秒
目标检测推理 12.0 毫秒
轨迹规划 4.0 毫秒
下发指令 1.0 毫秒
伺服响应 6.0 毫秒
合计 34.0 毫秒
球以每秒 2 米滚过来,34 毫秒里它走了 7 厘米。
**这个距离必须提前补偿——不能瞄准「现在看到的位置」,要瞄准「到时它会在的位置」。**
**所以机器人控制里,预测和目标检测一样重要,甚至更重要。**
四段连起来:**脑数据大在「体素乘时间乘人数」**;
**功能连接靠「一起动」找网络,但相关不等于因果**;
**逆运动学一般有两组解,挑哪组要看环境,还要先判够不够得着**;
**而控制回路的每一毫秒,都会变成球多跑的那几厘米。**
第 1 段那两个 40 容易让人以为是写错。 四千万字节正好 40 MB,乘一千正好 40 GB——量级就是这么来的。 第 2 段网内 0.496 和网间 -0.033 的对比,是这一节最漂亮的一个数。 它说明「一起动」这件事在数据上真的看得出来,不是靠人眼挑的。 第 3 段「回代误差 2.48e-16」这句是验算,不是装饰。 解完必须代回正解公式,否则符号错了也看不出来。 第 4 段那个 7 厘米,把「毫秒」翻译成了「距离」。 所有实时系统的设计讨论,最后都要做这个翻译。
30 秒实验
- 把第 1 段的时间点从 200 改成 1000,重跑。 单次扫描变成 200 MB、一千人变成 200 GB—— 采样率一提高,存储马上从「能存」变成「要挑着存」。
- 把第 2 段的 ROI 从 200 个改成 50 个,重跑。 对数从 19900 掉到 1225——降维的收益是平方级的,这也是划 ROI 这一步省时间的真正原因。
- 把第 4 段的球速从每秒 2 米改成每秒 5 米,重跑。 34 毫秒里它走 17 厘米——速度翻一倍多,补偿距离跟着翻一倍多,预测误差的容忍度立刻收紧。
常见误区
- 以为「相关就是因果」。两块脑区一起动,可能有第三个源头。 功能连接只说明「同时活跃」,不说明谁指挥谁。
- 以为「逆运动学只有一个解」。两连杆就有两组,连杆多了解更多。 工程上要按「离当前姿态最近」「不碰障碍」这些条件去挑。
- 以为「算得快就够了」。控制回路里,相机、传输、推理、伺服各占一段, 推理再快,也压不掉那 85 毫秒之外的路程——要动的是整条链路。
- 以为「毫秒级的延迟可以忽略」。每秒 2 米的球,34 毫秒就是 7 厘米。 对精密装配来说,7 厘米是致命误差。
自测三问(点开对答案)
1. 为什么脑数据要先划 ROI? —— 因为**五万体素两两算相关是十二亿对,算不完也用不上**。 **划成 200 个区之后只剩 19900 对,而且每一对都有解剖学含义。** **这是拿「空间分辨率」换「算得动、说得清」。** 2. 为什么逆运动学会有两组解? —— 因为**同一个手的位置,肘可以朝上也可以朝下**。 **Demo 三个目标点都解出两组,回代误差都在 1e-16 量级,两组都对。** **挑哪一组要靠环境约束,数学不管这个。** 3. 34 毫秒为什么必须补偿? —— 因为**这段时间里目标已经动了**。**球每秒 2 米,34 毫秒走 7 厘米。** **不补偿就等于永远瞄准「过去的位置」,误差和速度成正比。**数据、算力、算法都讲完了,最后一节换个问题:新东西到底从哪来。 答案不在某一台机器里,而在「已有的东西怎么重新组合」。 这一节也是全书的收尾。
- ☐ (本节完,下一节 14.4 创新系统)