Balancing Robot 설계 - 모터 동역학 모델 추가
이전 글 Balancing Robot 설계 - 동역학 모델 구축과 시뮬레이션에 이어서, 이번에는 로봇의 동역학 모델에 모터 동역학 모델을 추가해 보도록 하겠습니다. 모터는 로봇에 토크를 가하기 위한 수단으로, 모터에 공급되는 전압을 제어하여 토크를 발생시키게 됩니다.
다음 문서는 밸런싱 로봇의 동역학 모델과 모터의 동역학 모델을 유도하는 과정입니다. (이전 글의 문서에서 "1.1.2. 모터 동역학"이 추가되었습니다.
이전에 MATLAB에서 설계한 balancingRobot.mdl 파일에 모터 동역학을 추가하여 로봇이 우리가 생각하는 방식대로 움직이는지 살펴보겠습니다. DrawSimResult.m 파일은 이전 문서에서의 파일과 동일합니다.
balancingRobot.mdl 파일에는 다음 그림과 같이 모터에 전압 V_l과 V_r을 Pulse Generator로 인가하고 출력 Y(theta, psy, phi)을 Scope로 모니터링 하도록 만들어져 있습니다. Scope1에서는 그래프로 바퀴의 회전각(theta), 바디의 기울기 각(psi), 로봇의 방향(phi)을 표시합니다.
Subsystem을 살펴보면 이전 글에서는 없던 Motor 블럭이 추가되어 있습니다.
Robot 블럭의 출력으로 연결되어 있는 두 적분기 중에서 Integrator1의 초기조건(Initial condition)을 [0 0.1 0]로 설정합니다. 이유는 로봇의 초기 자세를 약간 기울어지게 만들어 아무런 제어를 하지 않으면 쓰러지도록 하기위해서 입니다.
Motor 블럭의 코드는 다음과 같습니다.
function Torque = Motor(Y_dot, v_l, v_r)
n=50; %Gear ratio
R=0.06; %Radius of wheel
W=0.22; %Distance between two wheels
f_m=0.044; %Friction coefficient of wheel axis
% Motor constants
Rm = 28.2;
Kt = 0.57625;
Kb = 0.5362;
theta_dot = Y_dot(1,1);
psy_dot = Y_dot(2,1);
phi_dot = Y_dot(3,1);
alpha = n*Kt/Rm;
beta = n*Kt*Kb/Rm + f_m;
T_theta = alpha*(v_l + v_r) - 2*beta*(theta_dot - psy_dot) - 2*f_m*theta_dot;
T_psy = -alpha*(v_l + v_r) + 2*beta*(theta_dot - psy_dot);
T_phi = W/(2*R)*alpha*(v_r - v_l) - W^2/(2*R^2)*beta*phi_dot;
Torque = [T_theta T_psy T_phi];
이제 시뮬레이션을 해 보도록 하겠습니다.
시뮬레이션 1:
좌우 모터에 전압을 0~5초 동안 +5V, -5V를 공급하여 두 모터가 역으로 돌도록 하여 로봇이 회전하도록 한 후, 5~10초 동안 0V, 0V를 공급하여 두 모터가 정지하도록 하였습니다.
(노란색 - 바퀴의 회전 각도, 보라색 - 바디의 기울어진 각도, 하늘색 - 로봇의 방향)
그래프만 봐서는 실감이 잘 오지 않습니다. 아래 동영상은 2D로 그린 로봇의 옆면 그림입니다. 그래서 로봇의 방향은 표시되지 않지만 바퀴의 회전과 바디의 기울어진 각도는 잘 표시합니다. 처음 5초 동안은 로봇이 회전하기때문에 원심력으로 인해 바디가 완전히 쓰러지지 않고 기울어져 있습니다. 다음 5초동안은 로봇이 정지하기때문에 바디가 완전히 아래로 쓰러지게 됩니다.