Table of Contents
Password of the Zip File: hhyang95
1. Overview
1.1 Objective
•
날갯짓 메커니즘의 초기 설계를 위해 Planar Crank-Rocker (PCR)의 링크 파라미터 최적화를 Genetic Algorithm (GA)을 이용하여 수행하고 기구학적 해석(kinematic analysis)을 통해 거동을 분석하기 위함.
•
사용자가 원하는 날갯짓 진폭(flapping amplitude)과 평균 상반각(dihedral angle)을 만족 시키면서,
1.
평균 transmission angle을 최소화.
2.
Rocker output angle과 transmission angle 사이 phase 차이를 최소화.
◦
이때, 실제 하드웨어 구현을 위해 추가적인 기하학적 제약 조건을 고려해야함.
1.2 Design Parameters
•
4개의 최적화 설계 파라미터:
◦
: Angle between Z-axis and the fixed link (black)
◦
: Length of the crank (blue)
◦
: Length of the coupler (yellow)
◦
: Length of the rocker (orange)
•
주어진 설계 파라미터:
◦
: Length of the fixed link (black)
◦
: Length of the wing (green)
•
제약 조건:
◦
5개의 비선형 부등식 제약 조건
◦
2개의 비선형 등식 제약 조건
◦
5개의 선형 부등식 제약 조건
1.3 Program Structure
•
Main_PCR_Designer.m: 메인 m-file
•
MATLAB_Function: 함수 m-file 모음 폴더
◦
PCR: PCR 관련 함수 모음 폴더
▪
PCR_LoopAnalysis.m: PCR에 대한 위치 해석을 수행하고 각 링크 및 조인트의 위치를 변수에 저장
▪
PCR_NLC.m: 최적화를 위한 비선형 제약 조건 함수
▪
PCR_OptimizationUsingGA.m: GA를 이용하여 최적화가 수행되는 목적 함수
▪
PCR_VariableBoundary.m: 최적화 초기 population 생성을 위한 최적화 변수의 lower 및 upper 범위 출력
◦
Post-Process: 후처리 관련 함수 모음 폴더
▪
PCR_Simple_KinematicsAnimation.m: PCR 기반 날갯짓 메커니즘의 기구학 애니메이션 생성
◦
Utils: 기타 함수 모음 폴더
▪
PlaneVecEqn.m: 링크 메커니즘 위치 해석을 위한 기본 함수로, 닫힌 평면 루프의 벡터 방정식을 해석적으로 풀기 위한 함수
▪
2. Main_PCR_Designer.m
2.1 Program Initialization
%% Program Initialization
close all; clear; clc;
rng('default');
format short;
addpath(genpath('MATLAB_Function\'));
MATLAB
복사
•
rng('default')를 통해 항상 같은 최적화 결과가 나오도록 초기화.
•
addpath(genpath('MATLAB_Function\'))를 통해 MATLAB_Function 폴더 내의 모든 함수 m-file을 현재 실행된 MATLAB 경로에 추가.
2.2 Simulation Setting
%% Simulation Setting
% Basic Parameters
fileName = 'PCR_minPhase';
wingLength = 600; % [mm]
f = 6.0; % [Hz] Reference flapping frequency
optSwitch = 1; % Optimization Switch (0 = Off, 1 = On)
% Gear-Train Parameters
GT.gearModule = 0.7; % Gear module
GT.gearTeethNum = 70; % # of gear teeth
GT.gearPCD = GT.gearModule*GT.gearTeethNum; % [mm] Gear pitch circle diameter
GT.gearRadius = 0.5*GT.gearModule*(GT.gearTeethNum + 2); % [mm] Gear outer radius
GT.gearPosX = 0.5*GT.gearPCD; % [mm] X-position of gear center
GT.gearPosY = 0.5*GT.gearPCD; % [mm] Y-position of gear center
% Target Flapping Kinematics
targetKin.flapAmp = 45; % [deg] Flapping amplitude
targetKin.dihedralAng = 12.5; % [deg] Dihedral angle
% Basic PCR Parameters
fixedLinkLength = 64; % [mm] Fixed link length
% Geometric Constraints
GC.mu_min = 90 - 55; % [deg] Minimum transmission angle
GC.mu_max = 90 + 55; % [deg] Maximum transmisison angle
GC.jointDiameter = 11; % [mm] Diameter of link joints
% Kinematic Parameters
FC_num = 2.0; % # of flapping cycles
flapPeriod = 1/f; % [sec] Flapping period
DAT_num = 2160;
% Time Parameters
t_num = DAT_num*FC_num + 1; % # of time step
t = linspace(0, FC_num*flapPeriod, t_num); % [sec] Simulation time
% Crank Parameter
crank.t = t; % [sec]
crank.ang = 2*pi*f.*t; % [rad]
crank.DAT_num = DAT_num;
MATLAB
복사
•
Struct 변수 GT는 Gear-Train에 관련된 파라미터가 저장되며, GT.gearRadius가 crank 길이의 upper 범위 결정에 사용됨.
•
Struct 변수 GC는 제약 조건에 관련된 파라미터가 저장되며, transmission angle의 최소/최대값(GC.mu_min, GC.mu_max)을 최적화 제약 조건 함수에서 사용함.
◦
GC.jointDiameter는 실제 하드웨어 상세 설계 시 링크 조인트의 간섭을 고려하기 위한 변수.
•
Struct 변수 crank는 crank의 시간에 따른 각도 데이터가 저장되며, PCR의 위치 해석에 활용됨.
◦
DAT_num은 날갯짓 한 주기(crank 한 바퀴)에 몇 개의 데이터 포인트를 생성할 지를 결정하는 변수.
2.3 Planar Crank-Rocker: Optimization Setting
%% Planar Crank-Rocker: Optimization Setting
% Optimization Function
PCR_optFunction = @(x) PCR_OptimizationUsingGA(x, wingLength, fixedLinkLength, GT, GC, crank);
% Varialbe Information
var_num = 4;
[var_lb, var_ub] = PCR_VariableBoundary(fixedLinkLength, GT, GC);
% Linear Inequality Constraints
A = [0, 1, -1, 0; % L1 < L2
0, 1, 0, -1; % L1 < L3
0, 0, 1, 0; % L2 < L0
0, 0, 0, 1; % L3 < L0
0, 1, -1, -1]; % Grashof Criterion: L0 + L1 < L2 + L3
b = [0; % [mm]
0; % [mm]
fixedLinkLength - 0.1; % [mm]
fixedLinkLength - 0.1; % [mm]
-fixedLinkLength + eps]; % [mm]
% Non-Linear Constraints
PCR_NLCFunction = @(x) PCR_NLC(x, wingLength, targetKin, fixedLinkLength, GT, GC, crank);
% GA Options
GA_populationSize = round(50*var_num);
GA_optimizationOption = optimoptions('ga', ...
'CreationFcn', {'gacreationlinearfeasible'}, ...
'CrossoverFcn', {'crossoverintermediate'}, ...
'MutationFcn', {'mutationadaptfeasible'}, ...
'SelectionFcn', 'selectionstochunif', ...
'PopulationSize', GA_populationSize, ...
'InitialPopulationMatrix', [], ...
'EliteCount', ceil(0.01*GA_populationSize), ...
'CrossoverFraction', 0.65, ...
'MaxGenerations', 100, ...
'MaxStallGenerations', 25, ...
'FunctionTolerance', 1e-6, ...
'ConstraintTolerance', 1e-6, ...
'InitialPenalty', 0.1, ...
'PenaltyFactor', 2.0, ...
'Display', 'iter', ...
'PlotFcn', {@gaplotbestf, @gaplotbestindiv}, ...
'UseParallel', true);
MATLAB
복사
•
PCR_optFunction는 PCR_OptimizationUsingGA를 이용하여 주어진 PCR 최적화 변수 x에 대해 목적 함수의 출력을 반환하는 함수 변수.
•
PCR_VariableBoundary 함수를 이용하여 최적화 변수의 lower 및 upper 범위(var_lb, var_ub)를 결정.
•
A와 b는 5개의 선형 부등식을 위한 변수로 다음 기구학적 조건을 만족하기 위함.
◦
PCR을 구성하는 4개의 링크 길이 , , , 중, fixed link 길이인 이 가장 길고, crank 길이인 이 가장 짧다.
◦
앞선 길이 조건을 만족할 때, crank가 한 바퀴 회전하기 위한 Grashof 조건.
•
PCR_NLCFunction는 PCR_NLC를 이용하여 주어진 PCR 최적화 변수 x에 대해 비선형 부등식 및 등식 제약 조건의 만족 여부를 반환하는 함수 변수.
•
GA_populationSize는 전역해 탐색을 충분히 보장하기 위해 최적화 변수 개수의 50배로 결정.
•
GA Option은 모두 시행 착오에 따라 임의로 결정되었으며, MATLAB Help에 기반하여 사용자가 적절히 결정하길 권장 [MATLAB] Genetic Algorithm: ga()
◦
CreationFcn: 초기 population을 생성할 때, 앞서 정의한 선형 부등식 제약 조건 및 lower/upper 범위를 만족하는 범위에서 생성하기 위해 gacreationlinearfeasible 사용.
◦
CrossoverFcn: 제약 조건을 만족하는 초기 population으로부터 빠른 수렴성을 확보하기 위해 crossoverintermediate 사용.
◦
MutationFcn: 제약 조건을 만족하는 범위에서 돌연변이를 생성하기 위해 mutationadaptfeasible 사용.
◦
SelectionFcn: 기본 값인 selectionstochunif 사용.
◦
[ Elite / Crossover / Mutation ]의 비율을 [ 1% / 65% / 34% ]로 사용.
◦
페널티(InitialPenalty, PenaltyFactor)가 너무 크면, 초기에 비선형 제약 조건을 조금이라도 위반하는 population이 모두 사라지며, 전역해 탐색이 어려워지기 때문에 충분히 작은 값으로 결정.
◦
빠른 최적화를 위해 병렬 연산 사용 (Parallel Computing Toolbox 필요).
2.4 Planar Crank-Rocker: Optimization Using Genetic Algorithm
%% Planar Crank-Rocker: Optimization Using Genetic Algorithm
% Optimization
if (optSwitch == 1)
% Run Optimization
[optResult.x, ...
optResult.modelOutput, ...
optResult.exitFlag, ...
optResult.output, ...
optResult.population, ...
optResult.scores] = ga(PCR_optFunction, var_num, A, b, [], [], ...
var_lb, var_ub, PCR_NLCFunction, [], ...
GA_optimizationOption);
% Save Data
save([fileName, '_optResult.mat'], 'optResult');
PCR_x = optResult.x;
elseif (optSwitch == 0)
% Load Optimization Results
load([fileName, '_optResult.mat']);
PCR_x = optResult.x;
end
MATLAB
복사
•
optSwitch가 1인 경우, MATLAB ga 함수를 이용하여 최적화를 진행하며 앞서 정의한 fileName을 이용하여 최적화 결과(optResult)를 mat 파일로 저장.
•
optSwitch가 0인 경우, 과거에 저장되었던 최적화 결과(optResult)를 불러옴 (해당 파일이 존재해야함).
2.5 Kinematic Analysis of PCR
%% Kinematic Analysis of PCR
% Optimized PCR
PCR.phi0 = round(PCR_x(1), 4);
PCR.L0 = fixedLinkLength;
PCR.L1 = round(PCR_x(2), 4);
PCR.L2 = round(PCR_x(3), 4);
PCR.L3 = round(PCR_x(4), 4);
PCR.L_in = wingLength;
% Position Analysis of Link Loops
[mechanismCheckFlag, linkLoop, PCR, joint] = PCR_LoopAnalysis(crank, PCR, GT);
MATLAB
복사
•
최적화 결과를 PCR이라는 struct 변수에 저장하고 PCR_LoopAnalysis 함수를 이용하여 위치 해석 수행.
2.6 Post-Process
%% Post-Process
% Transmission Angle
mu_min = linkLoop.mu_min;
mu_max = linkLoop.mu_max;
mu_avg_diff = mean(abs(90 - linkLoop.mu));
% Flapping Kinematics
flapAmp = linkLoop.outputAmp; % [deg]
flapUpAng = max(linkLoop.outputAng); % [deg]
flapDownAng = min(linkLoop.outputAng); % [deg]
dihedralAng = 0.5*(flapUpAng + flapDownAng); % [deg]
% Kinematics Animation
aniFrameRate = 30; % [FPS]
axisRange = [-5, 665, -200, 450];
PCR_Simple_KinematicsAnimation(t_num, PCR, joint, aniFrameRate, axisRange, [fileName, '_Kinematics']);
MATLAB
복사
•
기구학 해석 결과 확인 및 PCR_Simple_KinematicsAnimation 함수를 이용한 애니메이션 파일 생성.