做“机器人被挠脚心”这个项目,起因其实挺简单:我想验证一个小型机器人对“突发触摸”能做出多自然的反应。这个项目在我自己整理的《FM及机器人系列》里属于TK(触觉互动测试)专题,后来做着做着发现,它已经不只是一个整蛊玩具,而是一套完整的“触觉感知 + 运动反馈 + 状态管理”机器人交互原型。很多做陪伴机器人、展览机器人、教育机器人的人,最后都会遇到同一个问题:机器人太“木”了,摸它没反应,或者反应延迟明显,体验非常差。而“挠脚心”恰好是触发快速自然反应的极佳测试场景,我做完这套之后,很多做ROS开发的同事也拿它当入门练手项目。
这个项目最适合两类人:一类是刚开始学机器人控制、ROS系统,想找一个有趣又不枯燥的载体来练习的人;另一类是已经被课程里的正运动学、逆运动学搞得有点疲惫的初学者,想换个更有成就感的角度理解传感器和执行器如何协同工作。我会从硬件选型、传感器原理、状态机设计、ROS 2集成,到完整实操和常见问题,把整个项目展开来讲,尽量让你能直接“抄作业”。
1. 整体设计思路:先想清楚“怕痒”这个动作需要什么
1.1 为什么选择“挠脚心”作为交互场景
传统机器人给人的印象是“被动执行”,你按按钮它才动,你发指令它才做。但这种模式离“人机自然交互”非常远。这几年我接触过的服务机器人、导览机器人项目,客户几乎都会提一个需求:能不能让机器人更有“人情味”?其中最容易出效果的一招,就是让它对自己的身体被触碰产生反应。微软的小冰、优必选的Walker等产品,也都做过“怕痒”“怕摸”这类演示,目的就是拉近机器人和用户的距离。
“挠脚心”是触发人类自然反应最强的动作之一,换到机器人身上,它天然具备三个测试价值。首先,脚底是机器人身体上相对隐蔽、区域明确的部位,传感器安装不会破坏整体外观。其次,触碰脚底的力度差异很大,从轻轻拂过到用力按压,能很好地测试传感器量程和阈值设计。最关键的一点是,“缩脚”“抖动”“发出声音”这一整套反应在观感上充满喜剧色彩,非常适合在课堂、展会、活动上做演示,容易调动气氛,也让学习者更有动力把项目调好。
从本质上看,这个项目要解决的三个技术问题很清晰:脚底受到触碰时,传感器如何快速准确感知;感知到信号后,机器人如何选择并执行“反应动作”;整个过程的延迟要控制在多短,才能让交互显得自然。这三个问题分别对应硬件层、控制层和交互层,恰好是机器人开发的三个基本切面。
1.2 整体方案选型:分层设计,避免一锅烩
我在设计这个项目时,没有选择“一块板子搞定所有事”的做法,而是把系统分成了感知层、控制层、表现层三层。感知层用压敏电阻(FSR)检测脚底压力;控制层用一块ESP32作为主控,负责采集信号、运行状态机、输出控制指令;表现层由舵机、振动马达和音频模块组成,分别实现“缩脚”“颤抖”“笑/求饶”三种反馈。
之所以分层,是因为这个项目后续有很强的扩展性。如果你只想做一个整蛊玩具,用一块Arduino Nano就能完成全部工作;但如果你想把项目接入ROS 2,或者把“挠痒反应”做成整个机器人交互系统的一个子系统,就必须把感知、决策、动作分开。我自己刚开始也是图省事,把代码全写在一个loop里,后来加了ROS接口之后不得不重写了一遍,教训很深刻。
硬件选型上,我最终选用了ESP32而非Arduino Uno,原因是ESP32的ADC精度更高、支持Wi-Fi/蓝牙,而且双核处理器可以一个核跑传感器采样、另一个核跑状态机。不过要注意,ESP32的ADC有非线性问题,后面我会专门讲怎么校准。执行器方面,脚部缩回动作用了SG90舵机,但经过几次测试后,我强烈建议换成MG90S或MG996R,因为SG90在连续抖动时很容易发热甚至烧毁。振动马达用的是常见的手机扁平马达,通过一个S8050三极管驱动,音频部分用了DFPlayer Mini播放MP3音效,比直接用蜂鸣器逼真得多。
2. 触觉感知是怎么实现的:FSR传感器原理与安装细节
2.1 FSR压敏电阻的工作原理
FSR(Force Sensing Resistor,压敏电阻)是这个项目感知层的主角。它的工作原理很简单:当压力施加在传感器有效区域上时,内部导电粒子和电极之间的接触面积增加,导致电阻值下降。没有压力时它的电阻通常在1MΩ以上,随着压力增大可以降到几kΩ甚至几百Ω。
要让ESP32读取这个电阻变化,不能直接把FSR接到ADC引脚,因为ADC读的是电压而不是电阻。标准做法是接一个分压电路,把FSR和一个固定电阻串联,中间抽头接到ADC输入。这里有个非常容易踩的坑:很多人以为固定电阻的阻值选得越大越好,其实不是。固定电阻阻值决定了电路的灵敏度范围,选得太大,轻轻一碰ADC就到满量程,后面没法区分“轻触”和“重压”;选得太小,重压时电压变化不明显,分辨率又不够。
我最终选的固定电阻是10kΩ,这个值在大多数场景下能兼顾。举个例子,我用的FSR型号是Interlink FSR402,它在轻触时阻值约为20kΩ,重压时约2kΩ。用10kΩ固定电阻做分压时,轻触状态ADC口电压大概是3.3 * 10 / (20 + 10) = 1.1V,重压状态大概是3.3 * 10 / (2 + 10) = 2.75V,整个区间接近1.65V,非常利于分辨率分配。如果你用的是其他型号FSR,可以先用万用表测一下轻触和重压下的实际阻值,再根据公式R_fixed = sqrt(R_light * R_heavy)估算最佳固定电阻,这个公式来自分压电路的最大灵敏度条件,我实测下来比较可靠。
2.2 脚底结构改造与传感器固定
FSR传感器虽然叫“压敏电阻”,但它对安装方式非常挑剔。最理想的状态是:FSR放置在一个平整坚硬的平面上,上方覆盖一层薄而柔软的压力传递层。如果直接贴在软海绵上,FSR会因为基材弯曲而产生非线性输出;如果上方压着一块硬塑料,压力又会集中在某一点,导致大面积区域没有参与感应。
我的做法是:先3D打印一个脚掌形状的硬底壳,底部留一个和FSR有效区域尺寸一致的浅槽,把FSR用双面胶粘在槽里,再在最上面贴一层1mm厚的硅胶脚垫。FSR的引脚线则沿着腿侧布线,用螺旋缠绕管保护起来,一直延伸到主控板。这里有个细节需要特别强调:FSR的引脚和柔性基材连接处非常脆弱,剧烈弯折几次就会内部断路,而表现症状不是完全没信号,而是信号忽大忽小,极难排查。我后来把所有靠近关节的线都换了硅胶软线,并在线材进入脚掌的位置打了热熔胶固定,这个问题才彻底解决。
如果你没有3D打印机,也可以用EVA泡棉板手工挖槽代替,但一定要注意让FSR背面贴到的位置是平整的,不要在传感器正下方设置凸起结构,否则长时间受压之后FSR的阻值会发生永久性漂移。我拆了一个客户寄来维修的机器人,就是因为脚底用了一个凸点防滑垫,半年之后FSR输出的“无压力”电压从0.8V变成了1.6V,触发阈值完全错乱。
2.3 执行机构的配合:让“害怕”有层次
传感器解决的是“被摸到”的问题,而动作执行解决的是“怎么反应”的问题。这个项目里我用了三种执行器,分别对应三种不同的反应等级。舵机控制脚掌缩起,模拟“躲开”;振动马达装在身体骨架上,模拟“发抖”;DFPlayer音频模块负责播放声音,可以是笑声也可以是“不要挠了”的配音。
这三种执行器的配合顺序,决定了交互效果是否真实。我一开始的做法是:检测到触摸,三个执行器同时启动,结果机器人显得很“神经质”,没有任何情绪递进。后来参考了动物行为学里“惊吓反射”的概念,调整成有层次的反应路径:轻触时只缩一下脚,停顿0.2秒;持续触摸时脚掌连续抖动,同时开启振动马达;压力继续增加或者累计触摸时间超过2秒,才播放声音,并让舵机进行大幅度摆动模拟“挣扎”。这样的层次感让整个交互变得可信很多,也让我意识到,硬件能力其实早就够了,真正决定“像不像”的是软件里的状态设计和动作编排。
3. 软件核心:状态机驱动“被挠”反应
3.1 信号采集与滤波,防止误触发
FSR信号采集的第一步,是读取ADC值并做平滑处理。很多人拿到传感器后直接在loop里面写一句analogRead(),然后拿去和阈值比,这种方式在静态压力下没有问题,但用手指挠脚心时,压力是快速波动的,单次读取的值可能一下冲到阈值以上、一下跌回阈值以下,导致机器人短时间内疯狂触发,看起来就像抽风。
我实际使用的方案是滑动平均滤波,每次读入一个值,和最近5次的值取平均。这个滤波窗口长度是经过测试的:窗口太短(比如3次),滤不掉高频抖动;窗口太长(比如10次以上),反应延迟会明显增大,触摸响应变得迟钝。5次窗口在ESP32的ADC采样率下大约带来15ms的延迟,人几乎感知不到。
代码实现上,我放在一个定时器中断里执行采样,而不是主循环里。ESP32的ADC读取过程中如果被Wi-Fi任务打断,会返回异常值,所以采样代码做了异常剔除——连续两次ADC跳变超过1000单位就认为这次采样无效,丢弃重读。这个处理后面帮我排除了至少一半的“幽灵触发”问题。
3.2 四状态状态机:空闲、警觉、挣扎、恢复
整个反应逻辑我用一个简单的状态机来管理,四个状态分别是IDLE(空闲)、TOUCHED(警觉)、STRUGGLE(挣扎)、RECOVER(恢复)。设计思路是这样的:
IDLE状态下,系统正常检测压力,压力超过阈值的时刻记录为触摸起始时间,进入TOUCHED。TOUCHED状态下,机器人执行小幅动作(比如脚掌缩回一个小角度),但不会持续反馈,同时累积一个“痒感值”。如果触摸在1秒内结束,系统回到IDLE;如果触摸持续,痒感值累加,超过设定值后进入STRUGGLE。STRUGGLE状态下才是完整的“挣扎”表现——连续抖动、发声、大幅摆动。当压力消失后,进入RECOVER状态,这个状态有点像一个“冷却时间”,5秒内不响应任何触摸,避免刚安静下来又被立刻戳一下导致系统处于永动状态。冷却结束后回到IDLE。
这里有一个非常关键但又容易被忽略的细节:状态切换不能太“陡”。比如从IDLE直接进入STRUGGLE,如果动作突然从静止跳到最大幅度,舵机在速度很快的情况下会产生巨大冲击电流,造成电压跌落,甚至让ESP32重启。我在状态切换时加入了动作淡入机制,也就是每个动作指令都带一个加速度限制,舵机速度从当前值按步长逼近目标值,而不是直接跳到目标角度。这个机制让整个机器人的动作看起来“肉肉的”,反而比机械式的瞬间到位更有生物感。
3.3 压力和动作的映射关系
为了让“越挠越痒”的感受传递出来,我把FSR的压力值映射成了三个档位。轻压(电压0.8V~1.5V)对应“缩脚”动作;中压(1.5V~2.2V)对应“连续抖动+振动马达”;重压(2.2V以上)对应“大幅挣扎+播放音效”。这个映射不是写死阈值,而是做一个分段线性映射函数,让输出动作幅度和输入压力成正比。
映射的实现需要一个校准过程。我建议先把ADC原始值通过串口打印出来,用不同力度多次按压,记录三个区间的典型值。由于FSR在长期使用后会有轻微漂移,比较稳妥的做法是在系统启动时做一个短暂的“无压力基准采样”,把这个基准值作为零点,之后所有判断都基于相对压力而非绝对电压。这个功能代码量不大,但能大大提升长期使用的稳定性。我后面做过一个实验,用同一套设备连续运行72小时,套了基准校准后,触发阈值几乎没变,而没套校准的,触发电平漂了将近0.3V,已经足够引起误触发了。
4. 接入ROS 2:把玩具变成机器人开发练手工程
4.1 为什么非要接ROS 2
先声明一下,如果你只是想做一个整蛊机器人或者桌面摆件,完全不需要上ROS 2,用我上面说的Arduino单机方案就够了。但如果你是想认真走机器人开发路线,ROS 2几乎是绕不过去的门槛,而“能产生直观交互反馈”的项目是最好的学习载体。我在带新人学ROS 2的时候发现,让人对着吃灰的说明书去学话题通信,效率极低;但如果让我摸一下机器人、机器人就挣扎一下,新人会追着问“这个信号到底是怎么从传感器传到执行器的”,这时候讲话题、讲节点,接受度完全不一样。
从系统结构上看,ROS 2很适合这个项目的原因在于“模块化”。传感器驱动、状态判断、动作执行可以是三个独立节点,你甚至可以只在传感器节点上做仿真,用ros2 topic pub手动发消息,就能看见动作执行的效果。这样即使硬件还没到货,代码部分已经可以并行开发了,对团队协作也非常友好。
4.2 节点划分与话题定义
在这个项目里,我划分了三个节点。第一个是sensor_node,负责读取ESP32通过串口发来的压力值,并把float数据发布到 /touch_strength 话题上。选择这个做法的原因是,ESP32作为单片机负责实时采样,ROS 2作为上层负责逻辑,两者边界非常清晰。第二个是react_node,订阅 /touch_strength,运行上文提到的状态机,计算当前应当执行的反应等级,并把结果发布到 /react_command 话题。第三个是action_node,订阅 /react_command,把抽象的“挣扎”指令翻译成具体的串口指令(比如“舵机转到120度,振动马达开,循环3次”),发给ESP32执行。
话题类型上,/touch_strength 用的是标准类型 std_msgs/msg/Float32,而 /react_command 我自定义了一个消息,包含两个字段:float32 strength 和 string reaction_type。用自定义消息而不是直接用String,是为了将来扩展方便——比如以后要加“表情屏控制”“语音回复”,直接在同一个消息里加字段就行,不用新增话题。
这个架构的好处是,任何一个节点都可以单独替换或测试。有一次我的ESP32硬件坏了,我没有等新的板子到,直接写了一个模拟传感器节点,按正弦波规律发布压力值,整个交互逻辑照常跑通。这在传统的“一坨代码”式开发里是不可能做到的。
4.3 参数配置与launch启动
在ROS 2里,我把所有阈值参数都做成了参数,而不是写死在代码里。比如 /react_node 下的 touch_threshold、struggle_threshold、recover_time,都可以在launch文件里传值,这样调整机器人“性格”的时候不需要重新编译。我还做了一个很实用的功能:通过参数控制 “敏感度模式”,把阈值整体除以一个系数。展览演示时设为1.5,变得很敏感,观众轻轻碰一下就有反馈;家里调试时设为0.8,减少误触发。
launch文件本身也很简单,用Python的launch格式,把三个节点串起来,顺手启动一个串口权限设置命令。其实把这套流程跑通之后,你再去理解ROS 2里那些更复杂的navigation、moveit配置,思路都是相通的,无非就是“节点+话题+参数”的组合变化。
5. 完整实操:从接线到跑通的每一步
5.1 物料清单与接线方式
先列一个可以直接照着买的物料清单,都是非常常见的东西:
| 物料 | 型号/规格 | 数量 | 用途 |
|---|---|---|---|
| 主控板 | ESP32 DevKitC V4 | 1 | 采集与底层控制 |
| 压敏电阻 | Interlink FSR402 | 2 | 左右脚底检测 |
| 固定电阻 | 10kΩ 1% | 2 | FSR分压 |
| 舵机 | MG90S金属齿轮 | 2 | 脚掌抬起/晃动 |
| 振动马达 | 手机扁平马达(3V) | 1 | 颤抖体感 |
| 三极管 | S8050 | 1 | 驱动振动马达 |
| 音频模块 | DFPlayer Mini | 1 | 音效播放 |
| 扬声器 | 3W 4Ω | 1 | 输出声音 |
| 电源 | 5V 3A DC-DC模块 | 1 | 稳定供电 |
| 3D打印件 | 脚掌壳、腿部支架 | 1套 | 结构支撑 |
| 硅胶脚垫 | 1mm厚 | 2 | 压力传导与防滑 |
接线方面,FSR部分按之前说的分压电路连接,两个FSR分别接ESP32的GPIO34和GPIO35。需要特别提醒的是,ESP32的ADC引脚并不是所有GPIO都能用的,有些引脚内部已经连接到flash电路,读取时会有很大噪声。我自己踩过坑的包括GPIO36?不,36和39是纯输入ADC通道没有问题,但像GPIO2、GPIO15之类的被占用引脚就不要碰了。舵机的信号线接GPIO12和GPIO13,这两路是硬件PWM通道,稳定度好于软件PWM。振动马达通过三极管接到GPIO14,音频模块的RX、TX分别接GPIO16和GPIO17。
供电是这个项目里最容易出问题的部分。ESP32的USB供电在舵机瞬间启动时会产生严重压降,表现为机器人一抖就重启。我的解决方案是:舵机和主控分开供电,舵机直接用5V 3A的DC-DC模块供电,主控板也从同一个电源取电,但通过一个大容量电解电容(1000μF)在电源入口做缓冲。这样即使舵机瞬间拉走1.5A电流,主控电压波动也能控制在0.2V以内。
5.2 下位机代码与上位机代码
下位机(ESP32)代码我分成三个文件:main.ino负责初始化和主循环,sensor.cpp负责FSR采样和滤波,action.cpp负责执行舵机、马达、音频的具体动作。主循环的逻辑很简洁,每10ms读取一次压力值,将值通过串口发送,同时检查是否收到来自ROS 2端的控制指令,收到就执行对应动作。由于采样放在定时器中断里,主循环里的串口接收不会阻塞传感数据的更新。
示例里最关键的是定时器采样部分:
hw_timer_t *sampleTimer = NULL; volatile float filteredPressure = 0; volatile bool sampleReady = false; void IRAM_ATTR onSampleTimer() { int raw = analogRead(FSR_PIN); // 简单的异常剔除,跳变过大时忽略本次值 static int lastRaw = 0; if (abs(raw - lastRaw) > 1000) { lastRaw = raw; return; } lastRaw = raw; // 5点滑动平均 static float buf[5] = {0}; static int idx = 0; buf[idx] = raw; idx = (idx + 1) % 5; float sum = 0; for (int i = 0; i < 5; i++) sum += buf[i]; filteredPressure = sum / 5.0; sampleReady = true; }需要注意,在ESP32的Arduino环境里,定时器回调函数必须用IRAM_ATTR修饰,否则在Wi-Fi栈启用时会触发异常重启。这是ESP32的一个“经典坑”,很多新手都会在这里卡一晚上。
上位机(ROS 2)部分,sensor_node的核心是串口读取并转换数据类型。Python里用pyserial读串口,解析形如P:1.234\n的协议帧,然后发布到 /touch_strength。整个循环用 rclpy.spin_once() 配合小延时,避免串口缓冲区 overflow。
5.3 灵敏度标定的具体操作
标定这一步,我建议按照以下步骤来,不要跳步。
先打开串口监视器,在无压力的状态下记录10秒,取平均作为基准零点。然后用手指以你感觉“很轻”的力度触碰FSR,记录这一瞬间的电平值,记为“轻触值”;再用正常力度按一下,记为“中压值”;再用最大力气按压,记为“重压值”。把这三个值填到react_node的params.yaml里,作为压力分档的锚点。
实际操作中,有一个很容易被忽略的变量:温度。FSR的阻值会随温度漂移,尤其是放在脚底这种不透气的结构里,机器人内部温度升高后基线会变。所以我把“启动时自动校准零点”做成了默认行为,每次上电都会重新读取基线,而不是用代码里写死的0.8V。这个改动小,但长期运行稳定性的提升非常明显。
5.4 动作参数的调试心得
动作表现的调试,本质上是在玩一组参数:舵机目标角度、转动速度、停顿时间、循环次数。我的参考经验是:轻触反应舵机转20度、速度250、停顿300ms;挣扎反应舵机转45度、速度600、循环4次,每次间隔80ms。
如果发现动作看起来“假”,最常见的原因其实是舵机速度太快了,快到看起来像被电击,而不是在发抖。真人的颤抖频率大概在5~10Hz,如果想让机器人看起来更接近生物,抖动间隔应该在100ms~200ms之间,而不是越快越像。这个经验是我调了很多版才总结出来的,你可以直接拿去用。
6. 常见问题与排查技巧实录
6.1 传感器不触发或者一直触发
先上排查清单,按概率排序:
| 现象 | 大概率原因 | 解决办法 |
|---|---|---|
| 完全没有信号 | FSR引脚扯断 | 测FSR两端电阻,量不出变化就是断了 |
| 信号一直满量程 | FSR被硬物压住/分压电阻接错 | 检查安装层,重新焊接固定电阻 |
| 信号不稳定 | 线材内部虚断 | 换硅胶软线,接头处打胶固定 |
| 上电时误触发一次 | 上电瞬间ADC未稳定 | 在sampleTimer回调里加“启动前200ms丢弃”逻辑 |
| 使用一段时间后误触发 | FSR零点漂移 | 启用启动自动校准,重新标定 |
有一个排查小技巧:把FSR的两个引脚不通过分压电路,直接接到万用表电阻档,用手按压看阻值变化。如果阻值变化正常(几千Ω到几十kΩ),那问题在电路或者软件;如果阻值不变,问题在传感器本身。这样能快速把问题定位到硬件层。
6.2 舵机抖动会导致整机重启
这个现象基本都是供电问题。舵机标称工作电流是堵转电流,MG90S堵转电流能到1.2A左右,而ESP32模块的稳压芯片根本顶不住这种瞬时抽载。解决方案有三个层次:第一,舵机电源单独走DC-DC模块,不经过主板的3.3V稳压器;第二,电源输入端并联一个大电容,增强瞬态响应;第三,软件上给舵机指令加“加速/减速”限制,不要让舵机以最大速度瞬间转向。
还有一点很多人不知道:舵机信号线在上电瞬间会短暂输出高电平,导致舵机冲到最大角度,如果此时机器人摆在不稳定的架子上,会摔下来。解决办法是在舵机信号线和地之间加一个10kΩ下拉电阻,让上电瞬间信号保持低电平,直到主控程序把PWM信号稳定输出。
6.3 交互延迟大,手感“肉”
手感“肉”的原因主要有两个:一是主循环里用了大量的delay()阻塞代码,传感器采样被拖慢了;二是ROS 2端的状态机循环周期太长,比如用默认的0.5s定时器来做状态切换,那触摸到反应之间会有明显卡顿。
我的做法是:下位机用硬件定时器做毫秒级采样,状态机跑在ROS 2节点里,但用50ms周期循环,而不是默认的500ms。如果你只跑单机版,不接ROS 2,那么整个状态机也放在定时器回调里执行,主循环只负责串口输出和处理外部指令。实测下来,从手指碰到FSR到舵机开始转动的延迟能控制在60ms以内,这个数值已经低于人类对“即时反馈”的感知阈值,交互体验非常流畅。
6.4 舵机转动时音频播放卡顿
音频卡顿的问题,根源在DFPlayer Mini和舵机共用电源时,舵机的干扰导致音频解码芯片供电不稳。DFPlayer Mini对电源噪声非常敏感,如果听到卡顿、破音,多半是电源不干净。解决办法是给DFPlayer Mini单独加一个100μF电容和1mH电感组成的LC滤波,或者干脆用一个独立的5V供电给它。此外,音频文件本身要转成不超过320kbps的MP3,采样率不要用44.1kHz,用22.05kHz就够了,这样解码负担更小,抗干扰能力也更强。
在我实际做的几个版本里,还有一个容易忽略的声音问题:播放音效和舵机动作同时启动时,音效的起点会和动作的起点有些微偏差,耳朵可能察觉不到,但在视频回放里会被放大。最自然的做法是让音效稍微提前100ms启动,因为人耳对“先有声音后有动作”比“先有动作后有声音”的容忍度高得多,这个细节能让整体观感真实不少。
最后分享一点我的个人体会
做这个项目最大的收获,不是“让机器人怕痒”这个玩笑本身,而是把一个看起来很无厘头的场景,硬生生拆成了传感、控制、状态管理、系统集成这四块,正好覆盖了机器人开发的主要环节。我前后给三个朋友做过类似的项目,每次都能在对外的演示中迅速吸引围观,甚至有人看到一半就问能不能直接把代码拿去给学生上课用。
如果你也想做,我的建议是不要一上来就追求完美,先让机器人有最基础的反应——碰到脚底就缩一下,这一版跑通了,再逐步加入声音、抖动、状态机,最后再接ROS 2。这样每走一步都能看到成果,学习动力会保持得很好。如果你在调试中遇到了上面没提到的问题,顺着“硬件—感知—电源—软件”这四个方向排查,绝大多数难点都能快速定位。希望这个项目也能让你在机器人开发这条路上,找到一个既好玩又有收获的切入点。