编程语言研究书库

附录 — 零件采购的约束思维与命令速查

附录 — 零件采购的约束思维与命令速查

这一章讲什么: 两个附录的拆解。附录 A(零件采购) 教的不是买什么, 是「型号会死、约束长存」的采购思维;附录 B(命令速查) 把全书散落的 pyinfra / mosquitto / systemctl 命令收拢成一张工作台上的随手查。

1. 先看现象:清单会过时,约束不过时

附录 A 一开篇就立了规矩,这句话值得当采购哲学背下来:

「爱好者零件市场变化又快又猛。这项技能的关键是适应不同的零件…… 同一芯片的不同 breakout(载板),代码不用改,孔可能要重新钻。 型号号货架寿命有限,所以每个零件我都给出约束条件,帮你找替代品。」1

书里还补了两条使用纪律:换供应商前先查原厂型号在你的渠道里是不是换了编号; 同一芯片 + 同一接口才算「直接等价」,换了就得改接线和代码2。

2. 附录 A 的清单结构:型号 + 约束

照原书,零件表按「部件 | 产品 | 型号 | 数量」四列给出,关键零件与约束接住3:

部件书中选型硬约束(找替代品的尺子)
底盘SparkFun Shadow Chassis(ROB-13301)2 轮 + 万向轮;能放下 Pi 和摄像头;长 ≤ 210 mm、宽 ≤ 200 mm;支持带编码器的电机安装
电机DFRobot FIT0450(带编码器)5 V 供电;直流;带正交编码器;注意安装方式;计数/齿比不同要改代码
轮子65 mm 橡胶胎直径 65–80 mm;轮毂要咬合电机花键;轮径要写进代码
电池Anker Nano/321 充电宝5 V 输出 ≥ 3 A;可充电;装得上底盘;最好带电量显示
主控Raspberry Pi 4B兼容电源;多路 I²C;兼容主扩展板;装得上;有摄像头接口;跑 Linux + Python;有 Wi-Fi
主扩展板Pimoroni Inventor HAT Mini(PIM672)2 路直流电机输出;编码器输入(4 针);两路 I²C 可及;至少 2 路舵机;至少 1 路 RGB LED;不挡摄像头接口
距离传感器Pimoroni VL53L5CX breakout(PIM622)光学阵列;I²C;地址不冲突;有 Python 库;能装到前脸
IMUAdafruit BNO055(ADA4646)I²C 可接;输出欧拉角;有架上底盘的固定方式
摄像头Pi Camera Module 3 Wide兼容 Pi;彩色帧;尺寸配得上云台
云台Adafruit 迷你云台(ADA1967,预装)两个 5 V 舵机;连线 ≥ 190 mm;尺寸匹配底盘
耳麦带 USB 接收器的无线耳麦不是蓝牙型(Pi 上蓝牙耳麦难搞);带麦克风; headset 与接收器成对收好

约束条款里最见功力的是主扩展板那六条——它们不是产品参数,是第 2、6、8、10、14 章 全部代码的前置条件,缺一条就要回头改代码。买替代品时拿这张表对,而不是拿型号对3。

配套的还有工具清单(剥线钳、尖嘴钳、手捻钻 + M2.5/M2 钻头、精密螺丝刀、 迷你扳手、剪线钳、数显卡尺、胶带、铅笔——「可以换你手头的牌子,但别太大」) 和测试场材料(A1 泡沫板 ×4、美工刀、记号笔、宽胶带、金属直尺)4。

3. 附录 B 的命令速查:三个工作台技巧

附录 B 主体是两张表:电脑上跑的 pyinfra 命令(同步代码、更新包、装基础包、 全量重建、停服务、看 dmesg、关机、跟日志、重启、跑指定 Python 文件……), 和 SSH 到 Pi 上跑的命令(poweroff、reboot、停服务、mosquitto_sub 监听、 mosquitto_pub 发消息、systemctl 全家)5。比表更值得带走的是三招:

① 命令串联(chaining)。 用 ; 和 && 把「部署 + 时间戳 + 盯日志」焊成一行:

pyinfra inventory.py deploy/update_code.py -y; date && \
pyinfra inventory.py exec -- journalctl -u line_follower -u line_detector -f

改代码 → Ctrl+C → 重跑这一行 = 同步 + 知道几点发的 + 继续看两个服务的日志。 「调循线代码时的标准动作」,书里原话6。

② 输出太多?落盘或分流。 2>&1 > 文件 把 pyinfra 的远端输出存进文件; | 接 tee 则终端和文件两边都给(像 T 形接头)——注意 tee 出去的内容没有颜色7。

③ mqttui 偷看总线。 在 VS Code 的终端窗格里常开:

mqttui -b mqtt://learnrob3.local -u robot --password robot

机器人的全部 MQTT 流量一览无余——调任何行为的「总线级 X 光」, 第 8 章以来越调越复杂的系统,就靠它一眼定位「消息发没发、谁没收到」8。 顺带一提:Pi 上可以用 Ctrl+R 反查历史命令,不用重打长串 mosquitto 命令9。

4. 作者的判断与证据

  • 判断: 型号是快照,约束是资产——所以清单以约束条款的形式写,型号只是示例; 「找替代品」被提升为行业技能,不是救急手段12。
  • 判断: 工具「别太大」——迷你工具不是精致主义,是小零件面前的物理必然 (第 8 章剥细线、第 10 章上铜柱螺母全靠它们)4。
  • 事实层: 全部型号、约束数字(210/200 mm、65–80 mm、3 A、190 mm)与 命令语法,可对照厂商页面复核35。

5. 边界与局限

  • 价格与供货完全没写。 清单管「买对」,不管「买贵」;成本只给过区间 (第 2 章「底盘套件 15 美元到几千美元」)。
  • 型号是 2025–2026 年的快照。 书自己说了货架寿命有限;约束条款才是耐用的部分。
  • 命令速查假定 pyinfra 环境已就绪。 环境搭建在正文第 4 章,附录不重复。

6. 可带走的

  1. 采购三原则:市场快变 → 型号会死;同芯片同接口才算等价;约束条款比型号长寿12。
  2. 主扩展板的六条硬约束 = 全书代码的前置条件,换板先对表3。
  3. 工具迷你化是物理要求,不是审美4。
  4. 调参标准动作:部署 + date + journalctl -f 焊成一行,Ctrl+C 重跑6。
  5. 输出分流:2>&1 > 文件 存盘,| tee 文件 两边看7。
  6. mqttui 常驻一个窗格,当机器人的总线 X 光8;Pi 上 Ctrl+R 反查历史命令9。

补遗:逐件替代的核查顺序

买替代零件时,附录 A 的约束条款按「换它的代价」排序核查最省事:

  1. 主扩展板(代价最大):六条硬约束对不上就要改代码——先核它。 2 路电机、4 针编码器、2 路 I²C 可及、2 路舵机、RGB LED、不挡摄像头口10。
  2. 电机与编码器(次大):5 V、直流、正交编码器;齿比或计数不同, counts_per_rev(32 * 120) 那行要跟着改。
  3. 传感器(最小):同芯片同接口即等价——VL53L5CX 换载板代码不动, 可能只是安装孔不同。
  4. 结构件(零代码):底盘尺寸、轮径 65–80 mm、云台线长 ≥190 mm, 只对得上物理。

供货渠道分层:原厂(Pimoroni/Adafruit/SparkFun 等)有分销商列表; 本地分销商更快更省运费;同一订单尽量在一家买齐,省多笔运费11。 耳麦注意:必须带 USB 接收器的无线款,蓝牙款在 Pi 上「能让人抓狂」; headset 和接收器成对收放,别混12。

7. 原文地图

主题原书位置
采购哲学(市场快变/约束条款)text/164-apx-a-appendix-a.txt:13(搜「change frequently and rapidly」)
等价与替代纪律text/164-apx-a-appendix-a.txt:168(搜「same chip and interface」)
零件约束表text/164-apx-a-appendix-a.txt:160(搜「Part constraints」)
工具与测试场材料text/165-fm-robot-tool-list.txt:22(搜「mini wire stripper」) · text/166-fm-test-area-materials.txt:7(搜「Foam board」)
命令串联text/168-fm-chaining-commands.txt:7(搜「chaining commands」)
输出落盘与 teetext/168-fm-chaining-commands.txt:33(搜「2>&1」)
mqttuitext/168-fm-chaining-commands.txt:39(搜「mqttui」)
SSH 命令表text/169-fm-commands-run-via-ssh-on-raspberry-pi.txt:24(搜「mosquitto_sub」)

Footnotes

  1. 出处:「Appendix A」重要说明(text/164-apx-a-appendix-a.txt:13,搜「change frequently and rapidly」)。原文:爱好者零件市场变化又快又猛;适应不同零件是关键技能;会用库存零件改装也是好技能;同一芯片换载板代码不改、孔可能要重钻;型号货架寿命有限,故给出约束条件帮助找替代。 ↩ ↩2 ↩3

  2. 出处:「Appendix A」(text/164-apx-a-appendix-a.txt:168,搜「same chip and interface」)。原文:先查原厂型号在供应商处是否另有编号;找不到了按约束条件谨慎替代;要原样跟书,用原配或「同芯片同接口」的直接等价品;换零件需改接线与代码。 ↩ ↩2 ↩3

  3. 出处:「Appendix A」零件约束(text/164-apx-a-appendix-a.txt:160,搜「Part constraints」)。原文约束例:底盘 2 轮 + 万向轮、≤210×200 mm;电机 5 V 直流带正交编码器;轮径 65–80 mm;电池 5 V ≥3 A;主控多 I²C、摄像头口、Linux+Python、Wi-Fi;主扩展板 2 直流电机 + 4 编码器针 + 2 I²C + 2 舵机 + RGB LED + 不挡摄像头;IMU 输出欧拉角;云台双 5 V 舵机、线 ≥190 mm。 ↩ ↩2 ↩3 ↩4

  4. 出处:「Robot tool list」(text/165-fm-robot-tool-list.txt:22,搜「mini wire stripper」)与「Test area materials」(text/166-fm-test-area-materials.txt:7,搜「Foam board」)。原文:工具九件(迷你剥线钳 PA-06、尖嘴钳、手捻钻、25 合一螺丝刀、迷你扳手 TS-04/05、剪线钳、数显卡尺、胶带、铅笔)——可换牌但别太大;测试场材料:A1 泡沫板 ×4、美工刀、记号笔、宽胶带、金属直尺。 ↩ ↩2 ↩3

  5. 出处:「Appendix B」(text/167-apx-b-appendix-b.txt:28,搜「Desktop command list」)。原文:桌面命令表——update_code(同步)、update_packages、base_packages、deploy_all、deploy_services、停指定服务、dmesg -H、poweroff、journalctl -u X -f、reboot、robotpython 直跑文件。 ↩ ↩2

  6. 出处:「Chaining commands」(text/168-fm-chaining-commands.txt:7,搜「chaining commands」)。原文:pyinfra … -y; date && pyinfra … journalctl -u line_follower -u line_detector -f——同步、打印时间、接着跟两个服务日志;调循线代码时好用;Ctrl+C 后重跑即可。注:适用 Bash,不适用于 PowerShell。 ↩ ↩2

  7. 出处:「Chaining commands」(text/168-fm-chaining-commands.txt:33,搜「2>&1」)。原文:输出太多时 2>&1 > filename 落盘;| tee 文件名 终端与文件同时输出(tee 接头);此场景终端颜色失效。 ↩ ↩2

  8. 出处:「mqttui」(text/168-fm-chaining-commands.txt:39,搜「mqttui」)。原文:mqttui 跑在桌面/笔记本,VS Code 窗格常开;命令行 mqttui -b mqtt://learnrob3.local -u robot --password robot;换你的主机名。 ↩ ↩2

  9. 出处:「Appendix B」开头(text/167-apx-b-appendix-b.txt:6,搜「Ctrl + R」)。原文:本速查供查阅用;Pi 上可用 Ctrl+R 调出近期命令历史。 ↩ ↩2

  10. 出处:「Part constraints」(text/164-apx-a-appendix-a.txt:160,搜「Part constraints」)。原文:主扩展板须支持 2 直流电机、编码器输入 4 针、2 I²C 可及、≥2 舵机、≥1 RGB LED、不挡摄像头口。 ↩

  11. 出处:「Appendix A」(text/164-apx-a-appendix-a.txt:144,搜「distributors」))。原文:各原厂有分销商页;本地分销商通常更便宜更快;同一分销买齐省运费。 ↩

  12. 出处:「Robot tool list」(text/165-fm-robot-tool-list.txt:12,搜「Bluetooth」)。原文:耳麦要 USB 接收器款,不要蓝牙/BLE 款(Pi 上难搞);带麦克风;headset 与接收器成对收好。 ↩

On this page