Plotting path of rods on a circular disk along a surface to deduce rack gear profile.

조회 수: 6 (최근 30일)
I am trying to design a custom rack gear similar to ones used in a rack and pinion gear system. Instead of a pinion i am using a disk with 4 rods equally spaced on the disk that almost act as the teeth. I want to be able to plot the path of the rods as the disk rotates over a flat surface by simulating the movement. With this path I can design the rack.

채택된 답변

Mathieu NOE
Mathieu NOE 2024년 7월 5일
ok, I had some fun today with your exercise ...
time to grind a bit the sharp edges though !
% a disk fitted with 4 rods
d = 2; % central disk diameter
% rods
w = 0.75; % width
l = 1.5; % length
%% main code
N = 100; % disk geometry is created with 4N points, rods with N/2 points for each side segment
[xx,yy] = geometry(d,w,l,N);
% let's plot the geometry once
figure(1)
plot(xx,yy,'*-');
title('The disk / rods geometry');
axis square
% let it roll half a turn (in the x positive direction
figure(2)
plot(xx,yy,'-');
hold on
N = 100; % iterations
% store all points for future use (boundary)
xx_all = [xx];
yy_all = [yy];
for k = 1:N
alpha = -pi*k/N;
[xxr,yyr] = roll(xx,yy,alpha,d,l);
plot(xxr,yyr,'-');
% pause(0.05)
% store all points for future use (boundary)
xx_all = [xx_all xxr];
yy_all = [yy_all yyr];
end
% axis square
% extract now the rack profile using
k = boundary(xx_all(:),yy_all(:),1);
x_rack = xx_all(k);
y_rack = yy_all(k);
% remove some points that shall not belong to the rack
% remove points above the top flat sections of the rack
ind = y_rack>-d/2*0.9;
x_rack(ind) = [];
y_rack(ind) = [];
% remove negative x points
ind = x_rack<0;
x_rack(ind) = [];
y_rack(ind) = [];
% remove trailing x points
ind = find(y_rack<=y_rack(1),1,'last');
x_rack(ind:end) = [];
y_rack(ind:end) = [];
plot(x_rack,y_rack,'r*-');
title('rolling !');
hold off
figure(3)
% shift the y coordinates so the bottom appears at y = 0
y_rack = y_rack - min(y_rack);
plot(x_rack,y_rack,'r*-');
title('The rack geometry');
% % smooth a bit the top of the rack
% y_racks = smoothdata(y_rack,'movmean',5);
% plot(x_rack,y_rack,'r*-',x_rack,y_racks,'b*-');
%%%%%%%%%%%%%%%%%%%%%%%%
function [xxr,yyr] = roll(xx,yy,alpha,d,l)
% rotation
% alpha = -pi/10;
c = cos(alpha);
s = sin(alpha);
R = [c -s;s c];
tmp = R*[xx;yy];
xxr = tmp(1,:);
yyr = tmp(2,:);
% and x translation as if the disk is rolling to the right
xshift = -(d/2 + l)*alpha;
xxr = xxr + xshift;
end
%%
function [xx,yy] = geometry(d,w,l,N)
% disk
% d = 2;
n = 4*N;
theta = (0:n-1)/n*2*pi;
xd = d/2*cos(theta);
yd = d/2*sin(theta);
% add the four legs (rods)
% for more control over the rectangle shape , you can use this fex submission :
% https://fr.mathworks.com/matlabcentral/fileexchange/85418-rectangle2?s_tid=ta_fx_results
% first rod at position 3 o' clock
x1 = xd(1);
x2 = x1 + l;
y1 = yd(1)-w/2;
y2 = y1 + w;
% create some dots for the rods
k = round(N/2);
xx = linspace(x1,x2,k);
yy = linspace(y1,y2,k);
xBox = [xx x2*ones(1,k) xx(end:-1:1)];
yBox = [y1*ones(1,k) yy y2*ones(1,k)];
% remove some points of the circle
ind = (abs(xd)<w/2) | (abs(yd)<w/2);
xd(ind) = [];
yd(ind) = [];
% concatenate all coordinates
xx = [xd xBox yBox -xBox -yBox];
yy = [yd yBox xBox -yBox -xBox];
% put all those points in ascending theta order
[TH,R] = cart2pol(xx,yy);
[TH,ind] = sort(TH);
R = R(ind);
[xx,yy] = pol2cart(TH,R);
% close the curve
xx(end+1) = xx(1);
yy(end+1) = yy(1);
end
  댓글 수: 8
Benjamin
Benjamin 2024년 7월 12일
What would i need to change to do this for 6 or 8 rods?
Mathieu NOE
Mathieu NOE 2024년 7월 16일
hello again
simple modification below so you can now slect any number of rods you want
% a disk fitted with Nr rods
d = 3; % central disk diameter
rd = 0.75; % rods diameter
Nr = 8; % number of rods
%% main code
N = 30; % geometry is created with N points
[xx,yy] = geometry(d,rd,N,Nr);
% let's plot the geometry once
figure(1)
plot(xx,yy,'*-');
title('The disk / rods geometry');
axis square
% let it roll half a turn (in the x positive direction
figure(2)
plot(xx,yy,'-');
hold on
N = 100; % iterations
% store all points for future use (boundary)
xx_all = [xx(~isnan(xx))];
yy_all = [yy(~isnan(yy))];
for k = 1:N
alpha = -pi*k/N;
[xxr,yyr] = roll(xx,yy,alpha,d,rd);
plot(xxr,yyr,'-');
% store all points for future use (boundary)
xx_all = [xx_all xxr(~isnan(xxr))];
yy_all = [yy_all yyr(~isnan(yyr))];
end
% extract now the rack profile using boundary
k = boundary(xx_all(:),yy_all(:),1);
x_rack = xx_all(k);
y_rack = yy_all(k);
% select only the bottom section of the boundary
tf = find(islocalmin(y_rack, 'MinSeparation', 10) & (y_rack<min(y_rack)*0.9));
ind = tf(1):tf(end);
x_rack = x_rack(ind);
y_rack = y_rack(ind);
plot(x_rack,y_rack,'r*-');
axis equal
title('rolling !');
hold off
figure(3)
% shift the y coordinates so the bottom appears at y = 0
y_rack = y_rack - min(y_rack);
plot(x_rack,y_rack,'r-');
title('The rack geometry');
axis equal
%%%%%%%%%%%%%%%%%%%%%%%%
function [xxr,yyr] = roll(xx,yy,alpha,d,rd)
% rotation
c = cos(alpha);
s = sin(alpha);
R = [c -s;s c];
tmp = R*[xx;yy];
xxr = tmp(1,:);
yyr = tmp(2,:);
% and x translation as if the disk is rolling to the right
xshift = -(d/2 + rd/2)*alpha;
xxr = xxr + xshift;
end
function [xx,yy] = geometry(d,rd,N,Nr)
% one peg
theta = (0:N)/N*2*pi;
xd = rd/2*cos(theta)+d/2;
yd = rd/2*sin(theta);
xx = [xd NaN];
yy = [yd NaN];
% add the remaining pegs
% peg are positioned on the pitch circle of diameter d
% first peg at position 3 o'clock
for k = 1:Nr-1
alpha = k*2*pi/Nr;
c = cos(alpha);
s = sin(alpha);
R = [c -s;s c];
tmp = R*[xd;yd];
xxr = tmp(1,:);
yyr = tmp(2,:);
xx = [xx xxr NaN];
yy = [yy yyr NaN];
end
end
%%

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 General Applications에 대해 자세히 알아보기

제품


릴리스

R2022b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by