不定期小更新,偶尔看不见文章就是我在更新了
变量讲解:
L1,凸轮中心到前轮中心的距离,注意此时前轮为直行状态
L2,前轮中心与小车中心的距离,注意,前轮中心若在小车中心左边,则为负,右为正
L3,前轮直行时,前轮中心到与凸轮接触时的距离
max_rou,凸轮最长半径,该距离不得大于你的凸轮中心到底板的距离,除非你的凸轮是放在外面的
注意guiji001是由UG用样条曲线画出,再导出txt文档,放到MATLAB相应的目录下
我的guiji001数据和相应函数、注意事项位于文章底部
效果图:
如果你的车子数据和轨迹比较好,在经优化后凸轮如下,注意是经自己优化后。
一、凸轮原理如下:
如图:
由于,曲率半径与车长之比与凸轮dt和前轮中平面与转向推动结构运动平面间距之比相同,故可以通过求轨迹点的曲率半径推出在该轨迹点上的凸轮半径。
(CSDN不支持MATHTYPE,故用图片表示)
由此:
如下图,此时该点的曲率半径R为负。
可知,最重要的是求曲率半径R,共有两种方法,如下:
注意,此处曲率为k,所以曲率半径为1/k。
二、代码如下:
主函数脚本
clc
clear
XYR=textread('guiji001.txt');
% 此轨迹为小车中心所走的轨迹,且注意,该轨迹为决定了凸轮轨迹,所以,并非为前轮轨迹决定凸轮,而为中心(接受信号)轨迹
L1=60.23;%基圆半径
L2=26.71; %前轮偏置距离
L3=30;%车把长
L31=L3+2;% 车把长 加上凸轮厚度
L4=141.45;%车长
L5=155.40; %小车宽度
%% 计算区
rr=1.5; % 摆杆半径
X=XYR(:,2);%轨迹X坐标
Y=XYR(:,3);%轨迹Y坐标
%R=XYR(:,5);如果你有曲率半径的数据,你就把下文计算曲率半径的函数部分注释掉
% 如果你的曲率半径是UG计算出来的,记住给曲率半径分正负号,UG是不分正负的,如下文
[length_guiji,~]=size(XYR);
%% 这里是如果你知道拐点,就是曲率正负变化的点,前轮方向变化的点
% 如,前轮原本向左,但从某点开始,前轮向右了,该点就是拐点
% 计算曲率半径
%
% for i=1:1546
% R(i,1)=R(i,1);
% end
% for i =1547:2884
% R(i,1)=-R(i,1);
% end
% for i=2884:4258
% R(i,1)=R(i,1);
% end
% for i=4258:5911
% R(i,1)=-R(i,1);
% end
% for i=5912:6712
% R(i,1)=R(i,1);
% end
% for i=6712:7355
% R(i,1)=-R(i,1);
% end
% for i=7355:7679
% R(i,1)=R(i,1);
% end
% for i=7680:10000
% R(i,1)=-R(i,1);
% end
%%
% 计算总长
sum=0;
for i=2:length_guiji
dt_sum=sqrt( (X(i-1,1)-X(i,1))^2+(Y(i-1,1)-Y(i,1))^2 );
sum=sum+dt_sum;
end
% 此为确定轨迹曲率半径正负
% 计算曲率
%
rl=zeros(length_guiji,1);
for i=2:9999
rl(i,1)=PJcurvature([X(i-1,1),X(i,1),X(i+1,1)]',[Y(i-1,1),Y(i,1),Y(i+1,1)]');
end
rl(1,1)=rl(2,1);
rl(length_guiji,1)=rl(length_guiji-1,1);
% 计算曲率半径
R=zeros(length_guiji,1);
for i=1:length_guiji
R(i,1)=1./rl(i,1);
end
R=-R;
a1=zeros(length_guiji,1);
for i=1:length_guiji
a1(i,1)=atan( L4/ ( R(i,1)+L2 ) );
% a1(i,1)=rad2deg(a1(i,1));
end
% 换算为角度
aa=rad2deg(a1);
% 计算相应轨迹长度
s=zeros(length_guiji,1);
s(1,1)=0;%路程赋初值
for i=2:length_guiji
s(i,1)=s(i-1,1)+sqrt((X(i)-X(i-1))^2+(Y(i)-Y(i-1))^2)*(R(i,1)-L5/2)/R(i,1);
%计算小车走到第i点时主动轮走过路程
end
% 计算角度,并开一缺口
ct=zeros(length_guiji,1);
for j=1:length_guiji
ct(j,1)=2*pi*s(j,1)./s(length_guiji,1);
%ct(j,1)=2*358/360pi*s(j,1)./s(length_guiji,1);这个是开缺口
end
% 计算相应摆杆长度
E=zeros(length_guiji,1);
for i=1:length_guiji
if R(i,1)>0
E(i,1)=L3/cos( a1(i,1) );
end
if R(i,1)<0
E(i,1)=L31/cos( a1(i,1) );
end
end
max_E=max(E);
%计算凸轮rou
rou=zeros(length_guiji,1);
rou1=zeros(length_guiji,1);
dt=zeros(length_guiji,1);
dt_shiji=zeros(length_guiji,1); % 由于摆杆本身厚度,故与理想dt有一定的偏差
for i=1:length_guiji
dt(i,1)=E(i,1).*sin( a1(i,1) );
rou1(i,1)=dt(i,1)+L1; % e + dt1
dt_shiji(i,1)=dt(i,1)-rr*cos( a1(i,1) ) ;
rou(i,1)=dt_shiji(i,1)+L1; % e + dt1
end
max_rou=max(rou);
pianzhi=dt-dt_shiji;
baoluo=rou1-rou;
%% 绘画区
hold on
figure(1)
hold on
% 绘画场地和轨迹
rectangle('position',[-200,-400,4000+450,4000+700]);
% plot(X,Y,'b-');
% x00=[2486.564608 10.234419
% 1646.290621 495.484539
% 786.268087 765.096283
% 204.531723 1398.947983
% 398.263000 2034.411210
% 530.526031 2548.572331
% 629.999056 2821.920827 ]; %这里是你的拐点数据,UG可计算得出
% scatter(x00(:,1),x00(:,2),[],"red");
% title('轨迹拐点图');
% hold off
figure(2)
hold on
title('轨迹打卡图');
x01=[3750,200;2700,100;1750,150;1250,950;400,600;300,1600;400,2050;550,2600;1000,3500;2100,3800;];
rectangle('position',[-200,-400,4000+450,4000+700]);
plot(X,Y,'b-');
scatter(x01(:,1),x01(:,2),[],"green");
hold off
%绘画凸轮
figure(3)
subplot(1,2,1)
r00=zeros(length_guiji,1);
r00(:,1)=L1;
polarplot(ct(:,1),rou(:,1));hold on;
title('理想凸轮与实际凸轮对比图');
polarplot(ct,rou1);hold off;
subplot(1,2,2)
polarplot(ct(:,1),rou(:,1));hold on;
title('实际凸轮与基圆对比图');
polarplot(ct,r00,'--');hold off;
hold off
%% 导出
for i=1:10000
x(i)=rou(i)*cos(ct(i));
y(i)=rou(i)*sin(ct(i));
z(i)=0;
end
tulun1=[x;y;z];
writematrix(tulun1','tulun001.txt');
曲率函数 PJcurvature
function [kappa,norm_k] = PJcurvature(x,y)
x = reshape(x,3,1);
y = reshape(y,3,1);
t_a = norm([x(2)-x(1),y(2)-y(1)]);
t_b = norm([x(3)-x(2),y(3)-y(2)]);
M =[[1, -t_a, t_a^2];
[1, 0, 0 ];
[1, t_b, t_b^2]];
a = M\x;
b = M\y;
kappa = 2.*(a(3)*b(2)-b(3)*a(2)) / (a(2)^2.+b(2)^2.)^(1.5);
norm_k = [b(2),-a(2)]/sqrt(a(2)^2.+b(2)^2.);
end
注意事项:
1、你所导出的轨迹数据第二列和第三列须为轨迹的X、Y坐标,若有误,需检查其余列是否为XY坐标列。
2、函数PJcurvature的文件名需为PJcurvature,文件格式为PJcurvature.m,注意是.m文件。
3、车把长为实际摆杆与凸轮接触的X轴距离。
4、凸轮数据导出后需检查是否为三维坐标,注意UG txt数据导入须为三维坐标,否则会报错。
5、注意曲率半径是否有正负情况,一般而言,当你的车头方向发生改变时,比如在某点原本向左,但现在转向右,此时该点就是拐点,拐点两边的曲率半径,应有正负,如果不分正负,那么画出来的凸轮肯定有问题
蓝奏云链接,除guiji001.txt外,其余两txt改为.m,化为MATLAB脚本
https://wwgr.lanzouw.com/b04q42geh
密码:e8kw