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

3 views (last 30 days)
Benjamin on 2 Jul 2024
Commented: Mathieu NOE on 16 Jul 2024
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 on 5 Jul 2024
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
Benjamin on 12 Jul 2024
What would i need to change to do this for 6 or 8 rods?
Mathieu NOE on 16 Jul 2024
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];
% 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
%%

### Categories

Find more on General Applications in Help Center and File Exchange

R2022b

### Community Treasure Hunt

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

Start Hunting!