쿼터니언
설명
쿼터니언은 3차원 회전 및 방향에 사용되는 네 개 부분으로 구성된 초복소수입니다.
쿼터니언 수는 형식으로 표현됩니다. 여기서 a, b, c, d 부분은 실수이고, i, j, k는 방정식 i2 = j2 = k2 = ijk = −1을 충족하는 기저 요소입니다.
H로 표시되는 쿼터니언 세트는 실수에 대한 4차원 벡터 공간인 R4 내에서 정의됩니다. H의 모든 요소는 기저 요소 i, j, k의 선형 결합을 기반으로 고유한 표현을 갖습니다.
3차원의 모든 회전은 회전 축과 그 축을 중심으로 한 각도로 설명할 수 있습니다. 회전 행렬에 비해 쿼터니언의 장점은 회전 축과 회전 각도를 쉽게 해석할 수 있다는 것입니다. 예를 들어 R3의 한 점을 생각해 보십시오. 이 점을 회전시키려면 회전 축과 회전 각도를 정의합니다.
이 회전의 쿼터니언 표현은 로 표현될 수 있으며, 여기서 θ는 회전 각도이고 [ub, uc, ud]는 회전 축입니다.
생성
구문
설명
은 빈 쿼터니언을 생성합니다.quat
= quaternion()
는 배열 quat
= quaternion(A,B,C,D
)A
, B
, C
, D
에서 네 가지 쿼터니언 부분을 가져오는 쿼터니언 배열을 생성합니다. 모든 입력값은 크기와 데이터형이 동일해야 합니다.
는 회전 벡터로 구성된 N×3 행렬 quat
= quaternion(RV
,"rotvec")RV
에서 N×1 쿼터니언 배열을 생성합니다. RV
의 각 행은 라디안 단위의 회전 벡터를 나타냅니다.
는 회전 벡터로 구성된 N×3 행렬 quat
= quaternion(RV
,"rotvecd")RV
에서 N×1 쿼터니언 배열을 생성합니다. RV
의 각 행은 도 단위의 회전 벡터를 나타냅니다.
입력 인수
쿼터니언의 부분으로, 크기가 동일한 4개의 스칼라, 행렬 또는 다차원 배열로 지정되며 쉼표로 구분됩니다.
예: quat = quaternion(1,2,3,4)
는 1 + 2i + 3j + 4k 형식의 쿼터니언을 생성합니다.
예: quat = quaternion([1,5],[2,6],[3,7],[4,8])
은 quat(1,1) = 1 + 2i + 3j + 4k
와 quat(1,2) = 5 + 6i + 7j + 8k
인 1×2 쿼터니언 배열을 생성합니다
데이터형: single
| double
쿼터니언 부분으로 구성된 행렬로, N×4 행렬로 지정됩니다. 각 행은 개별 쿼터니언을 나타냅니다. 각 열은 개별 쿼터니언 부분을 나타냅니다.
예: quat = quaternion(rand(10,4))
는 10×1 쿼터니언 배열을 생성합니다.
데이터형: single
| double
회전 벡터로 구성된 행렬로, N×3 행렬로 지정됩니다. RV
의 각 행은 회전 벡터의 [X Y Z] 요소를 나타냅니다. 회전 벡터는 라디안 단위 또는 도 단위의 회전 각도에 의해 스케일링된 회전 축을 나타내는 단위 벡터입니다.
이 구문을 사용하려면 첫 번째 인수를 회전 벡터로 구성된 행렬로 지정하고 두 번째 인수를 "rotvec"
또는 "rotvecd"
로 지정하십시오.
예: quat = quaternion(rand(10,3),"rotvec")
는 10×1 쿼터니언 배열을 생성합니다.
데이터형: single
| double
회전 행렬로 구성된 배열로, 3×3 행렬 또는 3×3×N 배열로 지정됩니다. 배열의 각 페이지는 개별 회전 행렬을 나타냅니다.
예: quat
= quaternion(rand(3),"rotmat","point")
예: quat
= quaternion(rand(3),"rotmat","frame")
데이터형: single
| double
회전 행렬의 유형으로, "point"
또는 "frame"
으로 지정됩니다.
예: quat
= quaternion(rand(3),"rotmat","point")
예: quat
= quaternion(rand(3),"rotmat","frame")
데이터형: char
| string
오일러 각으로 구성된 행렬로, N×3 행렬로 지정됩니다. "euler"
구문을 사용하는 경우 E
를 라디안 단위로 지정합니다. "eulerd"
구문을 사용하는 경우 E
를 도 단위로 지정합니다.
예: quat
= quaternion(E
,"euler","YZY","point")
예: quat
= quaternion(E
,"euler","XYZ","frame")
데이터형: single
| double
회전 시퀀스로, 요소를 3개 가진 문자형 벡터로 지정됩니다.
"YZY"
"YXY"
"ZYZ"
"ZXZ"
"XYX"
"XZX"
"XYZ"
"YZX"
"ZXY"
"XZY"
"ZYX"
"YXZ"
좌표계가 프레임 회전을 사용하여 회전할 때 점의 새 좌표를 결정하려 한다고 가정하겠습니다. 점은 원래 좌표계에서 다음과 같이 정의됩니다.
point = [sqrt(2)/2,sqrt(2)/2,0];
오일러 각 표현 [45,45,0]을 사용하여 점을 회전하려고 합니다. 두 가지 다른 회전 시퀀스를 사용하여 점을 회전합니다.
쿼터니언 회전자를 만들고 "ZYX" 시퀀스를 지정하면 프레임은 먼저 z축을 중심으로 45도 회전한 다음 새로운 y축을 중심으로 45도 회전합니다.
quatRotator = quaternion([45,45,0],"eulerd","ZYX","frame"); newPointCoordinate = rotateframe(quatRotator,point)
newPointCoordinate = 0.7071 -0.0000 0.7071
쿼터니언 회전자를 만들고 "YZX" 시퀀스를 지정하면 프레임은 먼저 y축을 중심으로 45도 회전한 다음 새로운 z축을 중심으로 45도 회전합니다.
quatRotator = quaternion([45,45,0],"eulerd","YZX","frame"); newPointCoordinate = rotateframe(quatRotator,point)
newPointCoordinate = 0.8536 0.1464 0.5000
데이터형: char
| string
객체 함수
rotateframe | 쿼터니언 프레임 회전 |
rotatepoint | 쿼터니언 점 회전 |
conj | 쿼터니언의 켤레 복소수 |
ctranspose, ' | 쿼터니언 배열의 켤레 복소수 전치 |
ldivide, .\ | 요소별 쿼터니언 왼쪽 나눗셈 |
minus, - | 쿼터니언 뺄셈 |
mldivide, \ | 스칼라에 대한 쿼터니언 왼쪽 나눗셈 |
mrdivide, / | Quaternion right division for scalars |
mtimes, * | 쿼터니언 곱셈 |
power | 요소별 쿼터니언 거듭제곱 |
prod | 쿼터니언 배열의 곱셈 |
rdivide, ./ | 요소별 쿼터니언 오른쪽 나눗셈 |
times | 요소별 쿼터니언 곱셈 |
transpose, .' | 쿼터니언 배열 전치 |
uminus, - | 쿼터니언 단항 마이너스 |
예제
quat = quaternion()
quat = 0×0 empty quaternion array
기본적으로 쿼터니언의 기본 클래스는 double형입니다.
classUnderlying(quat)
ans = 'double'
쉼표로 구분된 동일한 크기의 스칼라, 행렬 또는 다차원 배열로 네 개 부분을 지정하여 하나의 쿼터니언 배열을 생성할 수 있습니다.
쿼터니언 부분을 스칼라로 정의합니다.
A = 1.1; B = 2.1; C = 3.1; D = 4.1; quatScalar = quaternion(A,B,C,D)
quatScalar = quaternion
1.1 + 2.1i + 3.1j + 4.1k
쿼터니언 부분을 열 벡터로 정의합니다.
A = [1.1;1.2]; B = [2.1;2.2]; C = [3.1;3.2]; D = [4.1;4.2]; quatVector = quaternion(A,B,C,D)
quatVector = 2×1 quaternion array
1.1 + 2.1i + 3.1j + 4.1k
1.2 + 2.2i + 3.2j + 4.2k
쿼터니언 부분을 행렬로 정의합니다.
A = [1.1,1.3; ... 1.2,1.4]; B = [2.1,2.3; ... 2.2,2.4]; C = [3.1,3.3; ... 3.2,3.4]; D = [4.1,4.3; ... 4.2,4.4]; quatMatrix = quaternion(A,B,C,D)
quatMatrix = 2×2 quaternion array
1.1 + 2.1i + 3.1j + 4.1k 1.3 + 2.3i + 3.3j + 4.3k
1.2 + 2.2i + 3.2j + 4.2k 1.4 + 2.4i + 3.4j + 4.4k
쿼터니언 부분을 3차원 배열로 정의합니다.
A = randn(2,2,2); B = zeros(2,2,2); C = zeros(2,2,2); D = zeros(2,2,2); quatMultiDimArray = quaternion(A,B,C,D)
quatMultiDimArray = 2×2×2 quaternion array
quatMultiDimArray(:,:,1) =
0.53767 + 0i + 0j + 0k -2.2588 + 0i + 0j + 0k
1.8339 + 0i + 0j + 0k 0.86217 + 0i + 0j + 0k
quatMultiDimArray(:,:,2) =
0.31877 + 0i + 0j + 0k -0.43359 + 0i + 0j + 0k
-1.3077 + 0i + 0j + 0k 0.34262 + 0i + 0j + 0k
쿼터니언 부분으로 구성된 N×4 행렬을 지정하여, 쿼터니언의 스칼라 또는 열 벡터를 생성할 수 있습니다. 여기서 열은 쿼터니언 부분 A, B, C, D에 대응합니다.
난수 쿼터니언의 열 벡터를 생성합니다.
quatParts = rand(3,4)
quatParts = 3×4
0.8147 0.9134 0.2785 0.9649
0.9058 0.6324 0.5469 0.1576
0.1270 0.0975 0.9575 0.9706
quat = quaternion(quatParts)
quat = 3×1 quaternion array
0.81472 + 0.91338i + 0.2785j + 0.96489k
0.90579 + 0.63236i + 0.54688j + 0.15761k
0.12699 + 0.09754i + 0.95751j + 0.97059k
쿼터니언 표현에서 quatParts
행렬을 가져오려면 compact
를 사용합니다.
retrievedquatParts = compact(quat)
retrievedquatParts = 3×4
0.8147 0.9134 0.2785 0.9649
0.9058 0.6324 0.5469 0.1576
0.1270 0.0975 0.9575 0.9706
라디안 단위 또는 도 단위의 회전 벡터로 구성된 N×3 행렬을 지정하여 N×1 쿼터니언 배열을 생성할 수 있습니다. 회전 벡터는 정규화된 쿼터니언과 일대일 관계를 갖는 간소화된 공간 표현입니다.
라디안 단위의 회전 벡터
회전 벡터를 사용하여 스칼라 쿼터니언을 만들고 그 결과로 생성된 쿼터니언이 정규화되었는지 확인합니다.
rotationVector = [0.3491,0.6283,0.3491];
quat = quaternion(rotationVector,"rotvec")
quat = quaternion
0.92124 + 0.16994i + 0.30586j + 0.16994k
norm(quat)
ans = 1.0000
rotvec
함수를 사용하여 쿼터니언에서 라디안 단위의 회전 벡터로 변환할 수 있습니다. 쿼터니언 quat
에서 rotationVector
를 복구합니다.
rotvec(quat)
ans = 1×3
0.3491 0.6283 0.3491
도 단위의 회전 벡터
회전 벡터를 사용하여 스칼라 쿼터니언을 만들고 그 결과로 생성된 쿼터니언이 정규화되었는지 확인합니다.
rotationVector = [20,36,20];
quat = quaternion(rotationVector,"rotvecd")
quat = quaternion
0.92125 + 0.16993i + 0.30587j + 0.16993k
norm(quat)
ans = 1
rotvecd
함수를 사용하여 쿼터니언에서 도 단위의 회전 벡터로 변환할 수 있습니다. 쿼터니언 quat
에서 rotationVector
를 복구합니다.
rotvecd(quat)
ans = 1×3
20.0000 36.0000 20.0000
회전 행렬로 구성된 3×3×N 배열을 지정하여 N×1 쿼터니언 배열을 생성할 수 있습니다. 회전 행렬 배열의 각 페이지는 쿼터니언 배열의 한 요소에 대응합니다.
3×3 회전 행렬을 사용하여 스칼라 쿼터니언을 생성합니다. 회전 행렬을 프레임으로 해석할지, 아니면 점 회전으로 해석할지를 지정합니다.
rotationMatrix = [1 0 0; ... 0 sqrt(3)/2 0.5; ... 0 -0.5 sqrt(3)/2]; quat = quaternion(rotationMatrix,"rotmat","frame")
quat = quaternion
0.96593 + 0.25882i + 0j + 0k
rotmat
함수를 사용하여 쿼터니언에서 회전 행렬로 변환할 수 있습니다. 쿼터니언 quat
에서 rotationMatrix
를 복구합니다.
rotmat(quat,"frame")
ans = 3×3
1.0000 0 0
0 0.8660 0.5000
0 -0.5000 0.8660
라디안 단위 또는 도 단위의 오일러 각으로 구성된 N×3 배열을 지정하여 N×1 쿼터니언 배열을 생성할 수 있습니다.
라디안 단위의 오일러 각
라디안 단위의 오일러 각으로 구성된 1×3 벡터를 사용하여 스칼라 쿼터니언을 생성하려면 euler
구문을 사용합니다. 오일러 각의 회전 시퀀스를 지정하고, 각도가 프레임을 나타내는지 아니면 점 회전을 나타내는지를 지정합니다.
E = [pi/2,0,pi/4]; quat = quaternion(E,"euler","ZYX","frame")
quat = quaternion
0.65328 + 0.2706i + 0.2706j + 0.65328k
euler
함수를 사용하여 쿼터니언에서 오일러 각으로 변환할 수 있습니다. 쿼터니언 quat
에서 오일러 각 E
를 복구합니다.
euler(quat,"ZYX","frame")
ans = 1×3
1.5708 0 0.7854
도 단위의 오일러 각
도 단위의 오일러 각으로 구성된 1×3 벡터를 사용하여 스칼라 쿼터니언을 생성하려면 eulerd
구문을 사용합니다. 오일러 각의 회전 시퀀스를 지정하고, 각도가 프레임을 나타내는지 아니면 점 회전을 나타내는지를 지정합니다.
E = [90,0,45]; quat = quaternion(E,"eulerd","ZYX","frame")
quat = quaternion
0.65328 + 0.2706i + 0.2706j + 0.65328k
eulerd
함수를 사용하여 쿼터니언에서 도 단위의 오일러 각으로 변환할 수 있습니다. 쿼터니언 quat
에서 오일러 각 E
를 복구합니다.
eulerd(quat,"ZYX","frame")
ans = 1×3
90.0000 0 45.0000
쿼터니언은 실수를 대상으로 비가환적이고 결합 법칙이 성립하는 대수를 형성합니다. 이 예제는 쿼터니언 대수의 규칙을 설명합니다.
덧셈과 뺄셈
쿼터니언 덧셈과 뺄셈은 부분별로 이루어지며 가환적입니다.
Q1 = quaternion(1,2,3,4)
Q1 = quaternion
1 + 2i + 3j + 4k
Q2 = quaternion(9,8,7,6)
Q2 = quaternion
9 + 8i + 7j + 6k
Q1plusQ2 = Q1 + Q2
Q1plusQ2 = quaternion
10 + 10i + 10j + 10k
Q2plusQ1 = Q2 + Q1
Q2plusQ1 = quaternion
10 + 10i + 10j + 10k
Q1minusQ2 = Q1 - Q2
Q1minusQ2 = quaternion
-8 - 6i - 4j - 2k
Q2minusQ1 = Q2 - Q1
Q2minusQ1 = quaternion
8 + 6i + 4j + 2k
또한 실수와 쿼터니언의 덧셈과 뺄셈도 가능합니다. 쿼터니언의 첫 번째 부분을 실수부라고 하고 두 번째, 세 번째, 네 번째 부분을 벡터라고 합니다. 실수를 사용한 덧셈과 뺄셈은 쿼터니언의 실수부에만 영향을 미칩니다.
Q1plusRealNumber = Q1 + 5
Q1plusRealNumber = quaternion
6 + 2i + 3j + 4k
Q1minusRealNumber = Q1 - 5
Q1minusRealNumber = quaternion
-4 + 2i + 3j + 4k
곱셈
쿼터니언 곱셈은 기저 요소의 곱과 분배 법칙에 의해 결정됩니다. 기저 요소 i, j, k의 곱셈이 비가환적이므로 쿼터니언 곱셈도 비가환적입니다.
Q1timesQ2 = Q1 * Q2
Q1timesQ2 = quaternion
-52 + 16i + 54j + 32k
Q2timesQ1 = Q2 * Q1
Q2timesQ1 = quaternion
-52 + 36i + 14j + 52k
isequal(Q1timesQ2,Q2timesQ1)
ans = logical
0
쿼터니언에 실수를 곱할 수도 있습니다. 쿼터니언에 실수를 곱하면 쿼터니언의 각 부분에 개별적으로 실수가 곱해집니다.
Q1times5 = Q1*5
Q1times5 = quaternion
5 + 10i + 15j + 20k
쿼터니언에 실수를 곱하는 것은 가환적입니다.
isequal(Q1*5,5*Q1)
ans = logical
1
켤레
쿼터니언의 켤레 복소수는 쿼터니언 벡터 부분의 각 요소에 음을 취하는 것으로 정의됩니다.
Q1
Q1 = quaternion
1 + 2i + 3j + 4k
conj(Q1)
ans = quaternion
1 - 2i - 3j - 4k
쿼터니언과 그 켤레 간의 곱셈은 가환적입니다.
isequal(Q1*conj(Q1),conj(Q1)*Q1)
ans = logical
1
다수의 쿼터니언을 벡터, 행렬, 다차원 배열로 구성할 수 있습니다. MATLAB® 내장 함수는 쿼터니언에서 작동하도록 개선되었습니다.
결합
쿼터니언은 결합 중에 개별 객체로 처리되며 배열 조작에 대한 MATLAB 규칙을 따릅니다.
Q1 = quaternion(1,2,3,4); Q2 = quaternion(9,8,7,6); qVector = [Q1,Q2]
qVector = 1×2 quaternion array
1 + 2i + 3j + 4k 9 + 8i + 7j + 6k
Q3 = quaternion(-1,-2,-3,-4); Q4 = quaternion(-9,-8,-7,-6); qMatrix = [qVector;Q3,Q4]
qMatrix = 2×2 quaternion array
1 + 2i + 3j + 4k 9 + 8i + 7j + 6k
-1 - 2i - 3j - 4k -9 - 8i - 7j - 6k
qMultiDimensionalArray(:,:,1) = qMatrix; qMultiDimensionalArray(:,:,2) = qMatrix
qMultiDimensionalArray = 2×2×2 quaternion array
qMultiDimensionalArray(:,:,1) =
1 + 2i + 3j + 4k 9 + 8i + 7j + 6k
-1 - 2i - 3j - 4k -9 - 8i - 7j - 6k
qMultiDimensionalArray(:,:,2) =
1 + 2i + 3j + 4k 9 + 8i + 7j + 6k
-1 - 2i - 3j - 4k -9 - 8i - 7j - 6k
인덱싱
쿼터니언 배열에서 요소에 액세스하거나 요소를 할당하려면 인덱싱을 사용합니다.
qLoc2 = qMultiDimensionalArray(2)
qLoc2 = quaternion
-1 - 2i - 3j - 4k
인덱스 2의 쿼터니언을 쿼터니언 1로 바꿉니다.
qMultiDimensionalArray(2) = ones("quaternion")
qMultiDimensionalArray = 2×2×2 quaternion array
qMultiDimensionalArray(:,:,1) =
1 + 2i + 3j + 4k 9 + 8i + 7j + 6k
1 + 0i + 0j + 0k -9 - 8i - 7j - 6k
qMultiDimensionalArray(:,:,2) =
1 + 2i + 3j + 4k 9 + 8i + 7j + 6k
-1 - 2i - 3j - 4k -9 - 8i - 7j - 6k
형태 변경
쿼터니언 배열의 형태를 변경하려면 reshape
함수를 사용합니다.
qMatReshaped = reshape(qMatrix,4,1)
qMatReshaped = 4×1 quaternion array
1 + 2i + 3j + 4k
-1 - 2i - 3j - 4k
9 + 8i + 7j + 6k
-9 - 8i - 7j - 6k
전치
쿼터니언 벡터와 행렬을 전치하려면 transpose
함수를 사용합니다.
qMatTransposed = transpose(qMatrix)
qMatTransposed = 2×2 quaternion array
1 + 2i + 3j + 4k -1 - 2i - 3j - 4k
9 + 8i + 7j + 6k -9 - 8i - 7j - 6k
치환
쿼터니언 벡터, 행렬, 다차원 배열을 치환하려면 permute
함수를 사용합니다.
qMultiDimensionalArray
qMultiDimensionalArray = 2×2×2 quaternion array
qMultiDimensionalArray(:,:,1) =
1 + 2i + 3j + 4k 9 + 8i + 7j + 6k
1 + 0i + 0j + 0k -9 - 8i - 7j - 6k
qMultiDimensionalArray(:,:,2) =
1 + 2i + 3j + 4k 9 + 8i + 7j + 6k
-1 - 2i - 3j - 4k -9 - 8i - 7j - 6k
qMatPermute = permute(qMultiDimensionalArray,[3,1,2])
qMatPermute = 2×2×2 quaternion array
qMatPermute(:,:,1) =
1 + 2i + 3j + 4k 1 + 0i + 0j + 0k
1 + 2i + 3j + 4k -1 - 2i - 3j - 4k
qMatPermute(:,:,2) =
9 + 8i + 7j + 6k -9 - 8i - 7j - 6k
9 + 8i + 7j + 6k -9 - 8i - 7j - 6k
확장 기능
C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.
버전 내역
R2024a에 개발됨interp1
객체 함수를 사용하여 QUAD, SLERP와 같은 보간 방법으로 쿼터니언을 보간합니다.
slerp
함수는 이제 "natural"
경로 옵션을 사용한 구면 보간을 지원하므로, 시작 쿼터니언과 끝 쿼터니언의 방향을 고려한 더 매끄러운 천이가 가능합니다.
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
웹사이트 선택
번역된 콘텐츠를 보고 지역별 이벤트와 혜택을 살펴보려면 웹사이트를 선택하십시오. 현재 계신 지역에 따라 다음 웹사이트를 권장합니다:
또한 다음 목록에서 웹사이트를 선택하실 수도 있습니다.
사이트 성능 최적화 방법
최고의 사이트 성능을 위해 중국 사이트(중국어 또는 영어)를 선택하십시오. 현재 계신 지역에서는 다른 국가의 MathWorks 사이트 방문이 최적화되지 않았습니다.
미주
- América Latina (Español)
- Canada (English)
- United States (English)
유럽
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)