반응형

회전을 계산하다보면 Heading은 0~360도로 썼다가 피치각은 -90~90도, 롤 각은 -180~180도로 사용하는 등.. 범위가 제각각이다. 심지어 시간에 비례하게 각도를 움직여주려고 하면 범위에 맞게 조정해야한다.

매번 만들다가 너무 귀찮아서 그냥 정리하려고 한다.

구현 언어는 MATLAB으로 되어있다.

0 ~ 360도로 warping

코드는 간단하다. mod 함수를 통해서 입력된 degree 단위의 각도를 0~360도 사이의 값으로 변환한다.

1
2
3
4
function y = warp_360(x)
mult = 360;
y  = mod(x, mult);
end
cs

 

-180~180도로 warping

위와 동일한 방식이나, mod 함수가 음의 범위는 따로 지원하지 않는 관계로 잠깐 shifting 시켰다가 가져온다.

1
2
3
4
function y = warp_180(x)
mult = 360;
y  = mod(x + mult/2, mult) - mult/2;
end
cs

 

-$\pi$ ~ $\pi$로 warping

1
2
3
4
function y = warp_2pi(x)
mult = 2 * pi;
y  = (mod(x + mult/2, mult) - mult/2);
end
cs

 

테스트한 코드는 다음과 같다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
clc;clear;
for i = 1 : 7200
    t = i / (10 * 180 / pi);
    t_line(i) = t;
    a_line(i) = warp_2pi(t);
end
%
figure(1);
set(gcf,'Position',[100 100 900 400]);
subplot(133);
plot(t_line, a_line);
title('Behavior of function, warp 2pi()'); 
xlabel('Input degrees');
ylabel('Outputs');
xlim([0 13]);
xticks([3:3:13]);
% xticks(0:180:810);
% yticks(-270:90:270);
grid on;
cs

 

테스트한 결과는 다음과 같다.

 

추가로 0~360도 범위의 값을 -180~180도 범위로 변경하고 싶으면 그냥 180도를 빼면 된다.

728x90

+ Recent posts