凸轮设计代码——轨迹逆推凸轮(工创大赛)

不定期小更新,偶尔看不见文章就是我在更新了

变量讲解:

L1,凸轮中心到前轮中心的距离,注意此时前轮为直行状态

L2,前轮中心与小车中心的距离,注意,前轮中心若在小车中心左边,则为负,右为正

L3,前轮直行时,前轮中心到与凸轮接触时的距离

max_rou,凸轮最长半径,该距离不得大于你的凸轮中心到底板的距离,除非你的凸轮是放在外面的

注意guiji001是由UG用样条曲线画出,再导出txt文档,放到MATLAB相应的目录下

我的guiji001数据和相应函数、注意事项位于文章底部

效果图:

a01df95136c741dd8856d02f38270f67.png

f29dff5d6df548efb9942adfc9e2d7c0.png

如果你的车子数据和轨迹比较好,在经优化后凸轮如下,注意是经自己优化后。

063953ec4a224d268847e6184e5268c8.jpeg

一、凸轮原理如下:

如图:

由于,曲率半径与车长之比与凸轮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

  • 38
    点赞
  • 127
    收藏
    觉得还不错? 一键收藏
  • 84
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 84
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值