quaternion.html

来自「Robot tool box - provides many functions」· HTML 代码 · 共 223 行

HTML
223
字号
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"                "http://www.w3.org/TR/REC-html40/loose.dtd"><html><head>  <title>Description of quaternion</title>  <meta name="keywords" content="quaternion">  <meta name="description" content="QUATERNION Constructor for quaternion objects">  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">  <meta name="generator" content="m2html &copy; 2003 Guillaume Flandin">  <meta name="robots" content="index, follow">  <link type="text/css" rel="stylesheet" href="../m2html.css"></head><body><a name="_top"></a><div><a href="../index.html">Home</a> &gt;  <a href="#">@quaternion</a> &gt; quaternion.m</div><!--<table width="100%"><tr><td align="left"><a href="../index.html"><img alt="<" border="0" src="../left.png">&nbsp;Master index</a></td><td align="right"><a href="index.html">Index for ./@quaternion&nbsp;<img alt=">" border="0" src="../right.png"></a></td></tr></table>--><h1>quaternion</h1><h2><a name="_name"></a>PURPOSE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2><div class="box"><strong>QUATERNION Constructor for quaternion objects</strong></div><h2><a name="_synopsis"></a>SYNOPSIS <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2><div class="box"><strong>function q = quaternion(a1, a2) </strong></div><h2><a name="_description"></a>DESCRIPTION <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2><div class="fragment"><pre class="comment">QUATERNION Constructor for quaternion objects     Q = QUATERNION([s v1 v2 v3])    from 4 elements    Q = QUATERNION([s v1 v2 v3])    from 4 elements    Q = QUATERNION(v, theta)    from vector plus angle    Q = QUATERNION(R)        from a 3x3 or 4x4 matrix    Q = QUATERNION(q)        from another quaternion    Q = QUATERNION(s)        from a scalar    Q = QUATERNION(v)        from a vector All versions, except the first, are guaranteed to return a unit quaternion. A quaternion is a compact method of representing a 3D rotation that has computational advantages including speed and numerical robustness. A quaternion has 2 parts, a scalar s, and a vector v and is typically written    q = s &lt;vx vy vz&gt; A unit quaternion is one for which s^2+vx^2+vy^2+vz^2 = 1. A quaternion can be considered as a rotation about a vector in space where    q = cos (theta/2) sin(theta/2) &lt;vx vy vz&gt; where &lt;vx vy vz&gt; is a unit vector. Various functions such as INV, NORM, UNIT and PLOT are overloaded for quaternion objects. Arithmetic operators are also overloaded to allow quaternion multiplication, division, exponentiaton, and quaternion-vector multiplication (rotation). SEE ALSO: QUATERNION/SUBSREF, QUATERNION/PLOT</pre></div><!-- crossreference --><h2><a name="_cross"></a>CROSS-REFERENCE INFORMATION <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>This function calls:<ul style="list-style-image:url(../matlabicon.gif)"><li><a href="norm.html" class="code" title="function n = norm(q)">norm</a>	NORM Compute the norm of a quaternion</li><li><a href="quaternion.html" class="code" title="function q = quaternion(a1, a2)">quaternion</a>	QUATERNION Constructor for quaternion objects</li><li><a href="unit.html" class="code" title="function qu = unit(q)">unit</a>	UNIT Unitize a quaternion</li></ul>This function is called by:<ul style="list-style-image:url(../matlabicon.gif)"><li><a href="inv.html" class="code" title="function qi = inv(q)">inv</a>	INV Invert a unit-quaternion</li><li><a href="minus.html" class="code" title="function qp = plus(q1, q2)">minus</a>	MINUS Subtract two quaternion objects</li><li><a href="mrdivide.html" class="code" title="function qq = mrdivide(q1, q2)">mrdivide</a>	MRDIVIDE Compute quaternion quotient.</li><li><a href="mtimes.html" class="code" title="function qp = mtimes(q1, q2)">mtimes</a>	MTIMES Multiply two quaternion objects</li><li><a href="plus.html" class="code" title="function qp = plus(q1, q2)">plus</a>	PLUS Add two quaternion objects</li><li><a href="qinterp.html" class="code" title="function q = qinterp(Q1, Q2, r)">qinterp</a>	QINTERP Interpolate rotations expressed by quaternion objects</li><li><a href="quaternion.html" class="code" title="function q = quaternion(a1, a2)">quaternion</a>	QUATERNION Constructor for quaternion objects</li></ul><!-- crossreference --><h2><a name="_subfunctions"></a>SUBFUNCTIONS <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2><ul style="list-style-image:url(../matlabicon.gif)"><li><a href="#_sub1" class="code">function q = tr2q(t)</a></li></ul><h2><a name="_source"></a>SOURCE CODE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2><div class="fragment"><pre>0001 <span class="comment">%QUATERNION Constructor for quaternion objects</span>0002 <span class="comment">%</span>0003 <span class="comment">%    Q = QUATERNION([s v1 v2 v3])    from 4 elements</span>0004 <span class="comment">%    Q = QUATERNION([s v1 v2 v3])    from 4 elements</span>0005 <span class="comment">%    Q = QUATERNION(v, theta)    from vector plus angle</span>0006 <span class="comment">%    Q = QUATERNION(R)        from a 3x3 or 4x4 matrix</span>0007 <span class="comment">%    Q = QUATERNION(q)        from another quaternion</span>0008 <span class="comment">%    Q = QUATERNION(s)        from a scalar</span>0009 <span class="comment">%    Q = QUATERNION(v)        from a vector</span>0010 <span class="comment">%</span>0011 <span class="comment">% All versions, except the first, are guaranteed to return a unit quaternion.</span>0012 <span class="comment">%</span>0013 <span class="comment">% A quaternion is a compact method of representing a 3D rotation that has</span>0014 <span class="comment">% computational advantages including speed and numerical robustness.</span>0015 <span class="comment">%</span>0016 <span class="comment">% A quaternion has 2 parts, a scalar s, and a vector v and is typically written</span>0017 <span class="comment">%</span>0018 <span class="comment">%    q = s &lt;vx vy vz&gt;</span>0019 <span class="comment">%</span>0020 <span class="comment">% A unit quaternion is one for which s^2+vx^2+vy^2+vz^2 = 1.</span>0021 <span class="comment">%</span>0022 <span class="comment">% A quaternion can be considered as a rotation about a vector in space where</span>0023 <span class="comment">%    q = cos (theta/2) sin(theta/2) &lt;vx vy vz&gt;</span>0024 <span class="comment">% where &lt;vx vy vz&gt; is a unit vector.</span>0025 <span class="comment">%</span>0026 <span class="comment">% Various functions such as INV, NORM, UNIT and PLOT are overloaded for</span>0027 <span class="comment">% quaternion objects.</span>0028 <span class="comment">%</span>0029 <span class="comment">% Arithmetic operators are also overloaded to allow quaternion multiplication,</span>0030 <span class="comment">% division, exponentiaton, and quaternion-vector multiplication (rotation).</span>0031 <span class="comment">%</span>0032 <span class="comment">% SEE ALSO: QUATERNION/SUBSREF, QUATERNION/PLOT</span>0033 0034 <span class="comment">% Copyright (C) 1999-2008, by Peter I. Corke</span>0035 <span class="comment">%</span>0036 <span class="comment">% This file is part of The Robotics Toolbox for Matlab (RTB).</span>0037 <span class="comment">%</span>0038 <span class="comment">% RTB is free software: you can redistribute it and/or modify</span>0039 <span class="comment">% it under the terms of the GNU Lesser General Public License as published by</span>0040 <span class="comment">% the Free Software Foundation, either version 3 of the License, or</span>0041 <span class="comment">% (at your option) any later version.</span>0042 <span class="comment">%</span>0043 <span class="comment">% RTB is distributed in the hope that it will be useful,</span>0044 <span class="comment">% but WITHOUT ANY WARRANTY; without even the implied warranty of</span>0045 <span class="comment">% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>0046 <span class="comment">% GNU Lesser General Public License for more details.</span>0047 <span class="comment">%</span>0048 <span class="comment">% You should have received a copy of the GNU Leser General Public License</span>0049 <span class="comment">% along with RTB.  If not, see &lt;http://www.gnu.org/licenses/&gt;.</span>0050 0051 0052 <a name="_sub0" href="#_subfunctions" class="code">function q = quaternion(a1, a2)</a>0053 0054 0055     <span class="keyword">if</span> nargin == 0,0056         q.v = [];0057         q.s = [];0058         q = class(q, <span class="string">'quaternion'</span>);0059     <span class="keyword">elseif</span> isa(a1, <span class="string">'quaternion'</span>)0060 <span class="comment">%    Q = QUATERNION(q)        from another quaternion</span>0061         q = a1;0062     <span class="keyword">elseif</span> nargin == 10063         <span class="keyword">if</span> all(size(a1) == [3 3])0064 <span class="comment">%    Q = QUATERNION(R)        from a 3x3 or 4x4 matrix</span>0065             q = <a href="quaternion.html" class="code" title="function q = quaternion(a1, a2)">quaternion</a>( <a href="#_sub1" class="code" title="subfunction q = tr2q(t)">tr2q</a>(a1) );0066         <span class="keyword">elseif</span> all(size(a1) == [4 4])0067             q = <a href="quaternion.html" class="code" title="function q = quaternion(a1, a2)">quaternion</a>( <a href="#_sub1" class="code" title="subfunction q = tr2q(t)">tr2q</a>(a1(1:3,1:3)) );0068         <span class="keyword">elseif</span> all(size(a1) == [1 4]) | all(size(a1) == [4 1])0069 <span class="comment">%    Q = QUATERNION([s v1 v2 v3])    from 4 elements</span>0070             a1 = a1(:);0071             q.s = a1(1);0072             q.v = a1(2:4)';0073             q = class(q, <span class="string">'quaternion'</span>);0074         <span class="keyword">elseif</span> length(a1) == 3,0075 <span class="comment">%    Q = QUATERNION(v)        from a vector</span>0076 0077             q.s = 0;0078             q.v = a1(:)';0079             q = class(q, <span class="string">'quaternion'</span>);0080         <span class="keyword">elseif</span> length(a1) == 1,0081 <span class="comment">%    Q = QUATERNION(s)        from a scalar</span>0082             q.s = a1(1);0083             q.v = [0 0 0];0084             q = class(q, <span class="string">'quaternion'</span>);0085         <span class="keyword">else</span>0086             error(<span class="string">'unknown dimension of input'</span>);0087         <span class="keyword">end</span>0088     <span class="keyword">elseif</span> nargin == 20089 <span class="comment">%    Q = QUATERNION(v, theta)    from vector plus angle</span>0090         q = <a href="unit.html" class="code" title="function qu = unit(q)">unit</a>( <a href="quaternion.html" class="code" title="function q = quaternion(a1, a2)">quaternion</a>( [cos(a2/2) sin(a2/2)*<a href="unit.html" class="code" title="function qu = unit(q)">unit</a>(a1(:).')]) );0091     <span class="keyword">end</span>0092 0093 <span class="comment">%TR2Q    Convert homogeneous transform to a unit-quaternion</span>0094 <span class="comment">%</span>0095 <span class="comment">%    Q = tr2q(T)</span>0096 <span class="comment">%</span>0097 <span class="comment">%    Return a unit quaternion corresponding to the rotational part of the</span>0098 <span class="comment">%    homogeneous transform T.</span>0099 <span class="comment">%</span>0100 <span class="comment">%    See also: Q2TR</span>0101 0102 <span class="comment">%    Copyright (C) 1993 Peter Corke</span>0103 <a name="_sub1" href="#_subfunctions" class="code">function q = tr2q(t)</a>0104     qs = sqrt(trace(t)+1)/2.0;0105     kx = t(3,2) - t(2,3);    <span class="comment">% Oz - Ay</span>0106     ky = t(1,3) - t(3,1);    <span class="comment">% Ax - Nz</span>0107     kz = t(2,1) - t(1,2);    <span class="comment">% Ny - Ox</span>0108 0109     <span class="keyword">if</span> (t(1,1) &gt;= t(2,2)) &amp; (t(1,1) &gt;= t(3,3)) 0110         kx1 = t(1,1) - t(2,2) - t(3,3) + 1;    <span class="comment">% Nx - Oy - Az + 1</span>0111         ky1 = t(2,1) + t(1,2);            <span class="comment">% Ny + Ox</span>0112         kz1 = t(3,1) + t(1,3);            <span class="comment">% Nz + Ax</span>0113         add = (kx &gt;= 0);0114     <span class="keyword">elseif</span> (t(2,2) &gt;= t(3,3))0115         kx1 = t(2,1) + t(1,2);            <span class="comment">% Ny + Ox</span>0116         ky1 = t(2,2) - t(1,1) - t(3,3) + 1;    <span class="comment">% Oy - Nx - Az + 1</span>0117         kz1 = t(3,2) + t(2,3);            <span class="comment">% Oz + Ay</span>0118         add = (ky &gt;= 0);0119     <span class="keyword">else</span>0120         kx1 = t(3,1) + t(1,3);            <span class="comment">% Nz + Ax</span>0121         ky1 = t(3,2) + t(2,3);            <span class="comment">% Oz + Ay</span>0122         kz1 = t(3,3) - t(1,1) - t(2,2) + 1;    <span class="comment">% Az - Nx - Oy + 1</span>0123         add = (kz &gt;= 0);0124     <span class="keyword">end</span>0125 0126     <span class="keyword">if</span> add0127         kx = kx + kx1;0128         ky = ky + ky1;0129         kz = kz + kz1;0130     <span class="keyword">else</span>0131         kx = kx - kx1;0132         ky = ky - ky1;0133         kz = kz - kz1;0134     <span class="keyword">end</span>0135     nm = <a href="norm.html" class="code" title="function n = norm(q)">norm</a>([kx ky kz]);0136     <span class="keyword">if</span> nm == 0,0137         q = <a href="quaternion.html" class="code" title="function q = quaternion(a1, a2)">quaternion</a>([1 0 0 0]);0138     <span class="keyword">else</span>0139         s = sqrt(1 - qs^2) / nm;0140         qv = s*[kx ky kz];0141 0142         q = <a href="quaternion.html" class="code" title="function q = quaternion(a1, a2)">quaternion</a>([qs qv]);0143 0144     <span class="keyword">end</span></pre></div><hr><address>Generated on Sun 15-Feb-2009 18:09:29 by <strong><a href="http://www.artefact.tk/software/matlab/m2html/">m2html</a></strong> &copy; 2003</address></body></html>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?