小车模型——双差速小车模型

双差速轮模型的运动学正解、逆解及动力学模型

双差速轮模型是一种常见的移动机器人配置,通过独立控制左右轮的转速实现运动和转向。以下是该模型的运动学正解、逆解和动力学模型的详细介绍。


1. 双差速轮模型的运动学正解

运动学正解 是指根据左右轮的角速度计算机器人的线速度和角速度。

1.1 定义变量
  • ( v L , v R ) ( v_L, v_R ) (vL,vR):左轮和右轮的线速度(单位:米/秒)。
  • ( ω L , ω R ) ( \omega_L, \omega_R ) (ωL,ωR):左轮和右轮的角速度(单位:弧度/秒)。
  • ( r ) ( r ) (r):车轮半径(单位:米)。
  • ( L ) ( L ) (L):左右轮之间的轴距(单位:米)。
  • ( v ) ( v ) (v):机器人的线速度(单位:米/秒)。
  • ( ω ) ( \omega ) (ω):机器人的角速度(单位:弧度/秒)。
1.2 计算公式

已知左右轮的角速度,可以计算机器人的线速度和角速度:

  • 线速度 ( v ) ( v ) (v)
    v = v L + v R 2 = r ( ω L + ω R ) 2 v = \frac{v_L + v_R}{2} = \frac{r (\omega_L + \omega_R)}{2} v=2vL+vR=2r(ωL+ωR)
  • 角速度 ( ω ) ( \omega ) (ω)
    ω = v R − v L L = r ( ω R − ω L ) L \omega = \frac{v_R - v_L}{L} = \frac{r (\omega_R - \omega_L)}{L} ω=LvRvL=Lr(ωRωL)

2. 双差速轮模型的运动学逆解

运动学逆解 是指根据机器人的期望线速度和角速度,计算左右轮的角速度。

2.1 定义变量
  • ( v ) ( v ) (v):期望的线速度(单位:米/秒)。
  • ( ω ) ( \omega ) (ω):期望的角速度(单位:弧度/秒)。
2.2 计算公式

根据期望的线速度和角速度,可以计算左右轮的线速度和角速度:

  • 左轮线速度 ( v L ) ( v_L ) (vL)
    v L = v − L ω 2 v_L = v - \frac{L \omega}{2} vL=v2Lω
  • 右轮线速度 ( v R ) ( v_R ) (vR)
    v R = v + L ω 2 v_R = v + \frac{L \omega}{2} vR=v+2Lω
  • 左轮角速度 ( ω L ) ( \omega_L ) (ωL)
    ω L = v L r \omega_L = \frac{v_L}{r} ωL=rvL
  • 右轮角速度 ( ω R ) ( \omega_R ) (ωR)
    ω R = v R r \omega_R = \frac{v_R}{r} ωR=rvR

3. 双差速轮模型的动力学模型

动力学模型 描述了机器人在给定控制输入下的加速度和角加速度。

3.1 定义变量
  • ( m ) ( m ) (m):机器人的质量(单位:千克)。
  • ( I ) ( I ) (I):机器人的转动惯量(单位:千克·米²)。
  • ( F drive ) ( F_{\text{drive}} ) (Fdrive):驱动力(单位:牛顿)。
  • ( T drive ) ( T_{\text{drive}} ) (Tdrive):驱动扭矩(单位:牛顿·米)。
3.2 动力学方程

动力学方程描述了机器人的加速度和角加速度:

  • 线加速度 ( a ) ( a ) (a)
    a = F drive m a = \frac{F_{\text{drive}}}{m} a=mFdrive
  • 角加速度 ( α ) ( \alpha ) (α)
    α = T drive I \alpha = \frac{T_{\text{drive}}}{I} α=ITdrive

4. 实现代码示例

以下是一个简单的 C++ 实现,展示了如何计算双差速轮模型的运动学正解和逆解:

#include <iostream>
#include <cmath>

const double PI = 3.14159265358979323846;

// AGV 参数
struct AGVParameters {
    double wheel_radius;  // 车轮半径(单位:米)
    double axle_length;   // 轴距(单位:米)
};

// AGV 状态
struct AGVState {
    double x;      // X 位置(单位:米)
    double y;      // Y 位置(单位:米)
    double theta;  // 朝向角(单位:弧度)
};

// 轮速
struct WheelSpeeds {
    double left;   // 左轮角速度(单位:弧度/秒)
    double right;  // 右轮角速度(单位:弧度/秒)
};

// 线速度和角速度
struct Velocity {
    double linear;      // 线速度(单位:米/秒)
    double angular;     // 角速度(单位:弧度/秒)
};

// 运动学正解:由轮速计算 AGV 速度
Velocity forwardKinematics(const WheelSpeeds& wheel_speeds, const AGVParameters& params) {
    double v_left = params.wheel_radius * wheel_speeds.left;
    double v_right = params.wheel_radius * wheel_speeds.right;

    Velocity vel;
    vel.linear = (v_left + v_right) / 2.0;
    vel.angular = (v_right - v_left) / params.axle_length;

    return vel;
}

// 运动学逆解:由 AGV 速度计算轮速
WheelSpeeds inverseKinematics(const Velocity& vel, const AGVParameters& params) {
    double v_left = vel.linear - (params.axle_length / 2.0) * vel.angular;
    double v_right = vel.linear + (params.axle_length / 2.0) * vel.angular;

    WheelSpeeds wheel_speeds;
    wheel_speeds.left = v_left / params.wheel_radius;
    wheel_speeds.right = v_right / params.wheel_radius;

    return wheel_speeds;
}

// 更新 AGV 的位姿
void updateAGVState(AGVState& state, const Velocity& vel, double delta_time) {
    state.x += vel.linear * cos(state.theta) * delta_time;
    state.y += vel.linear * sin(state.theta) * delta_time;
    state.theta += vel.angular * delta_time;

    if (state.theta > PI) {
        state.theta -= 2 * PI;
    } else if (state.theta < -PI) {
        state.theta += 2 * PI;
    }
}

int main() {
    AGVParameters params;
    params.wheel_radius = 0.1;   // 车轮半径为 0.1 米
    params.axle_length = 0.5;    // 轴距为 0.5 米

    AGVState state;
    state.x = 0.0;
    state.y = 0.0;
    state.theta = 0.0;

    double delta_time = 0.1;  // 时间步长为 0.1 秒

    Velocity desired_vel;
    desired_vel.linear = 1.0;     // 期望线速度 1.0 m/s
    desired_vel.angular = 0.5;    // 期望角速度 0.5 rad/s

    WheelSpeeds wheel_speeds = inverseKinematics(desired_vel, params);

    std::cout << "需要的左轮角速度: " << wheel_speeds.left << " rad/s" << std::endl;
    std::cout << "需要的右轮角速度: " << wheel_speeds.right << " rad/s" << std::endl;

    for (int i = 0; i < 50; ++i) {
        Velocity current_vel = forwardKinematics(wheel_speeds, params);
        updateAGVState(state, current_vel, delta_time);

        std::cout << "时间: " << (i + 1) * delta_time << " s, "
                  << "位置: (" << state.x << ", " << state.y << "), "
                  << "朝向: " << state.theta << " rad" << std::endl;
    }

    return 0;
}

5. 总结

双差速轮模型通过独立控制左右轮的转速,实现了机器人的运动和转向。运动学正解用于根据轮速计算机器人的运动状态,而逆解用于根据期望运动状态计算所需的轮速。动力学模型进一步描述了机器人在给定驱动力和驱动扭矩下的动态行为。这些模型为机器人的设计和控制提供了理论基础。

### 差速机器人运动学模型原理 差速轮式机器人的运动学模型描述了其如何通过左右轮的速度差异来实现平移和旋转运动。该模型的核心在于将全局坐标系下的线速度 \(v\) 和角速度 \(\omega\) 转化为左右轮的角速度 \(\dot{\theta}_L\) 和 \(\dot{\theta}_R\)。 #### 运动学方程推导 假设差速机器人具有以下参数: - 轴距 \(L\): 两轮之间的距离。 - 车轮半径 \(r\): 单个车轮的半径。 对于给定的线速度 \(v\) 和角速度 \(\omega\),可以通过以下公式计算左右轮的线速度: \[ v_L = v - \frac{L}{2} \cdot \omega \quad \text{(左轮线速度)} \] \[ v_R = v + \frac{L}{2} \cdot \omega \quad \text{(右轮线速度)} \] 进一步转化为左右轮的角速度(单位:rad/s),利用关系 \(v = r \cdot \dot{\theta}\),可得: \[ \dot{\theta}_L = \frac{v_L}{r} = \frac{v - \frac{L}{2} \cdot \omega}{r} \] \[ \dot{\theta}_R = \frac{v_R}{r} = \frac{v + \frac{L}{2} \cdot \omega}{r} \][^4] 这些公式构成了差速机器人运动学正解的基础。 --- ### 实现方法与代码示例 以下是基于上述公式的 C++ 代码示例,用于计算并发布左右轮的关节状态以及里程计信息。 ```cpp #include <ros/ros.h> #include <geometry_msgs/Twist.h> #include <nav_msgs/Odometry.h> // 参数定义 double wheel_radius = 0.1; // 车轮半径 (m) double axle_length = 0.5; // 轴距 (m) void cmdVelCallback(const geometry_msgs::Twist::ConstPtr& msg) { double linear_velocity = msg->linear.x; // 线速度 (m/s) double angular_velocity = msg->angular.z; // 角速度 (rad/s) // 计算左右轮线速度 double vl = linear_velocity - (axle_length / 2) * angular_velocity; double vr = linear_velocity + (axle_length / 2) * angular_velocity; // 将线速度转换为角速度 double theta_dot_left = vl / wheel_radius; double theta_dot_right = vr / wheel_radius; ROS_INFO("Left Wheel Angular Velocity: %f rad/s", theta_dot_left); ROS_INFO("Right Wheel Angular Velocity: %f rad/s", theta_dot_right); // TODO: 发布左右轮关节状态、里程计信息等... } int main(int argc, char **argv) { ros::init(argc, argv, "diff_drive_kinematics"); ros::NodeHandle nh; // 订阅 cmd_vel 主题 ros::Subscriber sub = nh.subscribe("/cmd_vel", 10, cmdVelCallback); ros::spin(); return 0; } ``` 此代码片段订阅 `/cmd_vel` 主题获取目标线速度和角速度,并根据运动学模型计算左右轮的角速度[^3]。 --- ### 注意事项 1. **速度限制**: 应确保计算得出的轮速不超过电机的最大能力。 2. **滑动影响**: 模型假设计轮子与地面之间无滑动,在实际应用中需考虑滑动误差。 3. **控制周期**: 合适的控制周期 (\(\Delta t\)) 对于平衡精度和性能至关重要。 4. **单位一致性**: 所有输入输出数据均需保持单位一致,例如米/秒 (m/s) 或弧度/秒 (rad/s)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.小墨迹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值