ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

六足机器人从SolidWorks装配到逆运动学步态控制实战

六足机器人从SolidWorks装配到逆运动学步态控制实战 简介一款基于SolidWorks 2015的六足球型机器人完整项目资源面向机械工程专业学生、机器人爱好者及研发人员解决从三维设计到编程控制的全流程学习与实践需求。压缩包约42.97MB核心文件类型涵盖可编辑的SW15三维模型、工程图、零件图与控制源码既呈现整机结构与装配关系也提供单独制造每个零件的详细图纸和可修改的运动控制程序。已有69人学习/下载。借助该包使用者可以深入了解六足机器人模仿昆虫行走的稳定结构与步态设计并通过源码学习踢球、接球、避障等控制逻辑便于在此基础上开展二次开发、算法验证或直接用于机器人足球、地形探测等课题及竞赛无论用于高校课程设计、毕业设计还是机器人竞赛备战都能有效缩短从图纸到实物的学习曲线是颇具价值的教育与研究资料。1. 六足球型机器人的运动自由度和装配体约束六足球型机器人不是简单地在机身两侧各装三条腿而是把 18 个旋转自由度按三关节腿的构型组织起来。SolidWorks 2015 的可编辑装配体、工程图和配套源码三部分恰好对应了机械设计中“约束定义、公差传递、运动实现”三个阶段。装配体里的同轴配合决定舵机轴线位置工程图决定加工回来的零件能不能顺畅转动源码中的逆运动学解算把足端坐标换算成每个舵机的角度。对做机械的人这是从三维模型跨到运动控制的一条近路对做嵌入式的人这是把步态算法接进真实机构的落地场景。下面按装配体、运动学、固件、校准的顺序把整套项目从头捋一遍。2. 拆解 sw15 装配体可编辑模型、配合关系与工程图2.1 子装配体里的旋转轴是第一条线打开这份 sw15 工程包最先应该看的是每条腿的子装配体。典型的三关节六足腿由基节座、股节和胫节组成三个零件分别对应髋关节、大腿和小腿的转动。在 SolidWorks 2015 里转动副并不是一个单独的“铰链”特征而是靠同轴配合把舵机输出轴轴线和关节孔轴线锁在同一条直线上再用重合配合限制相对滑动。很多新手拿到模型后直接拖动零件发现能转就以为装配对了实际投影到工程图上看两段关节的中心线可能偏了 0.2mm加工出来的舵机座装上以后会卡。我一般会把每个舵机座的局部坐标系原点放在输出轴轴线上。这样后面做运动学分析时从模型里量杆长参数可以直接用坐标值不用再手动去猜“这点到那点的距离”。对六足这种六腿对称机构这个方法能省掉大量重复测量。拖动模型验证时还要注意三条腿关节的旋转方向是否一致镜像零件的坐标系是不是反的这两处是最常见的隐藏错误来源。装配体树里的配合类型检查可以按这张表快速核对配合类型使用位置用途同轴配合舵机输出轴与关节孔锁死旋转轴线保证转动同心重合配合舵机座底面与关节臂端面限制轴向窜动平行配合两节腿的基准面保证腿部在同一个平面内摆动距离配合上盖板与机身骨架给控制器和电池留出安装高度总数上算一次六条腿乘三个转动轴正确装配体里应该有 18 个核心同轴配合。如果你打开装配体数出来不是 18大概率某条腿用了镜像零件但坐标系方向没有跟着镜像这在装配树里体现为缺少或冲突的轴线约束。2.2 工程图不是投影是公差语言三维模型能给你形状工程图才给出“能不能装上、装上空不空转”的信息。这套项目包里的工程图重点看两个地方装配图的配合尺寸标注以及每个零件关键孔径的公差。舵机座与关节臂配合的地方我一般按 H7/g6 设计孔径取正偏差轴径取负偏差装配出来是轻微间隙既能保证转动顺畅又不会有明显晃动。舵机安装孔中心距的公差要收到 ±0.05mm 以内因为 18 个舵机的安装位置任何一处错都会放大到足端轨迹的偏差。从 SW15 出工程图的顺序通常是进入工程图环境插入模型视图先生成轴测图再补三个正交投影视图。对六足这种有多件同构零件的机构我给每条腿出一张镜像视图再在技术上注明左右件共用同一张图纸镜像加工这样既省篇幅又避免左右腿图纸漏标现象。常见的交付格式有一个小建议给加工方的文件不要直接发 SLDPRT先转成 STEP 格式兼容性更好。批量转换可以借助 SolidWorks Task Scheduler在 SW15 里通过任务向导一次选中全部装配体执行转换命令行的核心参数大致是这种形式sldworks -m Convert -i robot_assy.SLDASM -o robot_assy.STEP -format Step这段命令的作用是把顶层装配体连同所有零件导出为单个 STEP 文件-i指定输入装配体路径-o指定输出路径-format控制导出的数据格式。换工程图格式时把Step改成EASM可以直接输出 eDrawings 文件发给不装 SolidWorks 的同事做在线审阅。导出前最好先重建一次模型避免带旧版本缓存特征导出时模型爆炸。2.3 零件清单与材质选型整套六足机器人的物料核心是 18 个舵机加若干结构件关键零件可以按下面这个清单核对零件名称数量建议材质说明基节座6铝合金或 PLA连接机身与髋关节舵机股节6碳纤维板或 PLA大腿段长度直接影响步幅胫节6碳纤维管小腿段末端可以换足尖舵机座18铝合金固定舵机本体也承担轴向力机身上板1碳板安装主控板、IMU 和无线模块机身下板1碳板安装电池重心尽量放低零件描述与装配体树对不上时优先相信装配体的配合关系而不是单独零件图里的外观形状。因为零件图可能是旧版本迭代留下的装配体里的配合约束通常是最新一版调整完的状态。3. 逆运动学解算与三角步态落地前先把关节角算对3.1 三关节腿的几何模型与公式推导六足每条腿是一根三连杆链从髋关节中心到足端。建立坐标系时让 x 轴朝向机器人前方y 轴朝向侧面外方z 轴朝上。髋关节绕 z 轴旋转角度记作 a1大腿在 xz 平面上摆动角度记作 a2小腿相对于大腿转 a3。三个杆长参数 L1、L2、L3 是固定常量必须和 SolidWorks 装配体里实际测量的数据一致后面所有运动学计算才有意义。逆运动学的目标是从足端坐标 (px, py, pz) 反求三个关节角。最直接的推导是先求 a1因为髋关节只负责把大腿平面转到足端所在方向所以 a1 就是 atan2(py, px)。求 a2 和 a3 时把三维问题压到大腿平面看从髋关节到足端的距离 d 可以算出来于是三连杆就化简成一个平面三角形。已知三边 L2、L3、d用余弦定理就能解出两个角度。#include math.h #define L1 42.0f // 髋关节偏距单位 mm #define L2 58.0f // 股节长度单位 mm #define L3 72.0f // 胫节长度单位 mm void leg_ik(float px, float py, float pz, float *a1, float *a2, float *a3) { float r sqrtf(px * px py * py); float d sqrtf(r * r pz * pz); if (d L2 L3) { d L2 L3 - 0.1f; // 目标超出可达范围做饱和处理 } // 髋关节角绕机身坐标系 z 轴 *a1 atan2f(py, px); // 大腿角beta 是髋关节到足端的连线俯仰角 float beta atan2f(pz, r); float gamma acosf((L2 * L2 d * d - L3 * L3) / (2.0f * L2 * d)); *a2 beta gamma; // 小腿角利用余弦定理求膝关节夹角再取补角 float delta acosf((L2 * L2 L3 * L3 - d * d) / (2.0f * L2 * L3)); *a3 M_PI - delta; }代码里最关键的是d L2 L3这一层保护。六足机器人在运动过程中足端轨迹会经过多种位置如果目标点恰好在机械臂工作空间之外余弦定理的输入会大于 1acos 返回 NaN整条腿的舵机角度直接乱掉。加上饱和处理后超出部分会被强制拉到边界位置至少保证舵机不会突然跳到一个离谱的角度。beta gamma的含义需要多说一句beta 是从髋关节指向足端的直线方向gamma 是 L2 和这条直线的夹角两者相加才是大腿相对机身的实际角度。实际在 SolidWorks 里对照模型时你会发现六条腿的足端坐标并不完全对称左右腿的 py 符号相反前后腿的 px 也有偏移。写代码时把每一条腿的髋关节坐标先存成一个数组代入上面的函数逐腿计算即可。3.2 步态参数三角步态、波动步态和涟漪步态有了单腿的逆运动学机器人能不能走起来取决于六条腿按什么顺序抬脚落脚。六足机器人经典的步态可以按“同一时刻摆动腿的数量”来区分。支撑腿越多越稳但速度越慢。这张表可以直接对照源码里的步态配置参数步态类型同持摆动腿数稳定性速度典型用途三角步态3中等最快平整场地、足球比赛涟漪步态2较高中速草地、碎石波动步态1最高慢上下坡、狭窄通道三角步态把六条腿分成两组0、2、4 为一组1、3、5 为另一组。任意时刻一组抬起往前摆另一组撑在地面上推动身体前进交替往复。波动步态则是某一时刻只有一条腿抬起其余五条都支撑稳定裕度最高。源码里的 gait.c 通常会用一个相位数组区分这些步态修改相位偏移量就能切换。3.3 从步态相位到足端轨迹的实现下面的 Python 示例把三角步态写成最简单的参数化实现。它不依赖任何库重点是看懂“相位”两个字的含义import math # 六条腿分成两组偶数腿 A 组奇数腿 B 组 # 组内相位相同组间相差半个周期 PHASE_OFFSET [0.0, 0.5, 0.0, 0.5, 0.0, 0.5] def tripod_leg_offset(leg_id, t, period, step_len, step_h): t_phase (t / period) % 1.0 ph (t_phase PHASE_OFFSET[leg_id]) % 1.0 if ph 0.5: # 摆动相足端抬起并向前移动 k ph / 0.5 dx (k - 0.5) * step_len dz step_h * math.sin(math.pi * k) else: # 支撑相足端相对身体向后滑 k (ph - 0.5) / 0.5 dx (0.5 - k) * step_len dz 0.0 return dx, dzperiod是完整走一步的时间单位秒step_len是单步步幅毫米step_h是抬腿高度。摆动相的前半段足端从身后越过身体水平线后半段落到身前支撑相则反过来把身体向前推。dz用 sin 函数可以让抬腿动作在中间最高、落点平滑避免足端砸地板。你在源码里看到的 gait.c核心逻辑基本就是往这套相位框架里叠加具体的足端偏移量。周期太短会让舵机来不及到位周期太长机器人会显得一顿一顿调试时建议从 0.8 秒每步起步。4. 源码到舵机输出嵌入式主控里的角度换算与节奏控制4.1 舵机角度和脉宽映射角度是逻辑量脉宽是物理量运动学算出来的是弧度舵机不认识弧度它只认 PWM 脉宽。绝大多数模拟舵机工作在 500 到 2500 微秒的脉宽区间中值是 1500 微秒对应 0 度。也就是说角度到脉宽是一个很简单的线性换算uint16_t angle_to_pwm(float rad) { float deg rad * 57.2958f; if (deg -90.0f) { deg -90.0f; } if (deg 90.0f) { deg 90.0f; } // 1500us 是中位1000us 对应正负 90 度全程 return (uint16_t)(1500.0f deg * (1000.0f / 90.0f)); }限幅放在这里而不是放在上层调用里是因为源码中可能存在多个模块同时驱动同一个舵机例如步态模块和底盘调平模块叠加角度。最高效的防护是在脉宽输出这一层统一做界限钳位防止某一路计算异常把舵机直接打到机械限位。如果舵机是数字舵机或串行总线舵机那这层函数可以换成串口指令封装但限幅逻辑一样保留。4.2 主控循环足端轨迹、逆运动学和输出三者同步主控板我用过 STM32 系列也用过 Arduino Mega两人的差异不大关键是主循环要固定节奏。下面的代码把步态、逆运动学和舵机输出串在了一起for (;;) { float t micros() / 1e6f; for (int leg 0; leg 6; leg) { float dx, dz; tripod_leg_offset(leg, t, GAIT_PERIOD, STEP_LEN, STEP_H, dx, dz); float px BODY_X_OFFSET dx; float py LEG_Y[leg]; // 各腿髋关节的横向坐标 float pz BODY_Z_OFFSET - dz; float a1, a2, a3; leg_ik(px, py, pz, a1, a2, a3); set_servo_pwm(leg * 3 0, angle_to_pwm(a1)); set_servo_pwm(leg * 3 1, angle_to_pwm(a2)); set_servo_pwm(leg * 3 2, angle_to_pwm(a3)); } delay(20); }每 20 毫秒跑一次全腿解算和输出也就是 50Hz 的控制频率。对步态周期 0.8 秒的配置一个周期里有 40 个控制点腿部轨迹足够平滑。变量LEG_Y[leg]存在数组里六条腿的横向位置不一样直接做坐标叠加BODY_X_OFFSET控制整机前进或后退BODY_Z_OFFSET控制机身高度。这个厚度顺序是固定的先算步态偏移再叠加机身偏移最后交给逆运动学。顺序不能换换了你就会发现机器人走起来前后腿互相打架。4.3 源码目录结构与定位思路拿到源码包前排看出目录结构这样可以快速定位问题文件。我见过的最清晰的六足源码包通常是这样的布局文件名职责划分kinematics.c逆运动学正解与反解杆长常量gait.c步态相位、足端轨迹生成servo.cPWM 或串口总线舵机驱动main.c主循环、系统初始化、参数组织config.h舵机方向、杆长、速度等全部配置集中映射找问题的时候路径是固定的腿不动先在 gait.c 里查相位角度乱跳在 kinematics.c 里看杆长常量个别舵机抽搐去 servo.c 里查脉宽映射以及检查供电。另外提一个很容易被忽略的点如果你的机身底部装了 ws2812 这类可寻址灯带注意灯效循环和步态循环必须共用一个时间基准否则动作和灯光各自按不同相位跑比赛时没法通过灯光判断机器人当前朝向。最简单做法是把灯效刷新函数放进上面那个 20ms 的循环里用同一个t变量驱动。4.4 上电时序与断电保护六足机器人自检流程写代码时留意三步初始化串口把全部舵机脉宽设到中位延时等舵机到位再做 IMU 零偏校准。如果一上电就直接执行第一步机器人可能先做一个夸张的跳跃动作原因是控制器启动时间比舵机慢舵机看到的是通信线上的随机电平。固定延时至少 1 秒以上再发第一帧位置指令这个坑基本就能避开。如果主控和舵机分离供电舵机电源要先于逻辑电源接通或者至少同时接通否则舵机处于自由转动状态时可能反驱主控板导致复位循环。5. 校准与排错足端坐标、杆长参数和异常步态5.1 零位校准让模型角度和物理角度对齐固件里所有角度都以舵机中位为零点但装配误差使得物理零位和模型零位不可能完全一致。校准过程就是把这个差值补偿进每一条腿。第一步把所有舵机都输出到 0 度脉宽也就是 1500 微秒。第二步把每条腿的基节旋转到垂直方向大腿水平小腿竖直这是多数源码定义的“站立姿态”。第三步记下每条腿三个舵机的偏差角写进 config.h 里的 SERVO_TRIM 数组。这个数组通常是一个 6x3 的二维常量主循环在leg_ik计算出角度后直接把对应偏差加上去。5.2 参数调整矩阵步幅、抬腿高度和机身高度调试参数时不能一个个乱试应按下面这个表梳理顺序参数名作用调整建议GAIT_PERIOD步态周期从 0.8s 起步走顺后逐减STEP_LEN单步步幅从 20mm 起步过大容易打滑STEP_H抬腿高度地面不平时加高到 25mmBODY_Z_OFFSET机身离地高度降低一档改善稳定性SERVO_TRIM舵机零位偏差每次机械改动后都要重新标STEP_LEN 和 GAIT_PERIOD 的比值是足端平均速度。比值超过舵机空载角速度后腿会在摆动相出现拖地表现就是机器人走得歪歪扭扭。所以调高步幅之前先确认舵机相峰值够不够而不是一味加步幅。5.3 异常步态排查表现象最可能原因排查方向前进方向偏左或偏右左右腿舵机安装方向不一致检查 config.h 里方向取反配置某条腿周期性拖地抬腿高度不够或杆长参数错误先加 STEP_H再核对模型杆长六条腿互相干涉足端初始坐标与源码不一致回到装配体重新测量髋坐标全部腿抖动舵机供电不足或 PWM 更新频率不稳稳压电源单独给舵机供电关节角度跳变 舵机啸叫目标超出工作空间IK 饱和失效限制足端轨迹工作在可达范围内杆长参数和实际模型不一致是最隐蔽的问题。比如你们在 SolidWorks 里把胫节加长了 10mm但 kinematics.c 里的 L3 还是原来的数值机器人会整体变矮步态错乱。碰到这种情况从模型装配体里量出实际杆长改 config.h再用第 3 章的 leg_ik 代码单独跑一次单元测试验证输入坐标后输出角度有没有明显突变。6. 从行走扩展到足球射门目标识别与动作切换6.1 加一个颜色识别模块把目标坐标还给主控六足球型机器人参加足球比赛视觉和步态缺一不可。最简单的方案是装一个开源视觉模块例如 OpenMV 或 Pico让它做颜色块识别把球的位置偏差通过串口发给主控板。下面这段代码是 OpenMV 端的核心逻辑import sensor, image, time, ustruct sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QQVGA) sensor.skip_frames(time100) # 以绿色足球为例阈值按实际场地灯光微调 THRESHOLD (30, 80, -60, -10, 0, 40) while True: img sensor.snapshot() blobs img.find_blobs([THRESHOLD], pixels_threshold80) if blobs: dx blobs[0].cx() - img.width() // 2 data ustruct.pack(bh, 0xAB, dx) uart.write(data) time.sleep_ms(20)find_blobs返回满足颜色阈值的目标blobs[0].cx()是目标中心的横坐标。dx 的符号说明球偏向相机视野左侧还是右侧主控收到后把它转成偏航修正量叠加到两侧腿的步长差里不用真去改运动学代码。如果球不在视野里就让机器人执行小幅旋转搜索动作直到再次检测到目标。这里要提醒一点阈值要在实际比赛场地灯光下重新采一次固定色块阈值在室内和室外是完全不同的数值。6.2 射门动作与行走动作的平滑切换行走和射门本质上是两套不同的足端轨迹。行走时足端落在身体正下方附近射门时其中一个前腿要把足端甩到身体前方一个较大的范围直接切换会造成腿部速度陡变。我处理这类动作切换时会准备一个动作混合系数 k从 0 到 1 插值过渡时间取 0.2 秒左右。射门动作可以理解成是一次大幅度的摆动相把 STEP_LEN 临时增大到平时的 3 倍并把抬腿高度压到最低让足尖以扫踢方式碰到球。踢完之后配合身体重心前移机器人会顺势往前跟进。6.3 把代码、模型和工程图放进同一个版本目录最后留一个我自己的习惯把 SW15 装配体、STEP 导出文件和源码仓库放在同一个版本管理目录下commit message 里写清楚本次改动的是机械还是控制。你会发现六足机器人调试到后期最贵的不是某一次设计而是反复定位“到底是模型没更新还是代码参数不对”。每次从模型里量杆长、改 config.h、重新导工程图三个动作必须同步提交。等到哪一天你要把这条六足从足球场景改造成地形探索或搬运场景这套机械加代码同步更新的历史记录会帮你省掉至少一到两周的重复排查时间。本文还有配套的精品资源点击获取
返回列表