拷贝到matlab的m文件运行
dc = 0.00005; %定义右后轮(主动轮)滚动的节点间距(米),即积分步长5个丝
A = 0.160; %定义前轮轴与后动轮轴的距离(米)
ey = 0.050 ; %定义前轮与右后轮偏距(米)
ez = 0.130 ; %定义前轮与左后轮偏距(米)
%各段拐角曲线的节点数
N1 = round(1.9/dc);
N2 = round(0.55/dc);
N3 = round(1.6/dc);
N4 = round(1/dc);
N5 = round(0.6/dc);
N6 = round(0.5/dc);
N7 = round(1.5/dc);
N8 = round(0.5/dc);
N9 = round(0.5/dc);
N10 = round(0.5/dc);
N11 = round(0.5/dc);
N12 = round(0.5/dc);
N13 = round(1.1/dc);
N14 = round(0.5/dc);
N15 = round(1.5/dc);
N = N1+N2+N3+N4+N5+N6+N7+N8+N9+N10+N11+N12+N13+N14+N15;%总节点数N
%构造N1段的前轮拐角曲线余弦函数
a = -5.35/180*pi; %该段前轮拐角的起始角度,并把角度转换为弧度
b = (6/180*pi-a)/2;%该段前轮拐角的终止角度,并把角度转换为弧度
t = pi/(N1):pi/(N1):pi;
st1 = a -b*cos(t)+b;
%构造N2段的前轮拐角曲线余弦函数
c = (4.7/180*pi-st1(N1))/2;
t = pi/(N2):pi/(N2):pi;
st2 = a + 2*b -c*cos(t)+c;
%构造N3段的前轮拐角曲线余弦函数
d = (-2/180*pi-st2(N2-1))/2;
t = pi/(N3):pi/(N3):pi;
st3 = a + 2*b+2*c -d*cos(t)+d;
%构造N4段的前轮拐角曲线余弦函数
e = (-25/180*pi-st3(N3-1))/2;
t = pi/(N4):pi/(N4):pi;
st4 = a + 2*b+2*c+2*d-e*cos(t)+e;
%构造N5段的前轮拐角曲线余弦函数
f = (10/180*pi-st4(N4-1))/2;
t = pi/(N5):pi/(N5):pi;
st5 = a + 2*b+2*c+2*d+2*e-f*cos(t)+f;
%构造N6段的前轮拐角曲线余弦函数
g = (23/180*pi-st5(N5-1))/2;
t = pi/(N6):pi/(N6):pi;
st6 = a + 2*b+2*c+2*d+2*e+2*f-g*cos(t)+g;
%构造N7段的前轮拐角曲线余弦函数
h = (-2/180*pi-st6(N6-1))/2;
t = pi/(N7):pi/(N7):pi;
st7 = a + 2*b+2*c+2*d+2*e+2*f+2*g-h*cos(t)+h;
%构造N8段的前轮拐角曲线余弦函数
j = (-20/180*pi-st7(N7-1))/2;
t = pi/(N8):pi/(N8):pi;
st8 = a + 2*b+2*c+2*d+2*e+2*f+2*g+2*h-j*cos(t)+j;
%构造N9段的前轮拐角曲线余弦函数
k = (20/180*pi-st8(N8-1))/2;
t = pi/(N9):pi/(N9):pi;
st9 = a + 2*b+2*c+2*d+2*e+2*f+2*g+2*h+2*j-k*cos(t)+k;
%构造N10段的前轮拐角曲线余弦函数
m = (8/180*pi-st9(N9-1))/2;
t = pi/(N10):pi/(N10):pi;
st10 = a + 2*b+2*c+2*d+2*e+2*f+2*g+2*h+2*j+2*k-m*cos(t)+m;
%构造N11段的前轮拐角曲线余弦函数
n = (0/180*pi-st10(N10-1))/2;
t = pi/(N11):pi/(N11):pi;
st11 = a + 2*b+2*c+2*d+2*e+2*f+2*g+2*h+2*j+2*k+2*m-n*cos(t)+n;
%构造N12段的前轮拐角曲线余弦函数
q = (-9/180*pi-st11(N11-1))/2;
t = pi/(N12):pi/(N12):pi;
st12 = a + 2*b+2*c+2*d+2*e+2*f+2*g+2*h+2*j+2*k+2*m+2*n-q*cos(t)+q;
%构造N13段的前轮拐角曲线余弦函数
r = (12/180*pi-st12(N12-1))/2;
t = pi/(N13):pi/(N13):pi;
st13 = a + 2*b+2*c+2*d+2*e+2*f+2*g+2*h+2*j+2*k+2*m+2*n+2*q-r*cos(t)+r;
%构造N14段的前轮拐角曲线余弦函数
s = (2/180*pi-st13(N13-1))/2;
t = pi/(N14):pi/(N14):pi;
st14 = a + 2*b+2*c+2*d+2*e+2*f+2*g+2*h+2*j+2*k+2*m+2*n+2*q+2*r-s*cos(t)+s;
%构造N15段的前轮拐角曲线余弦函数
u = (5/180*pi-st14(N14-1))/2;
t = pi/(N15):pi/(N15):pi;
st15 = a + 2*b+2*c+2*d+2*e+2*f+2*g+2*h+2*j+2*k+2*m+2*n+2*q+2*r+2*s-u*cos(t)+u;
%整合前轮拐角曲线
sita= [st1 st2 st3 st4 st5 st6 st7 st8 st9 st10 st11 st12 st13 st14 st15] ;
%画出前轮拐角曲线
qx = zeros(1,(N));
for i = 1:(N) %画出前轮转角曲线,定义横坐标qx
qx(i) = i*dc;%计算横坐标qx
end
figure(1);
plot(qx,sita*180/pi);hold on;
%先计算各轮子的前进步距
Ro = abs(A./tan(sita));%求后轮轴点o的拐弯半径Ro
p = -tan(sita)./A; %求后轮轴点o的曲率p,定义左拐曲率p为正,右拐p为负
Ry = Ro+ey.*p./abs(p); %求右后轮的拐弯半径Ry
ly = 2*Ry.*sin(dc./(2*Ry)); %下一步右后轮前进的步距
lo = ly./(1+p*ey); %下一步o点经过的步距
lz = ly.*(1-p*ez)./(1+p*ey); %下一步左后轮前进的步距
lq = lo./cos(sita); %下一步前轮前进的步距
%计算小车轨迹,先计算各轮子的起点坐标
ox=5.888; %后轮轴点o起始出发点x坐标
oy=0.753;%后轮轴点o起始出发点y坐标
xz=zeros(1, N+1); yz=zeros(1,N+1); %定义左后轮各节点坐标,并清零
xz(1)=ox; yz(1)=oy-ez; %左后轮起始出发点位置
xy=zeros(1, N+1); yy=zeros(1,N+1); %定义右后轮各节点坐标,并清零
xy(1)=ox; yy(1)=oy+ey; %右后轮起始出发点位置
xq=zeros(1,N+1); yq=zeros(1,N+1); %定义前轮各节点坐标,并清零
xq(1)=ox-A; yq(1)=oy; %前轮起始出发点位置
dip = zeros(1,(N)+1); %定义后轮轴点o圆心角,即车身倾角各节点坐标
dip(1) =0; %车身倾角起始为0,即小车沿X轴方向水平放置
%积分计算三个车轮各自的前进坐标
for i =1:(N)
dip(i+1) = dip(i) + lo(i)*p(i);
xz(i+1) = xz(i) - lz(i)*cos(dip(i+1));
yz(i+1) = yz(i) - lz(i)*sin(dip(i+1));
xy(i+1) = xy(i) - ly(i)*cos(dip(i+1));
yy(i+1) = yy(i) - ly(i)*sin(dip(i+1));
xq(i+1) = xq(i) - lq(i)*cos(dip(i+1)-sita(i));
yq(i+1) = yq(i) - lq(i)*sin(dip(i+1)-sita(i));
end
figure(2);
plot(xq,yq);axis equal;hold on; %画出前轮轨迹
plot(xz,yz);axis equal;hold on; %画出左后轮轨迹
plot(xy,yy);axis equal;hold on; %画出右后轮轨迹
% 画出竞赛场地
rectangle('Position',[0,0,6,6]),axis equal % 画出地图的长宽6米·6米
rectangle('Position',[5.573,0.698,0.030,0.030],'Curvature',[1,1],'EdgeColor','r'),axis equal%瑞金 5588 713 <初赛>
rectangle('Position',[4.448,0.360,0.030,0.030],'Curvature',[1,1],'EdgeColor','r'),axis equal%突破第三道封锁线 4463 375 <初赛>
rectangle('Position',[2.910,0.810,0.030,0.030],'Curvature',[1,1],'EdgeColor','r'),axis equal%血战湘江 2925 825 <初赛>
rectangle('Position',[2.348,1.185,0.030,0.030],'Curvature',[1,1],'EdgeColor','g'),axis equal%强渡乌江 2363 1200
rectangle('Position',[2.160,1.485,0.030,0.030],'Curvature',[1,1],'EdgeColor','r'),axis equal%占领遵义 2175 1500 <初赛>
rectangle('Position',[1.785,2.010,0.030,0.030],'Curvature',[1,1],'EdgeColor','g'),axis equal%四渡赤水 1800 2025
rectangle('Position',[0.560,0.773,0.030,0.030],'Curvature',[1,1],'EdgeColor','r'),axis equal%巧渡金沙江 375 788 <初赛>
rectangle('Position',[0.435,2.198,0.030,0.030],'Curvature',[1,1],'EdgeColor','g'),axis equal%强渡大渡河 450 2213
rectangle('Position',[0.585,2.545,0.030,0.030],'Curvature',[1,1],'EdgeColor','r'),axis equal%飞夺泸定桥 600 2550 <初赛>
rectangle('Position',[0.360,2.723,0.030,0.030],'Curvature',[1,1],'EdgeColor','r'),axis equal%爬雪山 375 2738 <初赛>
rectangle('Position',[0.510,3.210,0.030,0.030],'Curvature',[1,1],'EdgeColor','g'),axis equal%懋功会师 525 3225
rectangle('Position',[0.885,3.923,0.030,0.030],'Curvature',[1,1],'EdgeColor','r'),axis equal%过草地 900 3938 <初赛>
rectangle('Position',[1.260,4.485,0.030,0.030],'Curvature',[1,1],'EdgeColor','g'),axis equal%激战腊子口 1275 4500
rectangle('Position',[1.710,5.235,0.030,0.030],'Curvature',[1,1],'EdgeColor','r'),axis equal%会宁大会师 1725 5250 <初赛>
rectangle('Position',[2.798,5.610,0.030,0.030],'Curvature',[1,1],'EdgeColor','g'),axis equal%吴起镇会议 2813 5625
rectangle('Position',[3.173,5.610,0.030,0.030],'Curvature',[1,1],'EdgeColor','r'),axis equal%延安 3188 5625 <初赛>
hold on;
L1 = 0.033; %前轮到凸轮左沿距离(米)
L0 = 0.003; %凸轮厚度(米)
L2 = L1 - L0; %前轮到凸轮右沿距离(米)
R0 = 0.065; %凸轮基圆半径(米)
da = 0.005; %摇杆直径(米)
%计算理论凸轮升程
s = zeros(1,N); %凸轮升程计算值
for i = 1 : N
if p(i)<=0 %右转
s(i) = L2.*tan(sita(i)); %凸轮升程外凸,为正值
else %左转
s(i) = L1.*tan(sita(i)); %凸轮升程内凹,为负值
end
end
S = R0 + s; %凸轮推程

%凸轮转角
alpha = zeros(1,N);
for i = 1 : N
alpha(i) = 2*pi*i/N;
end
% 绘制理论凸轮
figure(3);
polar(alpha,S);hold on %用极坐标绘制理论凸轮
[x,y]=pol2cart(alpha,S); %把极坐标的理论凸轮点转为笛卡尔坐标点
% 计算实际凸轮
tN=200; %从包络椭圆上取200个点
ra=da/2; %计算摇杆半径
tx=zeros(length(alpha),tN);ty=tx; %清零包络椭圆上取点的坐标
for i=1:length(alpha)
zhoua=ra/cos(sita(i)); %求包络椭圆上最长轴
talpha=alpha(i)-pi/2:-pi/tN:alpha(i)-1.5*pi+pi/tN;%在包络椭圆的一半上取点的半径长的倾角
trho=sqrt(zhoua^2*cos(talpha).^2+ra^2*sin(talpha).^2);%求包络椭圆上取点的半径长
tx(i,:)=x(i)+trho.*cos(talpha);%包络椭圆上取点的横坐标
ty(i,:)=y(i)+trho.*sin(talpha);%包络椭圆上取点的纵坐标
end
newN=3600; %重新设置包络后凸轮得节点个数,即每等分0.1度
newalpha=-pi:2*pi/newN:pi-2*pi/newN;
[st,sr]=cart2pol(tx,ty); % 把笛卡尔坐标点转为极坐点
st=st+pi;
nstulun=ones(1,newN);
dtulun=2*pi/newN;%重新设置包络后凸轮每等分0.1度
for i=1:length(alpha)
for j=1:tN
temp=mod(round(st(i,j)/dtulun),newN)+1;%把原本凸轮的节点数N降低到3600
if sr(i,j)<nstulun(1,temp) %取包络线上最近的点
nstulun(1,temp)=sr(i,j);
end
end
end
% 绘制实际凸轮
polar(newalpha,nstulun)
[sjx,sjy]=pol2cart(newalpha,nstulun);% 把极坐标实际凸轮点转为笛卡尔坐标点
% 输出实际凸轮轨迹坐标点的文件
fid=fopen('cz2025.txt','w');
for i=1:newN
fprintf(fid,'%g %g 0\n',sjx(i)*1000,sjy(i)*1000);
end
fclose(fid);
Lu = dc*N %驱动轮走的路程(米)
i = 27.5; %设置传动比设置
rhl = Lu/(i*2*pi)%计算右轮(驱动轮)的半径
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删