⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stabilization_to_x_axis.m

📁 轮式移动机器人的镇定
💻 M
字号:
% -----------------------------------------------------
% stabilization_to_x_axis.m 机器人以不同的初始位姿镇定到x轴上
%
% -----------------------------------------------------


clear all;                              % 清除所有变量 全局变量,函数和MEX链接.
close all;                              % 关闭所有打开的图形窗口.

% 机器人几何参数
global L;                               % 定义了三个全局变量 L 表示机器人前后轮之间的距离  定义全局变量,其它函数以及工作空间该全局变量都可见
global d;                               % d用来表示机器人两个后轮之间的距离,在其它函数和工作空间中都可见
L = 0.9;%0.6;%0.25;                   % 机器人长度(单位:米)
d = 0.75;%0.5;%0.18;                     % 机器人宽度(单位:米)

st_max_deg = 20;                        % 机器人前轮最大驱动角(单位:度)
v_max = 3.4907;                            % 机器人最大的线速度,即前进的速度(单位:米/秒)                 控制输入的限制值
st_max_rad = deg2rad(st_max_deg);       % 机器人最大驱动角度(单位:弧度)函数deg2rad把角度值转换为弧度值  控制输入的限制值

% 仿真时间参数
t_max = 7;                            % 仿真时间(单位:秒)
n = 700;                                % 循环次数
dt = t_max/n;                           % 每次循环的时间增量(单位:秒)
t = [0:dt:t_max];                       % 时间矢量(包括n+1个元素)


% 机器人的初始状态矢量(这个矢量可以由用户自己设置)
x0 = 0;%0;                              % 移动机器人初始x坐标(单位:米)
y0 = 1.5;%1;                              % 移动机器人初始y坐标(单位:米)
th_deg0 = -135:45:180;%135;%135;%0;        % 移动机器人初始方位角度,轴线相对于坐标系x轴角度值(单位:度)
%th_rad0 = deg2rad(th_deg0);            % 机器人初始方位角度(单位:弧度)

% 机器人控制器参数
k1=1;%2;
k2=25;%115;%15;
%k3=2;


fig1 = figure(1);                       % 建立第一个图
axis([-10 10 -5 10]);                % 设定图形的范围,分别是左、右、下、上
grid;
hold on;


for i = 1:8 % 间隔45度进行循环
    if x0==0                            % 判断分母是否为0
        x0_denominator=eps;
    else
        x0_denominator=x0;
    end
    alpa=atan(y0/x0_denominator);
    th_rad0(i) = deg2rad(th_deg0(i));
    if cos(alpa-th_rad0(i))>0           % 确定初始线速度方向
        v0=-v_max;
    else
        v0=v_max;
    end

    if th_rad0(i) == 0 % 判断机器人初始方位是否为0
        th_rad0(i) = eps;
    end
    st_rad0 = atan(-L/v0*(k2*th_rad0(i)+k1*v0*(sin(th_rad0(i))/th_rad0(i))*y0));               % 机器人初始驱动角(单位:弧度)
    if abs(st_rad0) > st_max_rad
        st_rad0 = sign(st_rad0)*st_max_rad;
    end

    z0 = [x0, y0, th_rad0(i)];          % 机器人初始状态向量(横坐标、纵坐标、方位角度)
    u0 = [v0, st_rad0];                 % 机器人初始控制输入向量(线速度、驱动角度)
    

    %------------------------------------------------------------------------------------------------------
    z1 = z0;                            % Set initial state to z1 for simulation

    % 开始仿真
    for j = 1:n+1
        if j == 1 % 特别处理i=1时的情况
            v(j)=v0;
            if z1(3)== 0
                z1(3)=eps;
            end
            st_rad(j)=atan(-L/v(j)*(k2*z1(3)+k1*v(j)*(sin(z1(3))/z1(3))*z1(2)));
            if abs(st_rad(j))>st_max_rad   % 机器人驱动角度超过限定
                st_rad(j)=sign(st_rad(j))*st_max_rad;
            end
        else % i不等于1时的情况
            v(j)=v(j-1);
            st_rad(j)=atan(-L/v(j)*(k2*z1(3)+k1*v(j)*(sin(z1(3))/z1(3))*z1(2)));
            if abs(st_rad(j))>st_max_rad   % 机器人驱动角度超过限定
                st_rad(j)=sign(st_rad(j))*st_max_rad;
            end
        end
        u = [v(j), st_rad(j)];            % 设置控制输入,线速度和驱动角度
        zdot = robot_model(z1, u);        % 用机器人模型获得z的导数,机器人状态矢量、控制矢量
        z2 = z1 + zdot * dt;              % 更新机器人状态
        z1 = z2;                          % 用z2代替z1
      
        %--------------------------------------
        x(j)=z1(1);
        y(j)=z1(2);
        theta(j)=z1(3);
        %--------------------------------------
    end
    
    %-------------------------------------------------------------------------------------------
    figure(1);
    if i==1
        plot(x,y,'-c');
    elseif i==2
        plot(x,y,':r');
    elseif i==3
        plot(x,y,'-.g');
    elseif i==4
        plot(x,y,'--b');
    elseif i==5
        plot(x,y,'-k');
    elseif i==6
        plot(x,y,'-y');
    elseif i==7
        plot(x,y,':m');
    else 
        plot(x,y,'-.r');
    end
                
    %plot(x,y,);
    figure(i+1);
    plot(t,v);
    pause(1.5);
end    
    

% % 画速度和驱动角度矢量
% fig2 = figure(2);                     % 画图形2  第二个图形的句柄保存在变量fig2中
% subplot(2,1,1);                       % 图形2的上半部分
% plot(t, v);                           % 画速度-时间曲线
% xlabel('Time [s]');                   % 给x轴标注
% ylabel('Velocity [m/s]');             % 给y轴标注
% grid;
% 
% subplot(2,1,2);                       % 图形2的下半部分
% std = rad2deg(st_rad);                % 弧度值转换为角度值,并保存在矢量std中
% plot(t,std);                          % 画驱动角度-时间曲线
% xlabel('Time [s]');                   % 给x轴标注
% ylabel('Steering angle [deg]');       % 给y轴标注
% grid;
% 
% 
% %用线括起来的是自己加的部分
% %-----------------------------------------
% fig3=figure(3);
% plot(t,x,'r');
% hold on;
% plot(t,y,'b');
% plot(t,theta,'k');
% grid
% %-----------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -