1. 这篇文章真正要解决的问题
花几百上千元买一个桌面机械臂,对于很多想入门机器人、自动化或者嵌入式开发的朋友来说,是一笔不小的开销。更关键的是,买来的成品往往是一个“黑盒”,你只能用它提供的软件和接口,很难深入理解其背后的运动学、控制逻辑和硬件构成。这就像学编程只学会了拖拽控件,却不知道代码是如何运行的。
这篇文章要解决的,就是如何用极低的成本(约70元人民币),从零开始“手搓”一个功能完整的迷你桌面机械臂。这不仅仅是省钱,更是一次绝佳的、从底层理解机器人技术的实践机会。我们将从最基础的舵机、亚克力板、Arduino控制器讲起,一步步带你完成结构设计、电路连接、代码编写和运动控制。读完本文,你将收获的不仅是一个能动的机械臂,更是一套完整的机器人DIY知识体系,包括:
- 硬件选型与成本控制:如何用最便宜的通用部件(如SG90舵机)实现核心功能。
- 结构设计与装配:理解机械臂的自由度、关节和负载,并亲手组装。
- 核心控制逻辑:用Arduino编写代码,实现舵机的PWM(脉宽调制)控制。
- 基础运动学入门:了解如何通过角度计算,让机械臂末端移动到指定位置(正运动学)。
- 完整的项目实践:从零件到可动成品,打通电子、机械、编程的全流程。
如果你是一名学生、创客、嵌入式爱好者,或者任何对机器人感兴趣但被高昂成本劝退的开发者,这篇文章就是为你准备的。我们将用最直白的语言和可复现的步骤,把看似复杂的机器人技术“拆解”成一顿人人都能享用的大餐。
2. 基础概念与核心原理
在动手之前,我们需要先理解几个核心概念,这能帮你更好地规划项目,并在遇到问题时知道从哪里排查。
1. 自由度这是描述机械臂灵活性的关键指标。一个自由度代表一个独立的运动方向。我们常见的桌面机械臂通常是3到6个自由度。
- 3自由度:可以实现在平面内的移动(X, Y)和末端的旋转(Rz)。结构简单,成本最低。
- 4自由度:在3自由度基础上增加一个升降(Z轴)或手腕俯仰关节。
- 6自由度:理论上可以模拟人手臂的几乎所有空间姿态,结构复杂,成本高。 对于70元预算的“手搓”项目,我们通常选择3自由度或4自由度的结构,在成本、复杂度和功能之间取得平衡。
2. 舵机舵机是我们这个项目的“肌肉”,负责提供动力和精确的角度控制。我们选用最常见的SG90微型舵机,它价格低廉(约5-10元/个),控制简单。
- 工作原理:舵机内部有一个小型直流电机、减速齿轮组和一个控制电路。我们通过向它发送PWM信号来指定目标角度。PWM信号的脉冲宽度(高电平持续时间)对应着舵机的输出角度。
- 关键参数:工作电压(通常4.8V-6V)、扭矩(kg·cm,决定“力气”大小)、转动角度(通常0-180度)。
3. 控制器控制器是机械臂的“大脑”。我们选用Arduino Uno或其兼容板(如国产的CH340芯片版本),因为它生态丰富、编程简单、价格便宜(约15-25元)。
- 作用:运行我们编写的控制程序,根据逻辑生成多路PWM信号,同时控制多个舵机协调运动。
4. 正运动学这是让机械臂动起来的基础数学。给定每个关节的角度,计算末端执行器(比如夹爪)在空间中的位置。对于我们的多关节机械臂,需要通过三角函数(主要是正弦和余弦)进行层层计算。虽然本文不会深入复杂的矩阵运算,但会提供一个简化版的、适用于我们结构的计算方法,让你理解角度如何转换为坐标。
项目核心原理流程图:
你的控制程序 (Arduino IDE) ↓ 生成多路PWM角度指令 (Arduino板) ↓ (通过杜邦线) 驱动多个舵机转动 ↓ 机械结构将旋转运动转换为空间位移 ↓ 末端执行器到达目标位置理解了这个流程,你就掌握了这个迷你机械臂项目的全部技术脉络。
3. 环境准备与前置条件
工欲善其事,必先利其器。在开始采购和焊接前,请确保你具备以下软硬件环境。
硬件清单与采购指南(总成本约70元)
| 部件名称 | 规格/型号 | 数量 | 预估单价(元) | 备注 |
|---|---|---|---|---|
| 微控制器 | Arduino Uno R3 (兼容版) | 1 | 15-25 | 建议买CH340芯片的国产版,便宜好用。 |
| 舵机 | SG90 9g 微型舵机 | 3-4 | 5-10 | 3个用于臂关节,1个可选用于末端夹爪。买金属齿轮的稍贵但更耐用。 |
| 机械结构 | 激光切割亚克力板套件 | 1套 | 15-25 | 可在淘宝/拼多多搜索“机械臂 DIY 亚克力 套件”。这是成本大头,但比自己设计加工省事太多。 |
| 电源 | 5V 2A DC电源适配器 | 1 | 8-12 | 单独给舵机供电,避免Arduino板载电源过载。需搭配DC接口。 |
| 连接线 | 杜邦线(公对公,公对母) | 1包 | 2-5 | 用于连接Arduino、舵机和电源。 |
| 其他 | 螺丝刀套装、热熔胶枪/胶棒 | 1套 | 已有/5 | 组装必备。 |
总计:控制器(20) + 舵机x4(30) + 结构件(20) =70元左右。电源和线材可能略有超出,但基本符合预算。
软件环境准备
- 安装Arduino IDE:前往Arduino官网下载并安装适合你操作系统的IDE。这是编写和上传代码到Arduino板的核心工具。
- 安装驱动:如果你购买的是CH340芯片的兼容板,首次连接电脑时可能需要安装CH340驱动。通常在卖家提供的资料里或网上都能找到。
- 准备代码库:我们将使用一个非常经典的舵机控制库——
Servo.h,它是Arduino IDE自带的,无需额外安装。
技能前置条件
- 基础动手能力:能使用螺丝刀进行简单的拧螺丝组装。
- 基础电路知识:能区分电源正极(VCC/5V)、负极(GND)和信号线(Signal)。
- 编程入门:了解变量、函数、循环等基本概念。即使不熟,跟着代码注释也能完成。
4. 核心流程拆解
整个项目可以清晰地分为四个阶段:硬件组装、电路连接、程序编写、调试测试。我们按顺序一步步来。
阶段一:机械结构组装
- 清点零件:收到亚克力套件后,将所有板材和螺丝包分类摆好。通常包含底座、大臂、小臂、旋转底座、夹爪等部件。
- 阅读图纸:卖家一般会提供组装示意图。如果没有,可以根据常见的三自由度或四自由度机械臂图片进行推断组装。核心原则是:舵机作为关节的核心,其输出轴需要与相邻部件固定。
- 安装舵机:将舵机放入亚克力板预留的卡槽中,使用配套的小螺丝固定。注意舵机输出轴上的舵盘(白色塑料片)需要与要驱动的部件(如大臂)牢固连接。
- 逐级组装:通常顺序是:底座 → 旋转底座舵机 → 大臂舵机 → 小臂舵机 → 末端舵机(夹爪)。每连接一个关节,都用手轻轻转动,检查是否顺畅,有无卡滞。
关键提醒:组装时不要一次性将所有螺丝拧死,先 loosely 组装,调整好所有关节的初始位置和运动范围后,再逐步紧固。舵机在通电时强行用手掰动极易损坏。
阶段二:电路系统连接这是最容易出错的一步,请严格按照以下步骤操作:
- 供电分离:所有舵机不要直接从Arduino板上的5V引脚取电。Arduino的板载稳压芯片无法提供多个舵机同时工作所需的电流(每个舵机堵转电流可达500-700mA),会导致板子重启或损坏。
- 搭建供电电路:
- 将外部5V 2A电源适配器的输出端,连接到一个DC电源接口模块上。
- 从该模块的
VCC和GND引出线,连接到一块面包板或直接焊接一个公共的电源排线(正极一排,负极一排)。 - 所有舵机的红色线(VCC)和棕色/黑色线(GND)分别连接到这块公共电源的
VCC和GND上。
- 连接信号线:每个舵机的橙色/黄色线(Signal),分别连接到Arduino的数字引脚。例如:
- 底座旋转舵机 → 引脚 9
- 大臂舵机 → 引脚 10
- 小臂舵机 → 引脚 11
- 夹爪舵机 → 引脚 6 (如果有时)
- 共地:至关重要!必须将外部电源的
GND与Arduino板的GND引脚用一根杜邦线连接起来。这样它们才有共同的电压参考点,PWM信号才能被正确识别。
阶段三:控制程序编写我们将编写一个Arduino程序,实现机械臂的初始位置校准和简单运动。
- 包含库与定义引脚:在程序开头引入
Servo库,并为每个舵机声明对象和对应的引脚。 - 初始化设置:在
setup()函数中,将每个舵机对象关联到其信号引脚,并写入一个安全的初始角度(如90度),让机械臂启动时处于舒展的中间位置。 - 编写运动函数:创建如
moveToAngle(int base, int arm1, int arm2)这样的函数,通过servo.write(angle)方法平滑地将所有舵机移动到指定角度。 - 主循环控制:在
loop()函数中,可以调用运动函数,让机械臂在不同预设点位之间循环运动,或者加入串口通信,通过电脑发送指令来控制。
阶段四:调试与测试
- 上电前检查:再三检查所有VCC和GND连接是否正确,特别是电源正负极绝对不能接反。
- 分步测试:先只连接一个舵机,上传一个让它在0-180度来回摆动的测试程序,确保单个单元工作正常。
- 联合调试:所有舵机连接后,运行一个缓慢运动的程序,观察机械臂运动是否顺畅,有无异响或卡顿。用手轻轻感受关节处,如果舵机发热严重或无力,可能是负载过重或电压不足。
- 调整运动范围:在代码中限制每个舵机的运动角度范围(如
servo.write(constrain(targetAngle, 30, 150))),避免机械结构运动到极限位置产生硬碰撞,损坏舵机或结构。
5. 完整示例与代码实现
下面是一个针对三自由度机械臂(底座旋转、大臂、小臂)的完整Arduino控制示例。我们假设舵机信号线分别接在引脚 9, 10, 11 上。
// 文件:mini_robot_arm.ino // 描述:三自由度迷你机械臂基础控制程序 // 接线:舵机信号线分别接 Arduino 引脚 9(底座), 10(大臂), 11(小臂) // 所有舵机VCC接外部5V电源正极,GND接外部电源负极,并与Arduino GND共地。 #include <Servo.h> // 引入舵机库 // 1. 创建三个舵机对象 Servo baseServo; // 控制底座旋转 Servo arm1Servo; // 控制大臂(肩关节) Servo arm2Servo; // 控制小臂(肘关节) // 2. 定义每个舵机连接的引脚和初始安全角度 const int pinBase = 9; const int pinArm1 = 10; const int pinArm2 = 11; // 定义每个舵机的安全运动范围,防止机械碰撞 const int baseMin = 20; const int baseMax = 160; const int arm1Min = 30; // 大臂角度限制,避免撞到地面或自身 const int arm1Max = 150; const int arm2Min = 40; // 小臂角度限制 const int arm2Max = 140; void setup() { Serial.begin(9600); // 初始化串口通信,用于调试 Serial.println("Mini Robot Arm Initializing..."); // 3. 将舵机对象关联到实际引脚 baseServo.attach(pinBase); arm1Servo.attach(pinArm1); arm2Servo.attach(pinArm2); // 4. 移动到初始安全位置(各关节90度) moveToAngles(90, 90, 90); delay(1000); // 等待1秒,确保动作到位 Serial.println("Arm Ready!"); } void loop() { // 示例动作序列:在三个预设点之间循环运动 Serial.println("Moving to Point A: (60, 120, 80)"); moveToAngles(60, 120, 80); // 点A delay(1500); Serial.println("Moving to Point B: (120, 100, 100)"); moveToAngles(120, 100, 100); // 点B delay(1500); Serial.println("Moving to Point C: (90, 140, 60)"); moveToAngles(90, 140, 60); // 点C delay(1500); // 可以在此添加通过串口接收指令的代码 // readSerialCommand(); } // 5. 核心函数:控制三个舵机平滑移动到指定角度 void moveToAngles(int baseAngle, int arm1Angle, int arm2Angle) { // 限制角度在安全范围内 baseAngle = constrain(baseAngle, baseMin, baseMax); arm1Angle = constrain(arm1Angle, arm1Min, arm1Max); arm2Angle = constrain(arm2Angle, arm2Min, arm2Max); // 写入角度,舵机会自动转动到目标位置 baseServo.write(baseAngle); arm1Servo.write(arm1Angle); arm2Servo.write(arm2Angle); // 计算最慢舵机所需的大致时间,并等待动作完成 // SG90从0度转到180度约需0.3秒,这里留有余量 int maxChange = max(abs(baseAngle - baseServo.read()), max(abs(arm1Angle - arm1Servo.read()), abs(arm2Angle - arm2Servo.read()))); int delayTime = map(maxChange, 0, 180, 100, 500); // 根据角度变化量动态计算延迟 delay(delayTime); // 打印当前角度到串口监视器,用于调试 Serial.print("Angles set to: Base="); Serial.print(baseAngle); Serial.print(", Arm1="); Serial.print(arm1Angle); Serial.print(", Arm2="); Serial.println(arm2Angle); } // 6. 【进阶】通过串口接收指令控制机械臂(可选) void readSerialCommand() { if (Serial.available() > 0) { String command = Serial.readStringUntil('\n'); command.trim(); // 简单指令格式: "a90 b120 c80" if (command.length() > 0) { int bAngle = getValue(command, 'a', 0); // 解析底座角度 int a1Angle = getValue(command, 'b', 0); // 解析大臂角度 int a2Angle = getValue(command, 'c', 0); // 解析小臂角度 if (bAngle != 0 || a1Angle != 0 || a2Angle != 0) { moveToAngles(bAngle, a1Angle, a2Angle); } } } } // 辅助函数:从字符串中解析数值 int getValue(String data, char separator, int index) { int found = 0; int strIndex[] = {0, -1}; int maxIndex = data.length() - 1; for (int i = 0; i <= maxIndex && found <= index; i++) { if (data.charAt(i) == separator || i == maxIndex) { found++; strIndex[0] = strIndex[1] + 1; strIndex[1] = (i == maxIndex) ? i + 1 : i; } } return found > index ? data.substring(strIndex[0], strIndex[1]).toInt() : 0; }代码关键逻辑解释:
- 库与对象:
#include <Servo.h>和Servo对象是控制舵机的基石。 - 安全范围:
constrain()函数和预定义的Min/Max变量是保护舵机和机械结构的关键,务必根据你的实际组装情况调整这些值。 - 平滑移动:
moveToAngles函数是核心。它先限制角度,然后同时向三个舵机发送目标角度指令。后面的delay计算是为了确保机械臂有足够时间完成动作,避免连续发送指令导致动作混乱。 - 串口控制(进阶):
readSerialCommand和getValue函数提供了通过串口监视器发送指令(如a90 b120 c80)来控制机械臂的能力,这是实现更复杂交互的基础。
6. 运行结果与效果验证
将上述代码上传到你的Arduino板后,就可以进行验证了。
1. 上电与初始动作
- 连接好所有线路,先给外部5V电源适配器通电,再通过USB线将Arduino连接至电脑。
- 此时,你应该听到所有舵机发出一阵轻微的“吱吱”声(这是初始脉冲信号),然后三个舵机会同时转动到90度的位置。机械臂应呈现一个舒展的、类似“举手”的中间姿态。
- 打开Arduino IDE的串口监视器(右上角放大镜图标),设置波特率为9600。你会看到输出
Mini Robot Arm Initializing...和Arm Ready!的信息。
2. 自动演示循环
- 程序进入
loop()函数后,机械臂会开始自动在预设的三个点(A, B, C)之间运动。 - 观察运动过程:
- 运动是否平稳?有无剧烈抖动或卡顿?
- 每个点是否都能准确到达并保持?
- 串口监视器会同步打印
Moving to Point X...和Angles set to...的信息,核对实际角度与指令是否一致。
3. 手动指令测试(如果使用了进阶代码)
- 在串口监视器的输入框中,按照格式输入指令,例如
a45 b135 c60,然后点击发送。 - 机械臂应该会从当前点平滑地运动到底座45度、大臂135度、小臂60度的新位置。
- 验证成功的关键:
- 机械臂末端运动轨迹符合预期。
- 所有关节在运动中和到位后无异常噪音(持续的“滋滋”声可能表示舵机在堵转,即负载过大卡住了)。
- 运行几分钟后,用手背轻触舵机外壳,应是微温。如果烫手,立即断电检查是否负载过重或运动范围设置不当。
如果机械臂完全不动,第一步应该检查:
- 电源:外部5V电源适配器指示灯是否亮起?用万用表测量输出是否为5V?
- 共地:外部电源的GND和Arduino的GND是否用导线可靠连接?这是最容易被忽略的致命问题。
- 信号线:舵机的信号线是否确实插在了Arduino正确的数字引脚上?
- 代码上传:Arduino IDE是否成功上传程序?板卡型号和端口是否选择正确?
7. 常见问题与排查思路
在DIY过程中,你几乎一定会遇到下面这些问题。别担心,它们都有明确的解决路径。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 上电后舵机乱转/不动/抖动 | 1. 电源功率不足。 2. 未共地。 3. 信号线接触不良。 4. 舵机损坏。 | 1. 单独测试一个舵机,用手机充电器(5V1A)直接供电试。 2. 检查外部电源GND与Arduino GND的连接线。 3. 重新插拔杜邦线,或更换引脚测试。 4. 交换舵机测试。 | 1. 确保使用5V2A及以上电源。 2. 务必连接共地线。 3. 确保连接牢固,尝试更换杜邦线。 4. 更换故障舵机。 |
| 机械臂运动无力,抬不起小臂 | 1. 舵机扭矩不足(SG90扭矩约1.6kg·cm)。 2. 机械结构重心太靠前,力臂过长。 3. 电源电压偏低。 | 1. 空载时舵机转动是否顺畅? 2. 检查大臂、小臂的长度和重量分布。 3. 测量电源空载电压。 | 1. 接受SG90的能力限制,不要设计过长的臂展或末端加载重物。 2. 优化结构,缩短力臂,或将舵机位置前移。 3. 确保电源输出电压在5V以上。 |
| 运动到某个位置卡住并发出“滋滋”声 | 舵机堵转。机械结构运动到了物理极限,但代码中的角度限制未生效,舵机仍在用力。 | 1. 手动将机械臂移到卡住位置附近,听声音判断。 2. 检查代码中的 constrain函数和Min/Max范围值。 | 1.立即断电!长时间堵转会烧坏舵机。 2. 调整代码中的角度安全范围,留出至少10-20度的余量。 3. 重新设计或调整机械结构,避免干涉。 |
| Arduino板自动复位或程序不运行 | 舵机工作时电流过大,导致Arduino板电压被拉低,触发复位。 | 观察是否在多个舵机同时启动或受力时发生复位。 | 严格将舵机供电与Arduino板供电分离。Arduino仅通过USB供电或另一路独立的5V供电,舵机全部由外接电源供电,并确保共地。 |
| 通过串口发送指令无反应 | 1. 串口波特率不匹配。 2. 指令格式错误。 3. 未启用串口指令代码。 | 1. 检查串口监视器波特率是否为9600。 2. 检查发送的指令是否以换行符结束。 3. 检查 loop()中是否调用了readSerialCommand()函数。 | 1. 将串口监视器波特率设置为9600。 2. 发送指令如 a90 b90 c90后按回车。3. 在 loop()函数内添加readSerialCommand();。 |
| 机械臂运动不精确,重复定位差 | 1. SG90舵机本身精度有限(约±10度)。 2. 机械结构存在较大间隙或刚性不足。 3. 电源电压波动。 | 1. 让舵机反复运动到同一角度,观察停止位置是否一致。 2. 用手轻推末端,看是否有明显晃动。 | 1. 接受低成本舵机的精度限制,适用于演示和教育,不适用于高精度任务。 2. 紧固所有螺丝,检查亚克力连接处是否牢固,必要时用热熔胶加固。 3. 使用稳压性能更好的电源。 |
8. 最佳实践与工程建议
为了让你的迷你机械臂项目更稳定、更可扩展,遵循以下实践建议:
1. 电源与电路设计
- 绝对分离供电:这是铁律。使用独立的5V 2A-3A开关电源为所有舵机供电。Arduino可以通过USB供电或该电源的另一个5V输出口(如果支持)供电。
- 增加电容:在舵机群的电源正负极之间并联一个470μF - 1000μF 的电解电容(注意正负极),可以吸收舵机启停时产生的电流尖峰,稳定电压,减少对控制信号的干扰。
- 使用面包板或PCB:对于多于3个舵机的项目,建议使用面包板搭建电源总线,或者自己画一块简单的PCB,这比一堆杜邦线飞线要可靠得多。
2. 结构与装配优化
- 减轻末端负载:SG90扭矩很小,尽量不要在末端安装沉重的传感器或夹爪。如果必须安装,优先使用3D打印的轻量化结构。
- 加固关键关节:在舵机与亚克力板的连接处、臂与臂的连接处,可以点少量热熔胶或使用螺丝胶(蓝色可拆卸型)增加强度,减少晃动。
- 设置物理限位:除了代码中的软件限位,可以在关键关节的亚克力结构上粘贴小块橡胶或塑料作为物理限位,提供双重保险。
3. 软件与控制优化
- 使用
Servo.writeMicroseconds():servo.write(angle)内部映射到0-180度对应约1000-2000微秒脉冲。有时舵机中位并非精确的1500微秒。对于要求更高的应用,可以直接使用writeMicroseconds(us)进行更精确的校准。 - 实现平滑运动(插值):不要让舵机直接从角度A跳到角度B。可以写一个函数,计算中间点,逐步逼近目标角度,使运动更平滑。
void smoothMove(Servo &s, int targetAngle, int stepDelay) { int current = s.read(); int step = (targetAngle > current) ? 1 : -1; while (current != targetAngle) { current += step; s.write(current); delay(stepDelay); } } - 引入逆运动学(IK):这是让机械臂真正“有用”的进阶步骤。给定末端目标坐标(X, Y, Z),通过逆运动学公式解算出每个关节所需的角度。对于三自由度平面臂,这涉及三角函数求解。网上有大量开源库(如
IK4点)可供参考,可以让你用坐标而非角度来控制机械臂。
4. 扩展与进阶方向
- 增加交互:接入超声波传感器测距,让机械臂自动避障;接入蓝牙模块(如HC-05),用手机APP控制;接入摄像头和OpenCV,实现颜色识别抓取。
- 升级硬件:将Arduino Uno换成ESP32,获得Wi-Fi和蓝牙功能,实现物联网控制。使用扭矩更大的MG996R舵机提升负载能力。
- 仿真先行:在投入硬件前,使用机器人仿真软件(如CoppeliaSim,旧称V-REP)或在线工具(如RoboDK)进行运动规划和碰撞检测,可以节省大量调试时间。
9. 总结与后续学习方向
通过这个约70元的迷你机械臂项目,我们完成了一次完整的、从硬件到软件的机器人开发初体验。你收获的绝不仅仅是一个会动的玩具,而是理解了自由度、舵机控制、PWM信号、电源管理、正运动学这些机器人学的核心概念,并亲手解决了装配、调试中的实际问题。
这个项目的真正价值在于它像一个“引路人”,为你打开了机器人世界的大门。接下来,你可以沿着以下几个方向继续深入:
- 深入运动学与控制理论:学习更完整的D-H参数法建立机器人模型,研究逆运动学(IK)算法,让你的机械臂能够“指哪打哪”。
- 探索更强大的控制器:尝试使用STM32、树莓派Pico甚至树莓派4B作为主控,它们能运行更复杂的算法和操作系统。
- 集成传感器与感知:为机械臂装上摄像头(OpenCV)、力传感器、激光雷达,让它从“盲人”变成有“眼睛”和“触觉”的智能体。
- 学习机器人操作系统:接触ROS(Robot Operating System),这是工业界和学术界的事实标准。你可以先在电脑上仿真,然后将控制节点部署到你的实体机械臂上。
- 参与开源社区:在GitHub上搜索“DIY Robot Arm”、“Arduino Robotic Arm”,你会发现无数优秀的开源项目和代码库,可以借鉴、修改甚至贡献自己的代码。
记住,所有复杂的现代机器人系统,其基础单元都和我们今天搭建的这个迷你机械臂类似。理解了最基础的原理,再去看那些高级框架和算法,你将不再感到畏惧,而是能清晰地看到它们是如何一层层构建起来的。
建议你将本文的代码和调试经验收藏备用。当你下次想用机械臂完成一个更酷的想法时,这个70元起步的项目,就是你最坚实的第一块基石。动手去试,遇到问题就回来查阅排查思路,机器人技术的乐趣,就在这一次次的调试与成功之中。