手里有一块树莓派,想让几个舵机听指挥——这几乎是每个做硬件控制的人都会走的第一段路。听起来简单:三根线,一根电源、一根地、一根信号,给个PWM就能转。可真正上手之后你会发现,事情没这么顺:舵机一抖一抖地抽、树莓派接上舵机就自动重启、明明代码写的是90度结果它硬是往一边转到底、换个树莓派5之后原来的代码直接报错跑不起来。这些都不是玄学,每一项背后都有明确的物理原因和工程原因。
这篇内容面向的是手上有树莓派(4B、5、Zero 2 W、Pico 都算)、想控制舵机完成一个具体动作的人。不管你是做机械臂、云台、仿生手臂这类树莓派项目,还是单纯想搞明白舵机 PWM 控制原理,我都会把这套东西从"为什么"讲到"怎么做",包括实测出来的角度换算系数、供电方案取舍、树莓派5 上必须换掉的软件栈,以及几个只有踩过才知道的坑。代码部分给出的是可以直接粘贴运行的最小可复现版本,硬件部分给的是我自己反复验证过的接线和电源配置。
1. 从"舵机为什么能听话"说起:开环控制与PWM的底层逻辑
很多人第一次接舵机时是懵的:为什么给它一根信号线,它就知道该转到哪个角度?这根线上跑的到底是什么?搞不清楚这一层,后面所有调试都只能靠瞎试。
1.1 三线舵机内部到底装了什么
拆开一个 SG90 你会看到四样东西:直流有刷电机、一组塑料齿轮(减速比通常在一百多到两百多之间)、一块极小的控制板,以及一个和输出轴联动的电位器。
关键在于那个电位器。它本质上是个可变电阻,输出轴转多少度,它就给出对应的分压值。控制板做的事非常朴素:把信号线上的脉宽读出来,换算成"目标角度",同时读电位器的电压,换算成"当前角度",两者一比较,差值驱动电机正转或者反转,差值归零就停。这就是一个纯模拟的闭环位置伺服,只不过闭环是在舵机内部完成的,对外表现成一个"开环器件"。
理解这一点很重要,因为它解释了一个常见误会:舵机并不是"你让它转多少度它就转多少度",而是"它拼命把电位器读数拉到目标值"。齿轮打滑、电位器磨损、机械限位卡死,都会让这三个环节对不上号,于是出现"代码写 90 度、实际停在 75 度"这类现象。
1.2 20ms周期与0.5~2.5ms脉宽:角度到底怎么换算
舵机的控制信号是标准 50Hz 的 PWM,也就是周期 20ms。在这个周期内,高电平持续的时间决定角度:
| 高电平脉宽 | 对应角度(标准180度舵机) | 常见偏差 |
|---|---|---|
| 0.5ms | 0 度 | 部分舵机实际 0.6ms 才到底 |
| 1.0ms | 45 度 | - |
| 1.5ms | 90 度(中位) | 大部分舵机这里最准 |
| 2.0ms | 135 度 | - |
| 2.5ms | 180 度 | 廉价舵机常常只能到 2.4ms |
换算成占空比,也就是 2.5% 到 12.5%。这个数字记住很有用,因为所有库最终都是在往这个区间里填数。
真正的问题是:上面这张表是"教科书范围",而实际拿到手的舵机个体差异不小。我在同一批买的五个 SG90 上测过,最保守的一个 0.6ms 到底、2.35ms 到顶,也就是有效行程只有 175 度左右,而且中位在 1.48ms。所以后面第 4 节我会专门讲怎么逐台校准——这是把动作做准的唯一办法,没有捷径。
1.3 开环控制的边界:为什么舵机不知道自己转到了哪
对外部控制器来说,舵机是开环的:你发指令,但你不读位置。这不是设计缺陷,而是成本和场景决定的。航模、小车转向、云台俯仰这些场景,不需要知道绝对角度,只需要"到位就行"。
但这带来三个必须接受的现实。第一,没有到位反馈,你无法确认它真的转了,只能靠时间等待——通常按 60 度/秒的速度估算,给足 0.3 到 0.5 秒的缓冲。第二,扭矩不足时它会在负载下"欠转",你以为它到位了其实差一截。第三,掉电后位置信息全部丢失,重新上电时会朝中位冲——这就是第 2.4 节要展开的复位电流问题。
如果你确实需要位置反馈,那就该考虑总线舵机(如飞特那类带串口反馈的),或者自己在输出轴上装一个编码器/电位器做二次检测。这个取舍在第 5 节会详细对比。
2. 硬件选型与接线:先把电的问题解决干净
我见过太多人代码写得漂亮得不行,结果卡在硬件上折腾一星期。舵机项目里,电的问题占故障总数的七成以上,剩下三成里又有一半是接线接错。
2.1 SG90、MG90S、MG996R、总线舵机的实际差异
选型先看三个参数:扭矩、电压、齿轮材质。
| 型号 | 工作电压 | 堵转扭矩 | 齿轮 | 空载电流 | 堵转电流 | 适用场景 |
|---|---|---|---|---|---|---|
| SG90 | 4.8-6V | 约 1.8 kg·cm | 塑料 | 100-200mA | 约 700mA | 微型云台、小关节 |
| MG90S | 4.8-6V | 约 2.2 kg·cm | 金属 | 100-200mA | 约 800mA | SG90 的加强版,推荐 |
| MG996R | 4.8-7.2V | 约 11 kg·cm | 金属 | 100-200mA | 2.0-3.0A | 机械臂大臂、重载 |
| 总线舵机 | 6-12V | 10-30 kg·cm | 金属 | 待机几十mA | 视型号 | 多关节机械臂 |
这里有个反直觉的点:MG996R 的堵转电流能到 2.5A 甚至更高,而树莓派 4B 推荐电源是 5V 3A、树莓派 5 是 5V 5A。也就是说,只要有一个 MG996R 堵转,你整台树莓派的供电预算就被吃掉了大半,重启是必然的。
还有一个热词里经常出现的型号:MG996R 360 度版本。它不是位置舵机,而是连续旋转舵机——信号脉宽控制的是转速和方向,1.5ms 停转,小于 1.5ms 朝一个方向转、大于 1.5ms 朝另一个方向转。如果你拿着 360 度版本按角度公式去控制,表现就是"不管怎么调都往一边转"。这是第 6 节里的一个典型故障。
2.2 供电方案对比:USB口、DC-DC降压、独立电源
结论放前面:永远不要用树莓派的 5V 引脚给大扭矩舵机供电。它本来就是从 USB 输入直通的,没有任何余量。
我在几个方案上都实测过:
- 树莓派 5V 引脚直供:只适合 1 到 2 个 SG90 且负载很轻的情况。MG996R 绝对不行。表现是树莓派随机重启、板载电压掉到 4.6V 以下。
- 独立 5V 开关电源:比如 5V 5A 的工业开关电源,成本几十块,带三四个 MG996R 毫无压力。这是最省心的方案,缺点是体积大、要插 220V。
- 2S 锂电池 + DC-DC 降压模块:7.4V 锂电经降压模块调到 6V,便携、电流余量大。要注意选降压模块时看额定电流,标称 5A 的实际连续电流往往只有 3A 左右,要留一倍余量。另外电压别设到 7V 以上,SG90 那类 4.8-6V 的舵机会烧。
- USB 充电宝供电:应急可以,但很多充电宝有低电流自动断电保护,舵机静态电流小,会被判成"充满"而自动关断。这个坑挺隐蔽。
2.3 共地:一根线决定成败
不管你用哪种电源方案,舵机电源的 GND 必须和树莓派的 GND 连在一起。这不是可选项。
原因很直接:PWM 信号是相对于信号源的地来定义的。如果两个系统地不同,信号线上的电平在舵机那一侧就没有明确的高低基准,表现是舵机乱转、不动,或者收到信号但方向错乱。
共地还有一个副作用要注意:如果走线很长,地线上的压降会让信号高电平"抬高",同样会造成误触发。我的做法是三根线尽量绞在一起走,电源线用比信号线粗一号的线规,长距离时在舵机端并一个 100nF 到 470uF 的电容做退耦。
2.4 复位电流与上电浪涌
热词里"复位电流"这个词出现频率很高,很多人被它坑过。
现象是:上电瞬间树莓派直接重启,或者舵机猛地一抽然后全部回到中位。原因有两层。一是舵机内部控制板的上电瞬间会有电容充电的浪涌电流;二是上电后所有舵机同时朝中位(或上电前设定位置)运动,多个舵机的启动电流叠加。
三个应对手段,按性价比排序:
- 给舵机电源端并一个大容量电解电容,2200uF 起步,正负极别接反。它能把浪涌吸收掉,成本最低。
- 分段上电:先给树莓派上电,稳定几秒后再给舵机电源上电。用一路带开关的独立电源,或者加一个 MOS 管软启动电路。
- 上电时先发中位指令再逐个唤醒:代码里先把所有 PWM 输出设成中位脉宽,再让舵机电源接通。如果你的驱动板支持通道使能(PCA9685 就有),可以逐个通道使能,把浪涌摊开。
3. 树莓派4B与树莓派5的软件栈差异:老教程不能照抄
这是我最近收到最多的问题:照着两年前的教程写import RPi.GPIO,在树莓派 4B 上跑得好好的,换到树莓派 5 直接报This module can only be run on a Raspberry Pi。不是你没装好,是底层变了。
3.1 RPi.GPIO 在树莓派5上为什么失效
树莓派 4B 及更早的型号,GPIO 是由 SoC 的 GPIO 控制器直接管理的,RPi.GPIO通过/dev/mem直接映射寄存器来操作。树莓派 5 换了新的 I/O 控制器(RP1),寄存器布局和访问路径都变了,老的直接映射方式行不通。RPi.GPIO这个库本身也已经很久没有实质性维护,所以官方推荐迁移到lgpio或者gpiozero。
顺带说一句,pigpio在树莓派 5 上同样有问题,因为它也依赖对硬件外设的直接访问。如果你原来的项目重度依赖 pigpio 的高精度定时,迁移时要重新评估。
3.2 gpiozero / lgpio / pigpio 怎么选
| 库 | 树莓派5 支持 | 抽象层级 | PWM 精度 | 适合谁 |
|---|---|---|---|---|
| RPi.GPIO | 不支持 | 低 | 软件 PWM,抖动大 | 老项目维护,新项目别用 |
| gpiozero | 支持(lgpio 后端) | 高 | 中等 | 快速上手、教学、简单动作 |
| lgpio | 支持 | 低 | 中等 | 需要自己控制时序 |
| pigpio | 有兼容问题 | 低 | 高(DMA 定时) | 老项目,Pi5 上慎用 |
| adafruit-circuitpython-servokit | 支持 | 高 | 由 PCA9685 决定 | 多路舵机、机械臂 |
我的建议是:单路或两三路舵机、动作不复杂,用gpiozero,代码最短;四路以上或者要做机械臂,直接上 PCA9685 驱动板配servokit,把 PWM 生成的活儿交给专用芯片,树莓派只管发 I2C 指令,稳定性和精度都不是一个量级。
3.3 环境搭建与依赖安装
先把系统时间对准,不然 apt 会因为证书问题报错:
sudo apt update sudo apt full-upgrade -y树莓派 5(Bookworm 系统)上安装舵机相关依赖:
sudo apt install -y python3-lgpio python3-gpiozero python3-pip pip3 install --break-system-packages adafruit-circuitpython-servokit注意 Bookworm 开始,pip 默认不允许往系统环境装包,要么加--break-system-packages,要么老老实实建虚拟环境:
python3 -m venv --system-site-packages ~/servo-env source ~/servo-env/bin/activate pip install adafruit-circuitpython-servokit--system-site-packages这个参数别漏,它让虚拟环境能访问系统里的lgpio,否则 gpiozero 找不到后端。
启用 I2C(用 PCA9685 才需要):
sudo raspi-config # Interface Options -> I2C -> Enable sudo i2cdetect -y 1i2cdetect输出里出现40就说明 PCA9685 被识别到了。默认地址是 0x40,如果同时挂多个板子,需要改板上的地址焊盘。
3.4 三段能直接跑的最小代码
先说 gpiozero 版本,树莓派 4B 和 5 都能跑,这是我最推荐的入门写法:
from gpiozero import Servo from gpiozero.pins.lgpio import LGPIOFactory from gpiozero import Device import time Device.pin_factory = LGPIOFactory() # 这两个脉宽范围一定要按自己舵机实测调整 servo = Servo(18, min_pulse_width=0.5 / 1000, max_pulse_width=2.5 / 1000, frame_width=0.02) servo.value = 0 # 约 90 度 time.sleep(1) servo.value = -1 # 最小端 time.sleep(1) servo.value = 1 # 最大端 time.sleep(1) servo.detach() # 断电释放,消除嗡嗡声servo.value的取值范围是 -1 到 1,映射到 min_pulse_width 和 max_pulse_width 两个端点。detach()这一步很关键,舵机到位后不断开信号会持续微调,发出持续的嗡嗡声,长期下来发烫。
如果你还在树莓派 4B 上,用 RPi.GPIO 的写法是这样:
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setup(18, GPIO.OUT) pwm = GPIO.PWM(18, 50) # 50Hz pwm.start(0) def angle_to_duty(angle): # 0度 -> 2.5%,180度 -> 12.5% return 2.5 + angle / 180.0 * 10.0 pwm.ChangeDutyCycle(angle_to_duty(90)) time.sleep(0.5) pwm.ChangeDutyCycle(0) # 停止脉冲,避免持续嗡嗡声 pwm.stop() GPIO.cleanup()多路舵机走 PCA9685:
from adafruit_servokit import ServoKit import time kit = ServoKit(channels=16) for ch in range(4): kit.servo[ch].set_pulse_width_range(500, 2500) kit.servo[0].angle = 45 kit.servo[1].angle = 90 kit.servo[2].angle = 135 kit.servo[3].angle = 0 time.sleep(1)PCA9685 的频率默认是 50Hz,正好匹配舵机。set_pulse_width_range这一步最好每路都设一遍,把校准值写进去。
4. 角度映射与平滑运动:把抽搐变成顺滑
代码能跑起来只是及格线。真正的差距在动作质量上——同样是从 0 度转到 90 度,有人做出来是"啪"一下甩过去,有人做出来是平滑加速减速,像有生命一样。后者靠的是两件事:角度校准和速度曲线。
4.1 占空比公式与逐台校准
标准公式我已经给过了,但真的要做得准,得逐个舵机测。方法很土但有效:
先写一个小脚本,把脉宽从 400us 开始,每次加 25us,直到舵机刚好开始动,记下这个值,这就是实际最小脉宽;再从 2600us 往下减,找到刚好停住的最大值。然后在这两个值之间取中点,就是真实中位。
拿到这三个数之后,你的映射函数就变成了:
import math class ServoCal: def __init__(self, min_us, mid_us, max_us): self.min_us = min_us self.mid_us = mid_us self.max_us = max_us def angle_to_us(self, angle): angle = max(0.0, min(180.0, angle)) if angle <= 90: return self.min_us + (self.mid_us - self.min_us) * angle / 90.0 return self.mid_us + (self.max_us - self.mid_us) * (angle - 90) / 90.0 cal = ServoCal(580, 1480, 2380) print(cal.angle_to_us(0), cal.angle_to_us(90), cal.angle_to_us(180))分段线性比整体线性准得多,因为舵机在中位附近的灵敏度和两端不一样。这套校准数据建议写进配置文件,换舵机时只需要改三个数。
4.2 抖动来源逐项排查
抖动是问得最多的问题。它有三个独立来源,得一个个排:
电源抖动。用示波器看舵机电源,如果舵机运动瞬间电压掉超过 0.3V,就是电源功率不够。加大电源或者并电容。
PWM 信号抖动。软件 PWM 的定时精度受操作系统调度影响,树莓派在跑其他进程时会产生几十微秒的抖动。表现是舵机发出轻微的、无规律的"嗞嗞"声。解决办法是换硬件 PWM(树莓派上 GPIO12、13、18、19 支持),或者干脆用 PCA9685 让专用芯片产生 PWM。
机械负载或舵机本身的问题。塑料齿轮舵机在负载接近额定扭矩时,会持续发生"过冲-回调"的振荡。这种抖动加电容没用,要么换大扭矩舵机,要么减负载。还有一个隐蔽原因:舵机内部的死区设置偏小,控制板一直在纠偏。这种情况可以试到位后detach(),很多抖动会立刻消失。
4.3 用缓动函数做梯形速度曲线
直接改角度值,舵机会用最大速度冲过去,冲击大、还容易过冲。稍微改一下代码,加个缓动就完全不一样:
import math import time def ease_in_out(t): # 余弦缓动,速度在两端慢、中间快 return 0.5 * (1 - math.cos(math.pi * t)) def move_smooth(set_angle_func, start, end, duration=0.8, steps=60): dt = duration / steps for i in range(steps + 1): t = i / steps angle = start + (end - start) * ease_in_out(t) set_angle_func(angle) time.sleep(dt) move_smooth(lambda a: kit.servo[0].__setattr__('angle', a), 0, 120, 0.8)sleep的精度不高,如果动作要求高,用time.monotonic()算绝对时间戳来控步长。我实测下来,0.6 到 1.0 秒完成 90 度是比较自然的节奏,太快会甩,太慢会显得迟钝。
4.4 多路舵机错相启动
做机械臂的时候,四个舵机同时启动的瞬间电流是单独启动的四倍,很容易把电源拖垮。解决办法是错相:让每个舵机错开 30 到 50 毫秒启动,或者让它们同时启动但用不同的时长到达,电流峰值就分散开了。
对 PCA9685 来说还有个好处:芯片内部是分时输出 16 路 PWM 的,本身就不会完全同时。但电机的机械启动瞬间还是重叠的,所以软件层面错相依然有意义。
5. 多路扩展:PCA9685驱动板与总线舵机两条路线
三路以内用树莓派引脚直驱没毛病。超过四路就该考虑架构升级了。
5.1 PCA9685 接线、频率与地址
PCA9685 是一块 16 通道 PWM 驱动板,通过 I2C 和树莓派通信,只需要两根线(SDA、SCL)加电源和地。
接线要点:
- 板子的 VCC 是芯片供电,接树莓派 3.3V;
- 板子的 V+ 是舵机电源,接外部 5V/6V,不要接树莓派 5V;
- 板子的 GND 和树莓派 GND 必须连通;
- 树莓派 3B/4B 的 I2C 是 GPIO2(SDA)和 GPIO3(SCL),树莓派 5 上位置一致。
频率设置上有个细节:舵机要 50Hz,但如果你想让它稍微更精细,可以设到 60Hz,很多舵机也吃得下。设太高(比如 200Hz 以上)会导致脉宽分辨率不够,角度抖动。PCA9685 的 PWM 分辨率是 12 位,50Hz 下每格约 4.88us,够用。
多块板子并联时改地址,默认 0x40,往上依次 0x41 到 0x7F。改地址要焊板子上的 A0-A5 焊盘,别偷懒用软件改,硬件地址最稳。
5.2 总线舵机的串口玩法
总线舵机这几年在树莓派毕设里越来越常见,原因很简单:它解决了开环舵机的所有痛点。
它的核心区别是带反馈的闭环数字通信。树莓派通过半双工串口发出指令帧(包含 ID、目标位置、速度、加速度),舵机回传当前位置、负载、温度、电压。你终于能知道它到底转没转到位。
代价是接线和协议都复杂一些:需要一根信号线做半双工收发,需要一个电平转换或者专用的总线适配板,还要按协议拼帧。飞特那类舵机的协议文档是公开的,但拼帧这一步对新手不算友好。
我的建议是:第一次做,用 SG90/MG90S 加 PCA9685 就够了,把整个链路跑通、把动作调顺。等你确实需要高扭矩、需要位置反馈、需要走总线拓扑(一条线串十几个舵机)的时候,再上总线舵机。别一上来就上,容易在协议细节上卡住而放弃。
5.3 机械臂与云台场景的取舍
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 单轴指向、简单云台 | 树莓派引脚直驱 MG90S | 结构最简单,成本最低 |
| 双轴云台(俯仰+偏航) | 2 路 PCA9685 或直驱 | 两路电流可控,直驱也行 |
| 四到六轴机械臂 | PCA9685 + MG996R | 通道多,必须独立供电 |
| 仿生手臂、高精度关节 | 总线舵机 | 需要反馈和轨迹控制 |
| 毕设级别的复杂项目 | 总线舵机 + ROS2 | 可扩展、可标定 |
树莓派 5 上跑 Ubuntu 加 ROS2 再控制舵机,是现在很多毕业设计的技术栈。这种做法要注意的是,ROS2 的节点通信有延迟抖动,舵机控制节点最好用独立的定时器线程,别把 PWM 输出放在回调里直接做。
6. 实战排查链路:几个高频故障的完整定位过程
前面讲的是原理和方案,这一节讲的是出问题了怎么查。我按"现象 -> 可能原因 -> 验证方法"的顺序写,你可以直接照着走一遍。
6.1 一上电树莓派就重启
这是最常见也最吓人的一个。
我的排查顺序是这样的:先断开舵机电源,只让树莓派跑,确认树莓派本身稳定;然后接上舵机电源但不接信号线,看是否还重启——如果重启,说明是纯电源问题,跟信号无关;接着接上信号线,上电,观察。
如果确认是电源问题,往前扒:检查是不是从树莓派 5V 引脚取的电,是的话直接改独立供电;如果已经是独立供电,量一下舵机电源的上电波形,看有没有跌落;最后给舵机电源端并 2200uF 电容,再试。
有个很隐蔽的情况:舵机电源和树莓派共用一个插座,但那个插座上的电源适配器功率不够,两个设备加起来超了。这种就要换个更大的适配器,或者完全分开。
6.2 舵机只往一个方向转到底/不动
先分清是"完全不响应"还是"响应但方向不对"。
完全不响应的话,按这个顺序查:万用表量舵机电源是不是真的有 5V;信号线是不是接对了引脚(BCM 编号和物理引脚编号是两回事,这个坑踩过太多人);共地有没有做;代码里的引脚号是不是和实际接线一致。
如果三个条件都满足还是不动,那可能是信号电平问题。舵机信号线期望 3.3V 到 5V 的方波,树莓派的 GPIO 输出 3.3V,绝大多数舵机能识别,但少数老型号或者长线传输时会识别不到。可以在信号线上加一个简单的电平转换或者加个上拉。
如果是"响应但只往一个方向转到底",八成是这两种情况。第一种,你手里拿的是 360 度连续旋转舵机,按角度公式去控制它就是这样。第二种,脉宽明显超出了舵机行程,比如写了个 3000us 的脉宽,舵机一直朝一个方向顶到底。把脉宽压回 500 到 2500us 之间再试。
还有一种情况是舵机内部电位器坏了或者齿轮卡死。判断方法:断电后用手轻轻转输出轴,能顺滑转动的机械正常,转不动的就废了。
6.3 MG996R发烫、抖动、位置漂移
MG996R 是大扭矩舵机,问题也最多。
发烫通常是两个原因:一是持续通电待机,控制板一直在纠偏,静态电流虽然只有 100mA 左右,但长时间也会温热;二是堵转,负载超过额定扭矩,电流飙到 2A 以上,几分钟就能烫手。后者必须减负载或者加配重平衡,别硬撑,会烧。
抖动大多是电源纹波大或者负载太接近极限。实测电压低于 4.8V 时抖动会明显加剧,所以供电线要够粗,长度要短。
位置漂移是舵机的通病。开环舵机在反复动作几百次之后会有累积误差,尤其是廉价型号。我的做法是每次动作开始前先回一次中位做"归零",用一个已知的参考点消除累积误差。如果你的电源支持,也可以在每次动作结束后detach(),减少舵机内部持续纠偏带来的磨损。
6.4 长时间运行的稳定性经验
最后几点是从长期跑下来的项目里总结的,写进代码能省很多事。
第一,加看门狗。如果 PWM 输出线程挂了,舵机会停在上次的位置不动。用一个独立的监控线程,超过 500ms 没有心跳就主动把所有通道设成中位并断开输出。这比舵机乱转要安全得多。
第二,所有角度指令做边界裁剪。不管上层算出来什么值,进驱动层之前统一 clamp 到 0 到 180 度,避免一个异常值把舵机顶到极限。
第三,日志要有,但别刷屏。记录每次指令的目标角度和时间戳,出问题时能复盘。频率控制在每秒一条以内,别把 SD 卡写满。
第四,散热和走线。机械臂在密闭壳子里连续工作,舵机温度会堆上去。留通风孔,或者每隔一段时间让舵机回中位休息几秒。
最后补充一个我实际用下来很顺手的做法:把所有的舵机参数、校准值、运动时长都放到一个 YAML 或 JSON 配置文件里,代码只读配置。换舵机、调参数的时候不用改代码、不用重启程序,这对反复调试机械结构的人特别友好。前面那套分段校准的三个数,就放这里最合适。