【轮式移动机器人课程笔记 5】运动学仿真

L5 运动学仿真

  • 本节重点: 如何理解推导出的运动学模型
    • 回顾:机器人运动学模型
      • 正向(前向)运动学模型
      • 反向运动学模型
    • 基于MatLab运动学仿真
      • 本节重点,如何利用matlab对运动学进行仿真

5.1 回顾运动学模型

[x˙y˙ψ˙]=[u⋅cosψ−v⋅sinψu⋅sinψ+v⋅cosψr]=[cosψ−sinψ0sinψcosψ0001][uvr] \left[ \begin{matrix} \dot{x}\\ \dot{y}\\ \dot{\psi} \end{matrix} \right] =\left[ \begin{matrix} u\cdot cos\psi - v\cdot sin\psi\\ u\cdot sin\psi + v\cdot cos\psi\\ r \end{matrix} \right] = \left[ \begin{matrix} cos\psi & -sin\psi& 0\\ sin\psi & cos\psi& 0\\ 0 & 0 & 1 \end{matrix} \right]\left[ \begin{matrix} u\\ v\\ r \end{matrix} \right] x˙y˙ψ˙=ucosψvsinψusinψ+vcosψr=cosψsinψ0sinψcosψ0001uvr

  • 前向运动学模型

η˙=J(ψ)ξ \dot\eta = J(\psi)\xi η˙=J(ψ)ξ

  • 反向运动学模型

ξ=J−1(ψ)η˙ \xi = J^{-1}(\psi)\dot\eta ξ=J1(ψ)η˙

我们已知上述公式,给出初始位置,给出 (u,v,r)(u, v, r)(u,v,r) , 计算后续时刻的(x,y,ψ)(x, y, \psi)(x,y,ψ)

5.2 运动学模型 MatLab 仿真

以前向运动学模型为例,η˙=J(ψ)ξ\dot\eta = J(\psi)\xiη˙=J(ψ)ξ 。我们已知初始位置下的 η\etaη , 已知 ξ\xiξ ,计算后续时刻的 η\etaη 。 可以将其转化为常微分方程的求解问题,常微分方程求解方法之一为 欧拉法(Euler)。 本节将利用 欧拉法(Euler) 对机器人位置信息进行近似计算。首先简要介绍欧拉法:

  • Euler 法


注*:这里只介绍显示 Euler 法(未按照视频中进行整理)。

① 什么是解微分方程?

我们给出一个微分方程: y′=f(x,y)y' = f(x,y)y=f(x,y) 。一般的解法是根据给出的微分方程先获得
y=∫f(x,y)dx+a y = \int f(x,y) dx +a y=f(x,y)dx+a
上式为一般解(通解)。

若给出初始条件,即 y(x0)=y0y(x_0) = y_0y(x0)=y0, 则可获得微分方程的特殊解(特解)。

② 欧拉法解微分方程

在这里插入图片描述

欧拉法是利用直线近似来求解微分方程。

上图中,因 xxx 是时间 ttt 上的函数,x′(t)x'(t)x(t) 已知。

在图中曲线上对 tttt+1t+1t+1 时刻进行采样,分别为 xix_ixixi+1x_{i+1}xi+1ti+1−ti=δtt_{i+1}-t_i = \delta_tti+1ti=δt(此为步长,即取值或采样的间隔是固定的,均为δt\delta_tδt)。

欧拉法的思想是将ti、ti+1t_i 、t_{i+1}titi+1 区间的线段看作直线,并利用此段的斜率来近似原微分方程中tit_iti处的导数,用公式表示为:
x′(i)≈xi+1−xiti+1−ti=xi+1−xiδt则:xi+1−xi=x′(i)δtxi+1=xi+x′(i)δt x'(i) \approx \frac{x_{i+1}-x_i}{t_{i+1}-t_i} = \frac{x_{i+1}-x_i}{\delta_t} \\ 则: x_{i+1} - x_i = x'(i)\delta_t\\ x_{i+1} = x_i+x'(i)\delta_t x(i)ti+1tixi+1xi=δtxi+1xi则:xi+1xi=x(i)δtxi+1=xi+x(i)δt
上式中, xi+1=xi+x′(i)δtx_{i+1} = x_i+x'(i)\delta_txi+1=xi+x(i)δt 即为欧拉公式(这里要给出初始条件,即 x(t0)=x0x(t_0) = x_0x(t0)=x0 ),利用迭代可计算 xt+1x_{t+1}xt+1 的值。

  • 利用Euler法对运动学模型进行仿真
%% Kinematic simulation of a land-based mobile robot
clear all; clc; close all;

%% Simulation parameters
dt = 0.1; % Step size 步长
ts = 10; % Simulation time 模拟时间
t = 0:dt:ts;% Time span 时间从0开始,按步长0.1 变化到10

%% Initial conditions
x0 = 0; % x初始位置
y0 = 0; % y初始位置
psi0 = 0; %\psi的初始位置

eta0 = [x0;y0;psi0]; % 对应[x y \psi]

eta(:,1) = eta0 % 将eta0赋值给eta矩阵的第一列

%% Loop starts here
for i = 1:length(t)
    psi = eta(3,i); % current orientation in rad
    %fprintf("psi is %f\n", psi)
    %Jacobian matrix
    J_psi = [cos(psi),-sin(psi),0;
             sin(psi), cos(psi),0;
             0,0,1];
    u = 0.1; % x-axis velocity W.r.t B frame
    v = 0.05; % y-axis velocity W.r.t B frame
    r = 0.0;% angular velocity W.r.t B frame

    zeta(:,i)=[u;v;r];

    eta_dot(:,i) = J_psi * zeta(:,i);

    eta(:,i+1)=eta(:,i)+dt*eta_dot(:,i); %Euler method
end

%% Plotting functions
figure
plot(t, eta(1,1:i), 'r-');
set(gca, 'fontsize',24);
xlabel('t,[s]');
ylabel('x,[m]');

下图为 t=0t= 0t=0时,机器人位置 为 (0, 0, 0), 初始速度信息为 (0.1, 0.05, 0.1), t=10t=10t=10 内,机器人的位置变化。

在这里插入图片描述


本节完

### 使用 MATLAB 进行轮式机器人轨迹跟踪仿真的方法 对于希望利用 MATLAB 平台开展轮式机器人轨迹跟踪仿真实验的研究者而言,MATLAB 提供了一个理想的环境用于快速原型设计和测试控制算法。由于 MATLAB 的数值计算能力和丰富的工具箱支持,特别是 Robotics System Toolbox 和 Simulink 中提供的模块化组件,使得创建复杂的动态系统变得简单而高效。 #### 创建仿真环境 为了建立一个有效的仿真框架,首先应当定义机器人运动学模型。考虑到轮式移动平台的特点,通常采用差分驱动或全向轮配置下的非完整约束条件来描述车辆的动力学特性[^1]。 ```matlab % 初始化机器人对象并设定初始状态 robot = robotics.DifferentialDrive; initialPose = [0, 0, pi/2]; % 初始位姿[x,y,theta] setInitialPose(robot, initialPose); ``` #### 设定目标轨迹 接下来要指定期望的行驶路线作为控制器的目标输入。这里可以选择简单的圆弧线、八字形或其他任意形状曲线作为参考路径。 ```matlab % 定义一条圆形轨迹为例 radius = 5; % 圆半径 numPoints = 100; % 轨迹离散点数 angles = linspace(0, 2*pi, numPoints); referencePathX = radius * cos(angles); referencePathY = radius * sin(angles); figure(); plot(referencePathX, referencePathY,'r'); hold on; axis equal; title('Reference Path (Red)'); xlabel('X Position'); ylabel('Y Position'); grid minor; ``` #### 控制器设计与实现 针对所选类型的轮式机器人,应用合适的反馈控制策略至关重要。PID 控制因其易于理解和实施而在实践中被广泛采纳;而对于更复杂的情况,则可能涉及到自适应控制、模糊逻辑甚至基于学习的方法等高级技术。 ```matlab controller = pidtune(ss([0 1;-1 -1]), 'pid'); % 基于传递函数自动调参得到 PID 参数 feedbackController = feedback(controller, 1); for i=1:length(angles)-1 targetPosition = [referencePathX(i), referencePathY(i)]; % 计算当前误差并向量场投影获得速度指令 errorVector = targetPosition - getCurrentPosition(robot); desiredVelocity = projectToTangentSpace(errorVector, getOrientation(robot)); % 应用 PD 或 PID 控制律更新电机转速 setMotorSpeeds(robot, computeControlAction(desiredVelocity, previousError)); % 更新历史数据以便下次迭代使用 previousError = errorVector; pause(0.01); % 模拟时间步长延迟 end ``` 上述代码片段仅为示意性质,并未完全展示所有必要的辅助函数定义及其内部机制。实际部署时需依据具体应用场景补充完善相应细节处理逻辑[^4]。 #### 可视化结果 完成整个闭环控制系统搭建之后,可通过动画形式直观展现机器人沿预定轨道前进的过程,同时记录各时刻的状态变量变化情况以评估性能指标。 ```matlab % 动态绘制机器人当前位置标记 scatter(getCurrentPosition(robot)(1), getCurrentPosition(robot)(2),'b','filled'); drawnow limitrate; ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MJY二进制

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

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

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

打赏作者

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

抵扣说明:

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

余额充值