Wheel-Legged Robot Research and Development
轮足机器人研究与开发
概述
轮足机器人(Wheel-Legged Robot)是一种结合了轮式移动和足式移动优势的混合移动机器人。这种设计能够在平坦地面上实现高效的轮式移动,同时在复杂地形中利用腿部机构进行越障和适应性移动。
技术特点
1. 混合移动机制
- 轮式模式: 在平坦地面上高效移动,速度快、能耗低
- 足式模式: 在复杂地形中进行精确控制和越障
- 混合模式: 同时利用轮子和腿部进行协调运动
2. 关键技术挑战
- 模式切换控制: 在不同移动模式间平滑切换
- 地形感知: 实时识别地面条件并选择最优移动策略
- 动力学建模: 复杂的多体动力学系统建模
- 稳定性控制: 保证在各种工况下的稳定性
控制算法实现
1. 主控制循环详解(完整版本)
这是轮足机器人的完整控制系统,集成了IMU姿态反馈、无刷电机控制和腿部运动控制:
void loop() {
// 1. 获取传感器数据
BLDCData = motors.getBLDCData(); // 读取电机数据(速度、位置等)
getMPUValue(); // 读取IMU数据(姿态角、角速度)
getRCValue(); // 读取遥控器数据
// 2. 遥控器指令映射
robotMotion.turn = map(RCValue[0], RCCHANNEL_MIN, RCCHANNEL_MAX, -5, 5); // 转向指令
targetSpeed = map(RCValue[1], RCCHANNEL_MIN, RCCHANNEL_MAX, -20, 20); // 速度指令
Y_demand = map(RCValue[2], RCCHANNEL3_MIN, RCCHANNEL3_MAX, lowest, highest); // 高度指令
Phi = map(RCValue[3], RCCHANNEL_MIN, RCCHANNEL_MAX, -1*rollLimit, rollLimit); // 滚转角指令
// 3. 轮子平衡控制(核心算法)
float speedAvg = (M0Dir*BLDCData.M0_Vel + M1Dir*BLDCData.M1_Vel)/2; // 计算平均速度
float targetAngle = PID_VEL(targetSpeed - speedAvg); // 速度PID控制
float turnTorque = turnKp * (robotMotion.turn-robotPose.GyroZ); // 转向力矩控制
float torque1 = kp1*(targetAngle - robotPose.pitch) + turnTorque; // 左轮力矩
float torque2 = kp1*(targetAngle - robotPose.pitch) - turnTorque; // 右轮力矩
motors.setTargets(M0Dir*torque1, M1Dir*torque2); // 设置电机目标力矩
// 4. 腿部姿态控制
X = 0; // X坐标固定为0
Y = Y + Kp_Y * (Y_demand - Y); // 高度渐进控制
uint16_t Remoter_Input = Y; // 当前高度
float E_H = (L/2) * sin(Phi*(PI/180)); // 手动滚转补偿
stab_roll = stab_roll + Kp_roll * (0 - robotPose.roll); // 自动滚转稳定PID
float L_Height = Remoter_Input + stab_roll; // 左腿高度(自动稳定)
float R_Height = Remoter_Input - stab_roll; // 右腿高度(自动稳定)
// 5. 逆运动学求解
IKParam.XLeft = X; IKParam.XRight = X;
IKParam.YLeft = L_Height; IKParam.YRight = R_Height;
inverseKinematics(); // 执行逆运动学计算
}
控制系统架构分析:
1. 多传感器融合
- IMU数据: 实时姿态角(pitch, roll, yaw)和角速度
- 编码器数据: 轮子转速反馈
- 遥控器数据: 人工指令输入
2. 分层控制策略
- 上层: 运动规划和模式切换
- 中层: 平衡控制和姿态稳定
- 下层: 关节角度控制和电机驱动
3. 双重平衡机制
- 轮子平衡: 通过调节轮子力矩保持前后平衡
- 腿部平衡: 通过调节腿长保持左右平衡
2. 逆运动学算法详解
逆运动学是将期望的足端位置转换为关节角度的核心算法:
数学模型基础:
// 连杆参数定义(在bipedal_data.h中)
L1, L2, L3, L4, L5 // 五段连杆长度
求解过程详解:
步骤1:建立几何约束方程
// 左腿约束方程系数
float aLeft = 2 * IKParam.XLeft * L1;
float bLeft = 2 * IKParam.YLeft * L1;
float cLeft = IKParam.XLeft² + IKParam.YLeft² + L1² - L2²;
float dLeft = 2 * L4 * (IKParam.XLeft - L5);
float eLeft = 2 * L4 * IKParam.YLeft;
float fLeft = (IKParam.XLeft - L5)² + L4² + IKParam.YLeft² - L3²;
步骤2:使用反正切函数求解关节角
// 求解α角的两个可能解
alpha1 = 2 * atan((bLeft + sqrt(aLeft² + bLeft² - cLeft²)) / (aLeft + cLeft));
alpha2 = 2 * atan((bLeft - sqrt(aLeft² + bLeft² - cLeft²)) / (aLeft + cLeft));
// 求解β角的两个可能解
beta1 = 2 * atan((eLeft + sqrt(dLeft² + eLeft² - fLeft²)) / (dLeft + fLeft));
beta2 = 2 * atan((eLeft - sqrt(dLeft² + eLeft² - fLeft²)) / (dLeft + fLeft));
步骤3:角度解的筛选与验证
// 角度标准化到[0, 2π]
alpha1 = (alpha1 >= 0) ? alpha1 : (alpha1 + 2 * PI);
alpha2 = (alpha2 >= 0) ? alpha2 : (alpha2 + 2 * PI);
// 根据物理约束选择合适解
if(alpha1 >= PI/4) IKParam.alphaLeft = alpha1;
else IKParam.alphaLeft = alpha2;
if(beta1 >= 0 && beta1 <= PI/4) IKParam.betaLeft = beta1;
else IKParam.betaLeft = beta2;
步骤4:坐标系转换与舵机映射
// 弧度转角度
alphaLeftToAngle = (int)((IKParam.alphaLeft / 6.28) * 360);
betaLeftToAngle = (int)((IKParam.betaLeft / 6.28) * 360);
// 考虑机械结构的舵机角度映射
servoLeftFront = 90 + betaLeftToAngle; // 左前关节
servoLeftRear = 90 + alphaLeftToAngle; // 左后关节
servoRightFront = 270 - betaRightToAngle; // 右前关节(镜像)
servoRightRear = 270 - alphaRightToAngle; // 右后关节(镜像)
算法特点:
- 双解处理: 每个关节角都有两个数学解,需要根据物理约束选择
- 镜像对称: 左右腿采用镜像映射,简化控制逻辑
- 角度约束: 通过范围检查确保关节角在可达工作空间内
- 实时计算: 算法复杂度低,适合实时控制应用
3. 平衡控制策略
轮式平衡控制:
// 倒立摆平衡原理
float targetAngle = PID_VEL(targetSpeed - speedAvg); // 速度环
float torque = kp1 * (targetAngle - robotPose.pitch); // 角度环
腿部姿态稳定:
// 自适应滚转补偿
stab_roll = stab_roll + Kp_roll * (0 - robotPose.roll);
这种设计实现了轮足机器人的核心功能:在轮式高速移动的同时保持姿态稳定。
相关资源
本文档整理了轮足机器人的核心技术、应用现状和发展趋势,为相关研究提供参考。
Last updated: January 2025