ファイル:HarmonicDriveAni.gif

ウィキペディアから無料の百科事典

元のファイル(700 × 700 ピクセル、ファイルサイズ: 2.36メガバイト、MIME タイプ: image/gif、ループします、100 フレーム、3.0秒)

概要

解説
English: Harmonic-Drive Animation (strain wave gear (SWG)). (Colors in the drawing correspond to the Cross section File:Harmonic drive cross Legend.svg.)
Ncircular_spline = 42 (blue); Nflex_spline= 42-2 = 40 (red); Ratio = 40/(42-40) = 20
Deutsch: Harmonic-Drive Animation (Spannungswellengetriebe, Wellgetriebe oder Gleitkeilgetriebe). (Die Farbkodierung entspricht der Schnittzeichnung File:Harmonic drive cross Legend.svg.)
zInnenverzahnung = 42 (blue); zFlexspline= 42-2 = 40 (red); i = 40/(42-40) = 20
日付
原典 投稿者自身による著作物
作者 Jahobr
GIF 開発
InfoField
 
この 図式MATLABJahobrにより作成されました。
ソースコード
InfoField

MATLAB code

function HarmonicDriveAni() % source code for drawing a HarmonicDrive % this is by no means a "simulation". It is a hack job that produces a gif % % 2016-12-05 Jahobr (reworked 2017-09-16)     nTeethOutGear =  42; nTeethFlex = nTeethOutGear-2; modul = 0.1; % modul   colEdge = [0   0   0  ]; % Edge color colFlex = [1   0.2 0.2]; % FlexSpline color colWave = [0.1 0.7 0.1]; % WaveGen color colGear = [0.2 0.2 1  ]; % static OuterGear color   nFrames = 100; frameAngles = linspace(0,-pi,nFrames+1); % rotate clockwise frameAngles = frameAngles(1:end-1); % delete redundant frame   [pathstr,fname] = fileparts(which(mfilename)); % save files under the same name and at file location   figHandle = figure(15674454); clf axesHandle = axes; hold(axesHandle,'on') axis equal xlim([-3 3]) ylim([-3 3]) set(figHandle, 'Units','pixel'); set(figHandle, 'position',[1 1 700 700]); % [x y width height]  set(axesHandle, 'position',[-0.05 -0.05 1.1 1.1]); % stretch axis bigger as figure, easy way to get rid of ticks [x y width height]  set(figHandle,'GraphicsSmoothing','on') % requires at least version 2014b   for iFrame = 1:nFrames          angleWaveGen = frameAngles(iFrame);     angleFlexTeeth = angleWaveGen*(nTeethFlex-nTeethOutGear)/nTeethFlex; %  angle of the flexspline          cla(axesHandle);          %% %%%%%%%%    draw OuterGear (static)   %%%%%%%%     %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%          effectiveDiameter = modul*nTeethOutGear;     toothTipDiameter = effectiveDiameter-1.4*modul;     toothBottomDiameter = effectiveDiameter+1.6*modul;          angleBetweenTeeth = 2*pi/nTeethOutGear; % angle between 2 teeth     angleOffPoints = (0:angleBetweenTeeth/8:(2*pi));          %% outerEdge     maxDiameter = toothBottomDiameter*1.2; % definition of outer line     maxXY = samplesEllipse(maxDiameter,maxDiameter,500);     patch(maxXY(:,1),maxXY(:,2),colGear,'EdgeColor',colEdge,'LineWidth',0.5) % full outer disc          %% inner teeth     radiusOffPoints = angleOffPoints; % init          radiusOffPoints(1:8:end) = toothBottomDiameter/2; % middle bottom     radiusOffPoints(2:8:end) = toothBottomDiameter/2; % left bottom     radiusOffPoints(3:8:end) = effectiveDiameter/2; % rising edge     radiusOffPoints(4:8:end) = toothTipDiameter/2; % right top     radiusOffPoints(5:8:end) = toothTipDiameter/2; % middle top     radiusOffPoints(6:8:end) = toothTipDiameter/2; % left top     radiusOffPoints(7:8:end) = effectiveDiameter/2; % falling edge     radiusOffPoints(8:8:end) = toothBottomDiameter/2; % right bottom          [X,Y] = pol2cart(angleOffPoints,radiusOffPoints);          patch(X,Y,[1 1 1],'EdgeColor',colEdge,'LineWidth',0.5) % overlay white area for inner teeth               %% %%%%%%%%%     draw Flexspline        %%%%%%%%%     %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%          % % deform estimation based on tooth distance (using the circumferences); could be automated!     % U1 = 42*pi % Circumference of OuterGear     % U1 =     %   131.9469     %     % U2 = pi*sqrt(2*((42/2)^2+(0.9022*42/2)^2))  * 42/40 % Circumference of Flexspline * 42/40     % U2 =     %   131.9435     deform = 0.9022;          deformedDiameter = effectiveDiameter*deform; % scale down, but teeth must still have the same distance          rootEffectiveDia = effectiveDiameter-1.6*modul; % fixed offset     rootDeformedDia  = deformedDiameter-1.6*modul;  % fixed offset          topEffectiveDia = effectiveDiameter+1.4*modul; % fixed offset     topDeformedDia  = deformedDiameter+1.4*modul;  % fixed offset          % % an equidistant sampled ellipse is needed, to keep the tooth distance constant all the way around     offsetOnCircumference = (-angleWaveGen+angleFlexTeeth)/2/pi; % compensation + own_rotation  ,  normalization to "circumference"     equiEffeXY = equidistantSamplesEllipse(effectiveDiameter,deformedDiameter,nTeethFlex*8, offsetOnCircumference); % points on effective diameter     equiRootXY = equidistantSamplesEllipse(rootEffectiveDia, rootDeformedDia, nTeethFlex*8, offsetOnCircumference); % points with inwards offset     equiOutXY  = equidistantSamplesEllipse(topEffectiveDia,  topDeformedDia,  nTeethFlex*8, offsetOnCircumference); % points with outwards offset          toothXY = equiEffeXY; % intit          toothXY(1:8:end,:) = equiOutXY(1:8:end,:); % middle top        I######I     toothXY(2:8:end,:) = equiOutXY(2:8:end,:); % left top          I######+     % toothXY(3:8:end) init did it                                 I####/     toothXY(4:8:end,:) = equiRootXY(4:8:end,:); % right bottom     I##+     toothXY(5:8:end,:) = equiRootXY(5:8:end,:); % middle bottom    I##I     toothXY(6:8:end,:) = equiRootXY(6:8:end,:); % left bottom      I##+     % toothXY(7:8:end) init did it                                 I####\     toothXY(8:8:end,:) = equiOutXY(8:8:end,:); % right top         I######+          [toothXY] = rotateCordiantes(toothXY,angleWaveGen);          patch(toothXY(:,1),toothXY(:,2),colFlex,'EdgeColor',colEdge,'LineWidth',0.5) %draw flexspline with teeth               %% hole     holeEffectiveDia = effectiveDiameter-5*modul; % fixed inwards offset     holeDeformedDia  = deformedDiameter-5*modul;  % fixed inwards offset          holePathXY = samplesEllipse(holeEffectiveDia,holeDeformedDia,500);     holePathXY = rotateCordiantes(holePathXY,angleWaveGen);     patch(holePathXY(:,1),holePathXY(:,2),[1 1 1],'EdgeColor',colEdge,'LineWidth',0.5) % draw hole of deformed ring               %% %%%%%%%%%   draw wave generator      %%%%%%%%%     %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%          waveEffectiveDia = holeEffectiveDia; % touch flex spline     waveDeformedDia  = holeDeformedDia-5*modul; % extra air gap to spline, to make it more obvious          wavePathXY = samplesEllipse(waveEffectiveDia,waveDeformedDia,500);     [wavePathXY] = rotateCordiantes(wavePathXY,angleWaveGen);     patch(wavePathXY(:,1),wavePathXY(:,2),colWave,'EdgeColor',colEdge,'LineWidth',0.5) % draw wave generator          %% central shaft     shaftPathXY = samplesEllipse(effectiveDiameter/2.5,effectiveDiameter/2.5,500);     plot(axesHandle,shaftPathXY(:,1),shaftPathXY(:,2),'LineWidth',0.8,'color',colEdge); % draw central shaft outline               %% %%%%%%%%%   save animation     %%%%%%%%%     %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%          drawnow;          f = getframe(figHandle);     if iFrame == 1 % create colormap         [im,map] = rgb2ind(f.cdata,32,'nodither'); % 32 colors % create color map %% THE FIRST FRAME MUST INCLUDE ALL COLORES !!!         % FIX WHITE, rgb2ind sets white to [0.9961    0.9961    0.9961], which is annoying         [~,wIndex] = max(sum(map,2)); % find "white"         map(wIndex,:) = 1; % make it truly white         im(1,1,1,nFrames) = 0; % allocate                  if ~isempty(which('plot2svg'))             plot2svg(fullfile(pathstr, [fname '_Frame1.svg']),figHandle) % by Juerg Schwizer         else             disp('plot2svg.m not available; see http://www.zhinst.com/blogs/schwizer/');         end     end          imtemp = rgb2ind(f.cdata,map,'nodither');     im(:,:,1,iFrame) = imtemp;      end imwrite(im,map,fullfile(pathstr, [fname '.gif']),'DelayTime',1/30,'LoopCount',inf) % save gif disp([fname '.gif  has ' num2str(numel(im)/10^6 ,4) ' Megapixels']) % Category:Animated GIF files exceeding the 50 MP limit   %%% equidistantSamplesEllipse test code % figure(455467);clf;hold on; %  % equidistantXY = equidistantSamplesEllipse(1.5,0.5,40,0.1); % plot(equidistantXY(:,1),equidistantXY(:,2),'bx-') %  %  % equidistantXY = equidistantSamplesEllipse(2,1,40,1); % plot(equidistantXY(:,1),equidistantXY(:,2),'bx-') %  % equidistantXY = equidistantSamplesEllipse(3,2,40,0.5); % plot(equidistantXY(:,1),equidistantXY(:,2),'bx-') %  % equidistantXY = equidistantSamplesEllipse(4,3,40,0); % plot(equidistantXY(:,1),equidistantXY(:,2),'bx-') % pathXY = samplesEllipse(4,3,41); % plot(pathXY(1:end-1,1),pathXY(1:end-1,2),'ro-') %  % plot([4 -4]/2,[0 0],'-k')     function equidistantXY = equidistantSamplesEllipse(diameterH,diameterV,nPoints,offset) % Inputs: %   diameterH  horizontal diameter %   diameterV  vertical diameter %   nPoints    number of resampled points %   offsetFraction between 0 and 1 in circumference of ellipse   pathXY = samplesEllipse(diameterH,diameterV,1000); % create ellipse stepLengths = sqrt(sum(diff(pathXY,[],1).^2,2)); % distance between the points stepLengths = [0; stepLengths]; % add the starting point cumulativeLen = cumsum(stepLengths); % cumulative sum circumference = cumulativeLen(end); finalStepLocs = linspace(0,1, nPoints+1)+offset; % equidistant distribution finalStepLocs = finalStepLocs(1:end-1); % remove redundant point finalStepLocs = mod(finalStepLocs,1)*circumference; % unwrap and scale to circumference equidistantXY = interp1(cumulativeLen, pathXY, finalStepLocs);     function pathXY = samplesEllipse(diameterH,diameterV,nPoints) % point of ellipse; points start on the right, counterclockwise  % first and last points are the same % % Inputs: %   diameterH  horizontal diameter %   diameterV  vertical diameter %   nPoints    number of points   p = linspace(0,2*pi,nPoints)'; pathXY = [cos(p)*diameterH/2 sin(p)*diameterV/2]; % create ellipse     function [xy] = rotateCordiantes(xy,anglee) % [x1 y1; x2 y2; x3 y3; ...] coordinates to rotate % anglee angle of rotation in [rad] rotM = [cos(anglee) -sin(anglee); sin(anglee) cos(anglee)]; xy = (rotM*xy')'; 

ライセンス

この作品の著作権者である私は、この作品を以下のライセンスで提供します。
Creative Commons CC-Zero このファイルはクリエイティブ・コモンズ CC0 1.0 全世界 パブリック・ドメイン提供のもとで利用可能にされています。
ある作品に本コモンズ証を関連づけた者は、その作品について世界全地域において著作権法上認められる、その者が持つすべての権利(その作品に関する権利や隣接する権利を含む。)を、法令上認められる最大限の範囲で放棄して、パブリック・ドメインに提供しています。

この作品は、たとえ営利目的であっても、許可を得ずに複製、改変・翻案、配布、上演・演奏することが出来ます。

キャプション

このファイルの内容を1行で記述してください

このファイルに描写されている項目

題材

5 12 2016

ファイルの履歴

過去の版のファイルを表示するには、その版の日時をクリックしてください。

日付と時刻サムネイル寸法利用者コメント
現在の版2023年4月29日 (土) 14:202023年4月29日 (土) 14:20時点における版のサムネイル700 × 700 (2.36メガバイト)JahobrReverted to version as of 15:09, 17 November 2020 (UTC)
2023年3月30日 (木) 07:552023年3月30日 (木) 07:55時点における版のサムネイル500 × 500 (734キロバイト)Dndnrmn1Reverted to version as of 18:48, 14 March 2017 (UTC)
2020年11月17日 (火) 15:092020年11月17日 (火) 15:09時点における版のサムネイル700 × 700 (2.36メガバイト)JahobrReverted to version as of 20:14, 16 September 2017 (UTC)
2020年11月9日 (月) 21:402020年11月9日 (月) 21:40時点における版のサムネイル700 × 700 (2.37メガバイト)UserTwoSixBetter color match.
2020年11月9日 (月) 21:362020年11月9日 (月) 21:36時点における版のサムネイル700 × 700 (2.37メガバイト)UserTwoSixColor match with other image on gear page.
2017年9月16日 (土) 20:142017年9月16日 (土) 20:14時点における版のサムネイル700 × 700 (2.36メガバイト)JahobrGraphicsSmoothing on; teeth less woblly; more pixel;
2017年3月14日 (火) 18:482017年3月14日 (火) 18:48時点における版のサムネイル500 × 500 (734キロバイト)Jahobrcolores changed; 32 colores instead of 64; central shaft; optimized using "Jasc Animation Shop"
2016年12月5日 (月) 05:122016年12月5日 (月) 05:12時点における版のサムネイル500 × 500 (1.25メガバイト)Jahobr{{Information |Description ={{en|1=Harmonic-Drive Animation}} {{de|1=Harmonic-Drive Animation}} |Source ={{own}} |Author =Jahobr |Date =2016-12-05 |Permission = |other_versions = }}

以下の​ 2 ページがこのファイルを使用しています:

グローバルなファイル使用状況

以下に挙げる他のウィキがこの画像を使っています: