差速机器人的纯轨迹跟踪仿真(Matlab) |
您所在的位置:网站首页 › 左右轮的位置 › 差速机器人的纯轨迹跟踪仿真(Matlab) |
差速机器人的纯轨迹跟踪仿真(Matlab)
刚入门,有的地方不对,烦请大家指正。 目录 差速机器人的纯轨迹跟踪仿真(Matlab)1 差速机器人运动模型1.1 运动学分析建模1.2 差速机器人的运动状态方程 2 控制器设计:(pure pursuit)纯轨迹算法3程序源码(Matlab)3.1 分为几个步骤3.2 代码3.3 效果 1 差速机器人运动模型 1.1 运动学分析建模运动特性为两轮差速驱动,其底部后方两个同构驱动轮的转动为其提供动力,前方的随动轮起支撑作用并不推动其运动,如图1两轮差速驱动示意图所示。
在驱动轮与地面接触运动为纯滚动无滑动情况下,机器的运动学模型可以表示为: Pure pursuit方法的依据是使下图所示的单车模型以适当的轮转向δ运动,并恰好使机器人轮轴中心经过当前的路点。这样一来,我们就可以根据当前的路点以及单车几何模型计算去当前的期望的轮转向角δ。 我们有以下几何关系: 1、经纬度轨迹数据的导入与筛除 2、数据转化到笛卡尔坐标系和轨迹的平移及变换 3、轨迹跟踪算法 4、处理跟踪轨迹数据 3.2 代码 %筛除错误数据% new_GPCHC = []; a = 1; for i = 1:3431 if abs(m.GPCHC(i,13)-noproave_lon) time)&&(N~=qwe)) N = length(x_process); target_index = calc_target_current_distance(x,y,cx,cy); %计算控制量% ai = PIDcontrol(target_speed, v,Kp); di = pure_pursuit_control(x,y,yaw,v,cx,cy,target_index,k,Lfc,L,Lf); [x,y,yaw,v] = updatestate(x,y,yaw,v, ai, di,dt,L) time = time + dt; x_process = [x_process;x]; y_process = [y_process;y]; plot(cx,cy,'b',x,y,'r*') title('跟踪过程') drawnow hold on end f2 = figure(2) plot(x_goal,y_goal,'b',x_process,y_process,'r') title('跟踪路径') legend('预定轨迹','实际跟踪路径'); %筛选出距离最近的点% newx = zeros(qwe+1,1); newy = zeros(qwe+1,1); locat = 0; for p = 1:(qwe+1) Dis = zeros(3429,1); for q = 1:3429 Dis(q,1) = (x_goal(q,1)-x_process(p,1))^2 + (y_goal(q,1)-y_process(p,1))^2; end [~, locat]= min(Dis); newx(p,1) = x_goal(locat,1); newy(p,1) = y_goal(locat,1); end %处理数据,计算均方差% sum = 0; for i = 1:(qwe+1) sum = sum + sqrt((newx(i,1)-x_process(i,1))^2+(newy(i,1)*10-y_process(i,1)*10)^2); end ave = sum/(qwe+1); fprintf('轨迹跟踪的均方差为%f\n',ave); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%函数定义%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [x, y, yaw, v] = updatestate(x, y, yaw, v, a, delta,dt,L) %更新当前差速机器人状态% x = x + v * cos(yaw) * dt; y = y + v * sin(yaw) * dt; yaw = yaw + v / L * tan(delta) * dt; v = v + a * dt; end function [a] = PIDcontrol(target_v, current_v, Kp) a = Kp * (target_v - current_v); end function [delta] = pure_pursuit_control(x,y,yaw,v,cx,cy,index,k,Lfc,L,Lf) tx = cx(index); ty = cy(index); alpha = atan2((ty-y),(tx-x))-yaw; Lf = k * v + Lfc; delta = atan(2*L * sin(alpha)/Lf) ; end function [index] = calc_target_current_distance(x,y, cx,cy) N = length(cx); %计算目标横轴点的所有点数% Distance = zeros(N,1); %初始化距离矩阵% for i = 1:N Distance(i) = sqrt((cx(i)-x)^2 + (cy(i)-y)^2); %计算出每个目标点到当前点的距离% end [~, location]= min(Distance); index = location; index = index+1 ; end 3.3 效果
谢谢! |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |