diff --git a/books/bookvol10.3.pamphlet b/books/bookvol10.3.pamphlet index 2b20fdb..2297061 100644 --- a/books/bookvol10.3.pamphlet +++ b/books/bookvol10.3.pamphlet @@ -6,10 +6,30 @@ \makeindex \usepackage{graphicx} %% +%% Note that this file will eventually generate a dvi file +%% which will eventually be processed by dvipdfm to create a pdf. +%% The categories/domains/packages will be placed in a graphviz graph. +%% The graphviz dot syntax allows an href parameter. +%% The href parameter will reference this file. +%% pdf href syntax allows named destinations. +%% This macro creates a named destination using \special +%% Thus, you reference http://thispdf#nameddest=ABBREV +%% and you end up at the right page. +%% This macro is called implicitly by \pagehead so every +%% category/domain/package can be referenced by fullname or abbrev. +%% +%% dest will give the ability to use nameddest= in html pdfs +%% +\newcommand{\dest}[1]{% e.g. \dest{abb} +\special{pdf:dest (#1) [ @thispage /FitH @ypos ]}} +%% +%% %% pagehead consolidates standard page indexing %% \newcommand{\pagehead}[2]{% e.g. \pagehead{name}{abb} -\section{#1} +\dest{#1}% +\dest{#2}% +\subsection{{\bf #1} (#2)} \label{#1}% \label{#2}% \index{{#1}}% @@ -17,20 +37,34 @@ %% %% pagepic adds an image and an index entry %% -\newcommand{\pagepic}[2]{% e.g. \pagepic{pathandfile}{abb} -\includegraphics{#1}% +\newcommand{\pagepic}[3]{% e.g. \pagepic{pathandfile}{abb}{scale} +\includegraphics[scale=#3]{#1}% \index{images!#2}} %% +%% \refto is a link to a referenced page that returns it arg +%% +\newcommand{\refto}[1]{% e.g. \refto{name} +(p\pageref{#1}) #1} +%% %% pageto is a forward link to a referenced page %% \newcommand{\pageto}[2]{% e.g. \pageto{abb}{name} \ \\${\bf\Rightarrow{}}${``#1''} (#2) \ref{#1} on page~\pageref{#1}} %% -%% pageback is a backward link to a referencing page +%% pagefrom is a backward link to a referencing page %% \newcommand{\pagefrom}[2]{% e.g. \pagefrom{name}{abb} \ \\${\bf\Leftarrow{}}${``#1''} (#2) \ref{#1} on page~\pageref{#1}} %% +%% cross will put the category and function in the index +%% cross will leave the funcname so it can be put inline. +%% +\newcommand{\cross}[2]{% e.g. \pagefrom{cat}{funcname} +\index{#1!#2}% +\index{#2!#1}% +#2} + + % special meanings for math characters \providecommand{\N}{\mbox{\bbold N}} \providecommand{\Natural}{\mbox{\bbold N}} @@ -43,6 +77,9 @@ \providecommand{\Real}{\mbox{\bbold R}} \providecommand{\F}{{\mathcal F}} \providecommand{\R}{{\mathcal R}} +\mathchardef\bigp="3250 +\mathchardef\bigq="3251 +\mathchardef\bigslash="232C \begin{document} \begin{titlepage} \center{\includegraphics{ps/axiomfront.ps}} @@ -240,7 +277,1699 @@ November 10, 2003 ((iHy)) \eject \pagenumbering{arabic} \setcounter{chapter}{0} % Chapter 1 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%\pagehead{Domain}{ABB} +%\pagepic{ps/v103domain.ps}{ABB}{1.00} +\chapter{Chapter D} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Denavit-Hartenberg Matrices} +\subsection{Homogeneous Transformations} +The study of robot manipulation is concerned with the relationship between +objects, and between objects and manipulators. In this chapter we will +develop the representation necessary to describe these relationships. Similar +problems of representation have already been solved in the field of computer +graphics, where the relationship between objects must also be described. +Homogeneous transformations are used in this field and in computer vision +[Duda] [Robserts63] [Roberts65]. These transformations were employed by +Denavit to describe linkages [Denavit] and are now used to describe +manipulators [Pieper] [Paul72] [Paul77b]. + +We will first establish notation for vectors and planes and then introduce +transformations on them. These transformations consist primarily of +translation and rotation. We will then show that these transformations +can also be considered as coordinate frames in which to represent +objects, including the manipulator. The inverse transformation will +then be introduced. A later section describes the general rotation +transformation representing a rotation about a vector. An algorithm is +then described to find the equivalent axis and angle of rotations +represented by any given transformation. A brief section on stretching +and scaling transforms is included together with a section on the +perspective transformation. The chapter concludes with a section on +transformation equations. + +\subsection{Notation} + +In describing the relationship between objects we will make use of +point vectors, planes, and coordinate frames. Point vectors are +denoted by lower case, bold face characters. Planes are denoted by +script characters, and coordinate frames by upper case, bold face +characters. For example: + +\begin{tabular}{ll} +vectors & {\bf v}, {\bf x1}, {\bf x} \\ +planes & $\bigp$, $\bigq$ \\ +coordinate frames & {\bf I}, {\bf A}, {\bf CONV}\\ +\end{tabular}\\ + +We will use point vectors, planes, and coordinate frames as variables +which have associated values. For example, a point vector has as value +its three Cartesian coordinate components. + +If we wish to describe a point in space, which we will call {\sl p}, +with respect to a coordinate frame {\bf E}, we will use a vector which +we will call {\bf v}. We will write this as + +$$^E{\bf v}$$ + +\noindent +The leading superscript describes the defining coordinate frame. + +We might also wish to describe this same point, {\sl p}, with respect +to a different coordinate frame, for example {\bf H}, using a vector +{\bf w} as + +$$^H{\bf w}$$ + +\noindent +{\bf v} and {\bf w} are two vectors which probably have different +component values and ${\bf v} \ne {\bf w}$ even though both vectors +describe the same point {\sl p}. The case might also exist of a vector +{\bf a} describing a point 3 inches above any frame + +$${^{F^1}}{\bf a}\qquad {^{F^2}}{\bf a}$$ + +\noindent +In this case the vectors are identical but describe different +points. Frequently, the defining frame will be obvious from the text +and the superscripts will be left off. In many cases the name of the +vector will be the same as the name of the object described, for +example, the tip of a pin might be described by a vector {\bf tip} +with respect to a frame {\bf BASE} as + +$${^{BASE}}{\bf tip}$$ + +\noindent +If it were obvious from the text that we were describing the vector +with respect to {\bf BASE} then we might simply write + +$${\bf tip}$$ + +If we also wish to describe this point with respect to another +coordinate frame say, {\bf HAND}, then we must use another vector to +describe this relationship, for example + +$${^{HAND}{\bf tv}}$$ + +\noindent +${^{HAND}{\bf tv}}$ and {\bf tip} both describe the same feature but +have different values. In order to refer to individual components of +coordinate frames, point vectors, or planes, we add subscripts to +indicate the particular component. For example, the vector +${^{HAND}{\bf tv}}$ has components ${^{HAND}{\bf tv}}_{\bf x}$, +${^{HAND}{\bf tv}}_{\bf y}$, ${^{HAND}{\bf tv}}_{\bf z}$. + +\subsection{Vectors} + +The homogeneous coordinate representation of objects in $n$-space +is an $(n + 1)$-space entity such that a particular perspective +projection recreates the $n$-space. This can also be viewed as the +addition of an extra coordinate to each vector, a scale factor, such +that the vector has the same meaning if each component, including the +scale factor, is multiplied by a constant. + +A point vector + +$${\bf v} = a{\bf i} + b{\bf j} + c{\bf k}\eqno(1.1)$$ + +\noindent +where {\bf i}, {\bf j}, and {\bf k} are unit vectors along the $x$, +$y$, and $z$ coordinate axes, respectively, is represented in +homogeneous coordinates as a column matrix + +$${\bf v} = \left[\matrix{{\bf x}\cr + {\bf y}\cr + {\bf z}\cr + {\bf w}\cr} + \right]\eqno(1.2)$$ + +\noindent +where + +$${{\bf a} = {\bf x}/{\bf w}}$$ +$${{\bf b} = {\bf y}/{\bf w}}\eqno(1.3)$$ +$${{\bf c} = {\bf z}/{\bf w}}$$ + +\noindent +Thus the vector $3{\bf i} + 4{\bf j} + 5{\bf k}$ can be represented as +$[3,4,5,1]^{\rm T}$ or as $[6,8,10,2]^{\rm T}$ or again +as $[-30,-40,-50,-10]^{\rm T}$, +etc. The superscript $T$ indicates the transpose of the row vector +into a column vector. The vector at the origin, the null vector, is +represented as $[0,0,0,n]^{\rm T}$ where $n$ is any non-zero scale +factor. The vector $[0,0,0,0]^{\rm T}$ is undefined. Vectors of the form +$[a,b,c,0]^{\rm T}$ represent vectors at infinity and are used to represent +directions; the addition of any other finite vector does not change +their value in any way. + +We will also make use of the vector dot and cross products. Given two +vectors + +$${\bf a} = a_x{\bf i} + a_y{\bf j} + a_z{\bf k}\eqno(1.4)$$ +$${\bf b} = b_x{\bf i} + b_y{\bf j} + b_z{\bf k}$$ + +\noindent +we define the vector dot product, indicated by ``$\cdot$'' as + +$${\bf a} \cdot {\bf b} = {a_x}{b_x} + {a_y}{b_y} + {a_z}{b_z}\eqno(1.5)$$ + +\noindent +The dot product of two vectors is a scalar. The cross product, +indicated by an ``$\times$'', is another vector perpendicular to the +plane formed by the vectors of the product and is defined by + +$${\bf a} \times {\bf b} = ({a_y}{b_z} - {a_z}{b_y}){\bf i} + + ({a_z}{b_x} - {a_x}{b_z}){\bf j} + + ({a_x}{b_y} - {a_y}{b_x}){\bf k}\eqno(1.6)$$ + +\noindent +This definition is easily remembered as the expansion of the +determinant + +$${\bf a} \times {\bf b} = + \left|\matrix{{\bf i}&{\bf j}&{\bf k}\cr + {a_x}&{a_y}&{a_z}\cr + {b_x}&{b_y}&{b_z}\cr}\right|\eqno(1.7)$$ + +\subsection{Planes} +A plane is represented as a row matrix + +$$\bigp=[a,b,c,d]\eqno(1.8)$$ + +\noindent +such that if a point {\bf v} lies in a plane $\bigp$ the matrix +product + +$$\bigp{\bf v} = 0\eqno(1.9)$$ + +\noindent +or in expanded form + +$$xa + yb + zc + wd = 0\eqno(1.10)$$ + +\noindent +If we define a constant + +$$m = +\sqrt{a^2 + b^2 + c^2}\eqno(1.11)$$ + +\noindent +and divide Equation 1.10 by $wm$ we obtain + +$${x\over w}{a\over m} + {y\over w}{b\over m} + {z\over w}{c\over m} + = -{d\over m}\eqno(1.12)$$ + +\noindent +The left hand side of Equation 1.12 is the vector dot product of two +vectors $(x/w){\bf i} + (y/w){\bf j} + (z/w){\bf k}$ and +$(a/m){\bf i} + (b/m){\bf j} + (c/m){\bf k}$ and represents the +directed distance of the point +$(x/w){\bf i} + (y/w){\bf j} + (z/w){\bf k}$ along the vector\\ +$(a/m){\bf i} + (b/m){\bf j} + (c/m){\bf k}$. The vector +$(a/m){\bf i} + (b/m){\bf j} + (c/m){\bf k}$ can be interpreted as the +outward pointing normal of a plane situated a distance $-d/m$ from the +origin in the direction of the normal. Thus a plane $\bigp$ parallel +to the $x$,$y$ plane, one unit along the $z$ axis, is represented as + +$${\rm {\ \ \ \ \ \ \ \ \ }} \bigp = [0,0,1,-1]\eqno(1.13)$$ +$${\rm {or\ as\ \ \ }} \bigp = [0,0,2,-2]\eqno(1.14)$$ +$${\rm {\ \ \ \ \ or\ as\ \ \ }} \bigp = [0,0,-100,100]\eqno(1.15)$$ + +\noindent +A point ${\bf v} = [10,20,1,1]$ should lie in this plane + +$$[0,0,-100,100]\left[\matrix{10\cr + 20\cr + 1\cr + 1\cr} + \right] + = 0\eqno(1.16)$$ + +\noindent +or + +$$[0,0,1,-1]\left[\matrix{ -5\cr + -10\cr + -.5\cr + -.5\cr} + \right] + = 0\eqno(1.17)$$ + +\noindent +The point ${\bf v} = [0,0,2,1]$ lies above the plane + +$$[0,0,2,-2]\left[\matrix{0\cr + 0\cr + 2\cr + 1\cr} + \right] + = 2\eqno(1.18)$$ + +and $\bigp{\bf v}$ is indeed positive, indicating that the point is +outside the plane in the direction of the outward pointing normal. A +point ${\bf v} = [0,0,0,1]$ lies below the plane + +$$[0,0,1,-1]\left[\matrix{0\cr + 0\cr + 0\cr + 1\cr} + \right] + = -1\eqno(1.19)$$ + +\noindent +The plane $[0,0,0,0]$ is undefined. + +\subsection{Transformations} + +\noindent +A transformation of the space {\bf H} is a 4x4 matrix and can +represent translation, rotation, stretching, and perspective +transformations. Given a point {\bf u}, its transformation {\bf v} is +represented by the matrix product + +$${\bf v} = {\bf H}{\bf u}\eqno(1.20)$$ + +\noindent +The corresponding plane transformation $\bigp$ to $\bigq$ is + +$$\bigq = \bigp{\bf H^{-1}}\eqno(1.21)$$ + +\noindent +as we requre that the condition + +$$\bigq{\bf v} = \bigp{\bf u}\eqno(1.22)$$ + +\noindent +is invariant under all transformations. To verify this we substitute +from Equations 1.20 and 1.21 into the left hand side of 1.22 and we +obtain on the right hand side ${\bf H^{-1}}{\bf H}$ which is the +identity matrix {\bf I} + +$$\bigp{\bf H^{-1}}{\bf H}{\bf u} = \bigp{\bf u}\eqno(1.23)$$ + +\subsection{Translation Transformation} + +\noindent +The transformation {\bf H} corresponding to a translation by a vector +$a{\bf i} + b{\bf j} + c{\bf k}$ is + +$${\bf H} = {\bf Trans(a,b,c)} = + \left[\matrix{1&0&0&a\cr + 0&1&0&b\cr + 0&0&1&c\cr + 0&0&0&1\cr} + \right]\eqno(1.24)$$ + +\noindent +Given a vector ${\bf u} = [x,y,z,w]^{\rm T}$ the transformed vector {\bf v} +is given by + +$${\bf H} = {\bf Trans(a,b,c)} = + \left[\matrix{1&0&0&a\cr + 0&1&0&b\cr + 0&0&1&c\cr + 0&0&0&1\cr} + \right] + \left[\matrix{x\cr + y\cr + z\cr + w\cr} + \right]\eqno(1.25)$$ + +$${\bf v} = \left[\matrix{x + aw\cr + y + bw\cr + z + cw\cr + w\cr} + \right] + = \left[\matrix{x/w + a\cr + y/w + b\cr + z/w + c\cr + 1\cr} + \right]\eqno(1.26)$$ + +\noindent +The translation may also be interpreted as the addition of the two +vectors $(x/w){\bf i} + (y/w){\bf j} + (z/w){\bf k}$ and +$a{\bf i} + b{\bf j} + c{\bf k}$. + +Every element of a transformation matrix may be multiplied by a +non-zero constant without changing the transformation, in the same +manner as points and planes. Consider the vector $2{\bf i} + 3{\bf j} ++ 2{\bf k}$ translated by, or added to\\ +4{\bf i} - 3{\bf j} + 7{\bf k} + +$$\left[\matrix{6\cr + 0\cr + 9\cr + 1\cr} + \right] = + \left[\matrix{1 & 0 & 0 & 4\cr + 0 & 1 & 0 & -3\cr + 0 & 0 & 1 & 7\cr + 0 & 0 & 0 & 1\cr} + \right] + \left[\matrix{2\cr + 3\cr + 2\cr + 1\cr} + \right]\eqno(1.27)$$ + +\noindent +If we multiply the transmation matrix elements by, say, -5, and the +vector elements by 2, we obtain + +$$\left[\matrix{-60\cr + 0\cr + -90\cr + -10\cr} + \right] = + \left[\matrix{-5 & 0 & 0 & -20\cr + 0 & -5 & 0 & 15\cr + 0 & 0 & -5 & -35\cr + 0 & 0 & 0 & -5\cr} + \right] + \left[\matrix{4\cr + 6\cr + 4\cr + 2\cr} + \right]\eqno(1.28)$$ + +\noindent +which corresponds to the vector $[6,0,9,1]^{\rm T}$ as before. The point +$[2,3,2,1]$ lies in the plane $[1,0,0,-2]$ + +$$[1,0,0,-2]\left[\matrix{2\cr + 3\cr + 2\cr + 1\cr} + \right] = 0\eqno(1.29)$$ + +\noindent +The transformed point is, as we have already found, $[6,0,9,1]^{\rm T}$. We +will now compute the transformed plane. The inverse of the transform +is + +$$\left[\matrix{1 & 0 & 0 & -4\cr + 0 & 1 & 0 & 3\cr + 0 & 0 & 1 & -7\cr + 0 & 0 & 0 & 1\cr}\right]$$ + +\noindent +and the transformed plane + +$$[1\ 0\ 0\ -6] = [1\ 0\ 0\ -2]\left[\matrix{1 & 0 & 0 & -4\cr + 0 & 1 & 0 & 3\cr + 0 & 0 & 1 & -7\cr + 0 & 0 & 0 & 1\cr} + \right]\eqno(1.30)$$ + +\noindent +Once again the transformed point lies in the transformed plane + +$$[1\ 0\ 0\ -6] \left[\matrix{6\cr + 0\cr + 9\cr + 1\cr}\right] = 0\eqno(1.31)$$ + +The general translation operation can be represented in Axiom as + +<>= + translate(x,y,z) == + matrix(_ + [[1,0,0,x],_ + [0,1,0,y],_ + [0,0,1,z],_ + [0,0,0,1]]) +@ +\subsection{Rotation Transformations} + +\noindent +The transformations corresponding to rotations about the $x$, $y$, and +$z$ axes by an angle $\theta$ are + +$${\bf Rot(x,\theta)} = + \left[\matrix{1 & 0 & 0 & 0\cr + 0 & {cos\ \theta} & {-sin\ \theta} & 0\cr + 0 & {sin\ \theta} & {cos\ \theta} & 0\cr + 0 & 0 & 0 & 1}\right] + \eqno(1.32)$$ + +Rotations can be described in Axiom as functions that return +matrices. We can define a function for each of the rotation matrices +that correspond to the rotations about each axis. Note that the +sine and cosine functions in Axiom expect their argument to be in +radians rather than degrees. This conversion is + +$$radians = {{degrees * \pi}\over{180}}$$ + +\noindent +The Axiom code for ${\bf Rot(x,degree)}$ is + +<>= + rotatex(degree) == + angle := degree * pi() / 180::R + cosAngle := cos(angle) + sinAngle := sin(angle) + matrix(_ + [[1, 0, 0, 0], _ + [0, cosAngle, -sinAngle, 0], _ + [0, sinAngle, cosAngle, 0], _ + [0, 0, 0, 1]]) +@ + +$${\bf Rot(y,\theta)} = + \left[\matrix{{cos\ \theta} & 0 & {sin\ \theta} & 0\cr + 0 & 1 & 0 & 0\cr + {-sin\ \theta} & 0 & {cos\ \theta} & 0\cr + 0 & 0 & 0 & 1\cr}\right] + \eqno(1.33)$$ + +\noindent +The Axiom code for ${\bf Rot(y,degree)}$ is + +<>= + rotatey(degree) == + angle := degree * pi() / 180::R + cosAngle := cos(angle) + sinAngle := sin(angle) + matrix(_ + [[ cosAngle, 0, sinAngle, 0], _ + [ 0, 1, 0, 0], _ + [-sinAngle, 0, cosAngle, 0], _ + [ 0, 0, 0, 1]]) +@ + +$${\bf Rot(z,\theta)} = + \left[\matrix{{cos\ \theta} & {-sin\ \theta} & 0 & 0\cr + {sin\ \theta} & {cos\ \theta} & 0 & 0\cr + 0 & 0 & 1 & 0\cr + 0 & 0 & 0 & 1}\right] + \eqno(1.34)$$ + +\noindent +And the Axiom code for ${\bf Rot(z,degree)}$ is + +<>= + rotatez(degree) == + angle := degree * pi() / 180::R + cosAngle := cos(angle) + sinAngle := sin(angle) + matrix(_ + [[cosAngle, -sinAngle, 0, 0], _ + [sinAngle, cosAngle, 0, 0], _ + [ 0, 0, 1, 0], _ + [ 0, 0, 0, 1]]) +@ +\noindent +Let us interpret these rotations by means of an example. Given a point +${\bf u} = 7{\bf i} + 3{\bf j} + 2{\bf k}$ what is the effect of +rotating it $90^\circ$ about the ${\bf z}$ axis to ${\bf v}$? The +transform is obtained from Equation 1.34 with $sin\ \theta = 1$ and +$cos\ \theta = 0$. + +$$\left[\matrix{-3\cr + 7\cr + 2\cr + 1\cr} + \right] = + \left[\matrix{0 & -1 & 0 & 0\cr + 1 & 0 & 0 & 0\cr + 0 & 0 & 1 & 0\cr + 0 & 0 & 0 & 1\cr} + \right] + \left[\matrix{7\cr + 3\cr + 2\cr + 1\cr} + \right]\eqno(1.35)$$ + +\noindent +Let us now rotate {\bf v} $90^\circ$ about the $y$ axis to +{\bf w}. The transform is obtained from Equation 1.33 and we have + +$$\left[\matrix{2\cr + 7\cr + 3\cr + 1\cr} + \right] = + \left[\matrix{ 0 & 0 & 1 & 0\cr + 0 & 1 & 0 & 0\cr + -1 & 0 & 0 & 0\cr + 0 & 0 & 0 & 1\cr} + \right] + \left[\matrix{-3\cr + 7\cr + 2\cr + 1\cr} + \right]\eqno(1.36)$$ + +\noindent +If we combine these two rotations we have + +$${\rm \ \ \ \ \ \ \ } {\bf v} = {\bf Rot(z,90)}{\bf u}\eqno(1.37)$$ + +$${\rm and\ \ \ } {\bf w} = {\bf Rot(y,90)}{\bf v}\eqno(1.38)$$ + +\noindent +Substituting for {\bf v} from Equation 1.37 into Equation 1.38 we +obtain + +$${\bf w} = {\bf Rot(y,90)}\ {\bf Rot(z,90)}\ {\bf u}\eqno(1.39)$$ + +$${\bf Rot(y,90)}\ {\bf Rot(z,90)} = + \left[\matrix{ 0 & 0 & 1 & 0\cr + 0 & 1 & 0 & 0\cr + -1 & 0 & 0 & 0\cr + 0 & 0 & 0 & 1} + \right] + \left[\matrix{0 & -1 & 0 & 0\cr + 1 & 0 & 0 & 0\cr + 0 & 0 & 1 & 0\cr + 0 & 0 & 0 & 1} + \right]\eqno(1.40)$$ + +$${\bf Rot(y,90)}\ {\bf Rot(z,90)} = + \left[\matrix{0 & 0 & 1 & 0\cr + 1 & 0 & 0 & 0\cr + 0 & 1 & 0 & 0\cr + 0 & 0 & 0 & 1} + \right]\eqno(1.41)$$ + +\noindent +thus + +$${\bf w} = \left[\matrix{2\cr + 7\cr + 3\cr + 1}\right] + = \left[\matrix{0 & 0 & 1 & 0\cr + 1 & 0 & 0 & 0\cr + 0 & 1 & 0 & 0\cr + 0 & 0 & 0 & 1}\right] + \left[\matrix{7\cr + 3\cr + 2\cr + 1}\right]\eqno(1.42)$$ + +\noindent +as we obtained before. + +If we reverse the order of rotations and first rotate $90^\circ$ about +the $y$ axis and then $90^\circ$ about the $z$ axis, we obtain a +different position + +$${\bf Rot(z,90)}{\bf Rot(y,90)} = + \left[\matrix{0 & -1 & 0 & 0\cr + 1 & 0 & 0 & 0\cr + 0 & 0 & 1 & 0\cr + 0 & 0 & 0 & 1} + \right] + \left[\matrix{ 0 & 0 & 1 & 0\cr + 0 & 1 & 0 & 0\cr + -1 & 0 & 0 & 0\cr + 0 & 0 & 0 & 1} + \right] + = \left[\matrix{ 0 & -1 & 0 & 0\cr + 0 & 0 & 1 & 0\cr + -1 & 0 & 0 & 0\cr + 0 & 0 & 0 & 1} + \right]\eqno(1.43)$$ + +\noindent +and the point {\bf u} transforms into {\bf w} as + +$$\left[\matrix{-3\cr + 2\cr + -7\cr + 1} + \right] + = \left[\matrix{ 0 & -1 & 0 & 0\cr + 0 & 0 & 1 & 0\cr + -1 & 0 & 0 & 0\cr + 0 & 0 & 0 & 1} + \right] + \left[\matrix{7\cr + 3\cr + 2\cr + 1} + \right]\eqno(1.44)$$ + +\noindent +We should expect this, as matrix multiplication is noncommutative. + +$${\bf A}{\bf B} \ne {\bf B}{\bf A}\eqno(1.45)$$ + +We will now combine the original rotation with a translation +$4{\bf i}-3{\bf j}+7{\bf k}$. We obtain the translation from Equation +1.27 and the rotation from Equation 1.41. The matrix expression is + +$${\bf Trans(4,-3,7)}{\bf Rot(y,90)}{\bf Rot(z,90)} + = \left[\matrix{1 & 0 & 0 & 4\cr + 0 & 1 & 0 & -3\cr + 0 & 0 & 1 & 7\cr + 0 & 0 & 0 & 1} + \right] + \left[\matrix{0 & 0 & 1 & 0\cr + 1 & 0 & 0 & 0\cr + 0 & 1 & 0 & 0\cr + 0 & 0 & 0 & 1} + \right] + = \left[\matrix{0 & 0 & 1 & 4\cr + 1 & 0 & 0 & -3\cr + 0 & 1 & 0 & 7\cr + 0 & 0 & 0 & 1} + \right]\eqno(1.46)$$ + +\noindent +and our point ${\bf w} = 7{\bf i}+3{\bf j}+2{\bf k}$ transforms into +{\bf x} as + +$$\left[\matrix{ 6\cr + 4\cr + 10\cr + 1} + \right] + = \left[\matrix{0 & 0 & 1 & 4\cr + 1 & 0 & 0 & -3\cr + 0 & 1 & 0 & 7\cr + 0 & 0 & 0 & 1} + \right] + \left[\matrix{7\cr + 3\cr + 2\cr + 1} + \right]\eqno(1.47)$$ + +\subsection{Coordinate Frames} + +\noindent +We can interpret the elements of the homogeneous transformation as +four vectors describing a second coordinate frame. The vector +$[0,0,0,1]^{\rm T}$ lies at the origin of the second coordinate frame. Its +transformation corresponds to the right hand column of the +transformation matrix. Consider the transform in Equation 1.47 + +$$\left[\matrix{ 4\cr + -3\cr + 7\cr + 1} + \right] + = \left[\matrix{0 & 0 & 1 & 4\cr + 1 & 0 & 0 & -3\cr + 0 & 1 & 0 & 7\cr + 0 & 0 & 0 & 1} + \right] + \left[\matrix{0\cr + 0\cr + 0\cr + 1} + \right]\eqno(1.48)$$ + +\noindent +The transform of the null vector is $[4,-3,7,1]^{\rm T}$, the right +hand column. If we transform vectors corresponding to unit vectors +along the $x$, $y$, and $z$ axes, we obtain $[4,-2,7,1]^{\rm T}$, +$[4,-3,8,1]^{\rm T}$, and $[5,-3,7,1]^{\rm T}$, respectively. Those +four vectors form a coordinate frame. + +The direction of these unit vectors is formed by subtracting the +vector representing the origin of this coordinate frame and extending +the vectors to infinity by reducing their scale factors to zero. The +direction of the $x$, $y$, and $z$ axes of this frame are +$[0,1,0,0]^{\rm T}$, $[0,0,1,0]^{\rm T}$, and $[1,0,0,0]^{\rm T}$, +respectively. These direction vectors correspond to the first three +columns of the transformation matrix. The transformation matrix thus +describes the three axis directions and the position of the origin of +a coordinate frame rotated and translated away from the reference +coordinate frame. When a vector is transformed, as in Equation 1.47, +the original vector can be considered as a vector described in the +coordinate frame. The transformed vector is the same vector described +with respect to the reference coordinate frame. + +\subsection{Relative Transformations} + +\noindent +The rotations and translations we have been describing have all been +made with respect to the fixed reference coordinate frame. Thus, in +the example given, + +$${\bf Trans(4,-3,7)}{\bf Rot(y,90)}{\bf Rot(z,90)} + = \left[\matrix{0 & 0 & 1 & 4\cr + 1 & 0 & 0 & -3\cr + 0 & 1 & 0 & 7\cr + 0 & 0 & 0 & 1} + \right]\eqno(1.49)$$ + +\noindent +the frame is first rotated around the reference $z$ axis by +$90^\circ$, then rotated $90^\circ$ around the reference $y$ axis, and +finally translated by $4{\bf i}-3{\bf j}+7{\bf k}$. We may also +interpret the operation in the reverse order, from left to right, as +follows: the object is first translated by +$4{\bf i}-3{\bf j}+7{\bf k}$; it is then rotated $90^\circ$ around the +current frames axes, which in this case are the same as the reference +axes; it is then rotated $90^\circ$ about the newly rotated (current) +frames axes. + +In general, if we postmultiply a transform representing a frame by a +second transformation describing a rotation and/or translation, we +make that translation and/or rotation with respect to the frame axes +described by the first transformation. If we premultiply the frame +transformation by a transformation representing a translation and/or +rotation, then that translation and/or rotation is made with respect to +the base reference coordinate frame. Thus, given a frame {\bf C} and a +transformation {\bf T}, corresponding to a rotation of $90^\circ$ +about the $z$ axis, and a translation of 10 units in the $x$ +direction, we obtain a new position {\bf X} when the change is made in +the base coordinates ${\bf X} = {\bf T} {\bf C}$ + +$$\left[\matrix{0 & 0 & 1 & 0\cr + 1 & 0 & 0 & 20\cr + 0 & 1 & 0 & 0\cr + 0 & 0 & 0 & 1} + \right] + = \left[\matrix{0 & -1 & 0 & 10\cr + 1 & 0 & 0 & 0\cr + 0 & 0 & 1 & 0\cr + 0 & 0 & 0 & 1} + \right] + \left[\matrix{1 & 0 & 0 & 20\cr + 0 & 0 & -1 & 10\cr + 0 & 1 & 0 & 0\cr + 0 & 0 & 0 & 1} + \right]\eqno(1.50)$$ + +\noindent +and a new position {\bf Y} when the change is made relative to the +frame axes as ${\bf Y} = {\bf C} {\bf T}$ + +$$\left[\matrix{0 & -1 & 0 & 30\cr + 0 & 0 & -1 & 10\cr + 1 & 0 & 0 & 0\cr + 0 & 0 & 0 & 1} + \right] + = \left[\matrix{1 & 0 & 0 & 20\cr + 0 & 0 & -1 & 10\cr + 0 & 1 & 0 & 0\cr + 0 & 0 & 0 & 1} + \right] + \left[\matrix{0 & -1 & 0 & 10\cr + 1 & 0 & 0 & 0\cr + 0 & 0 & 1 & 0\cr + 0 & 0 & 0 & 1} + \right]\eqno(1.51)$$ + +\subsection{Objects} + +\noindent +Transformations are used to describe the position and orientation of +objects. An object is described by six points with respect to a +coordinate frame fixed in the object. + +If we rotate the object $90^\circ$ about the $z$ axis and then +$90^\circ$ about the $y$ axis, followed by a translation of four units +in the $x$ direction, we can describe the transformation as + +$${\bf Trans(4,0,0)}{\bf Rot(y,90)}{\bf Rot(z,90)} = + \left[\matrix{0 & 0 & 1 & 4\cr + 1 & 0 & 0 & 0\cr + 0 & 1 & 0 & 0\cr + 0 & 0 & 0 & 1} + \right]\eqno(1.52)$$ + +\noindent +The transformation matrix represents the operation of rotation and +translation on a coordinate frame originally aligned with the +reference coordinate frame. We may transform the six points of the +object as + +$$\left[\matrix{4 & 4 & 6 & 6 & 4 & 4\cr + 1 & -1 & -1 & 1 & 1 & -1\cr + 0 & 0 & 0 & 0 & 4 & 4\cr + 1 & 1 & 1 & 1 & 1 & 1} + \right] + = \left[\matrix{0 & 0 & 1 & 4\cr + 1 & 0 & 0 & 0\cr + 0 & 1 & 0 & 0\cr + 0 & 0 & 0 & 1} + \right] + \left[\matrix{1 & -1 & -1 & 1 & 1 & -1\cr + 0 & 0 & 0 & 0 & 4 & 4\cr + 0 & 0 & 2 & 2 & 0 & 0\cr + 1 & 1 & 1 & 1 & 1 & 1} + \right]\eqno(1.53)$$ + +It can be seen that the object described bears the same fixed +relationship to its coordinate frame, whose position and orientation +are described by the transformation. Given an object described by a +reference coordinate frame, and a transformation representing the +position and orientation of the object's axes, the object can be +simply reconstructed, without the necessity of transforming all the +points, by noting the direction and orientation of key features with +respect to the describing frame's coordinate axes. By drawing the +transformed coordinate frame, the object can be related to the new +axis directions. + +\subsection{Inverse Transformations} + +\noindent +We are now in a position to develop the inverse transformation as the +transform which carries the transformed coordinate frame back to the +original frame. This is simply the description of the reference +coordinate frame with respect to the transformed frame. Suppose the +direction of the reference frame $x$ axis is $[0,0,1,0]^{\rm T}$ with +respect to the transformed frame. The $y$ and $z$ axes are +$[1,0,0,0]^{\rm T}$ and $[0,1,0,0]^{\rm T}$, respectively. The +location of the origin is $[0,0,-4,1]^{\rm T}$ with respect to the +transformed frame and thus the inverse transformation is + +$${\bf T^{-1}} = \left[\matrix{0 & 1 & 0 & 0\cr + 0 & 0 & 1 & 0\cr + 1 & 0 & 0 & -4\cr + 0 & 0 & 0 & 1} + \right]\eqno(1.54)$$ + +\noindent +That this is indeed the tranform inverse is easily verifyed by +multiplying it by the transform {\bf T} to obtain the identity +transform + +$$\left[\matrix{1 & 0 & 0 & 0\cr + 0 & 1 & 0 & 0\cr + 0 & 0 & 1 & 0\cr + 0 & 0 & 0 & 1} + \right] + = \left[\matrix{0 & 1 & 0 & 0\cr + 0 & 0 & 1 & 0\cr + 1 & 0 & 0 & -4\cr + 0 & 0 & 0 & 1} + \right] + \left[\matrix{0 & 0 & 1 & 4\cr + 1 & 0 & 0 & 0\cr + 0 & 1 & 0 & 0\cr + 0 & 0 & 0 & 1} + \right]\eqno(1.55)$$ + +\noindent +In general, given a transform with elements + +$${\bf T} = \left[\matrix{n_x & o_x & a_x & p_x\cr + n_y & o_y & a_y & p_y\cr + n_z & o_z & a_z & p_z\cr + 0 & 0 & 0 & 1} + \right]\eqno(1.56)$$ + +\noindent +then the inverse is + +$${\bf T^{-1}} = \left[\matrix{n_x & n_y & n_z & -{\bf p} \cdot {\bf n}\cr + o_x & o_y & o_z & -{\bf p} \cdot {\bf o}\cr + a_x & a_y & a_z & -{\bf p} \cdot {\bf a}\cr + 0 & 0 & 0 & 1} + \right]\eqno(1.57)$$ + +\noindent +where {\bf p}, {\bf n}, {\bf o}, and {\bf a} are the four column +vectors and ``$\cdot$'' represents the vector dot product. This result +is easily verified by postmultiplying Equation 1.56 by Equation 1.57. + +\subsection{General Rotation Transformation} + +\noindent +We state the rotation transformations for rotations about the $x$, +$y$, and $z$ axes (Equations 1.32, 1.33 and 1.34). These +transformations have a simple geometric interpretation. For example, +in the case of a rotation about the $z$ axis, the column representing +the $z$ axis will remain constant, while the column elements +representing the $x$ and $y$ axes will vary. + +\noindent +We will now develop the transformation matrix representing a rotation +around an arbitrary vector {\bf k} located at the origin. In order to +do this we will imagine that {\bf k} is the $z$ axis unit vector of a +coordinate frame {\bf C} + +$${\bf C} = \left[\matrix{n_x & o_x & a_x & p_x\cr + n_y & o_y & a_y & p_y\cr + n_z & o_z & a_z & p_z\cr + 0 & 0 & 0 & 1} + \right]\eqno(1.58)$$ + +$${\bf k} = a_x{\bf i} + a_y{\bf j} + a_z{\bf k}\eqno(1.59)$$ + +\noindent +Rotating around the vector {\bf k} is then equivalent to rotating +around the $z$ axis of the frame {\bf C}. + +$${\bf Rot(k,\theta)} = {\bf Rot(^C{\bf z},\theta)}\eqno(1.60)$$ + +\noindent +If we are given a frame {\bf T} described with respect to the +reference coordinate frame, we can find a frame {\bf X} which +describes the same frame with respect to frame {\bf C} as + +$${\bf T} = {\bf C} {\bf X}\eqno(1.61)$$ + +\noindent +where {\bf X} describes the position of {\bf T} with respect to frame +{\bf C}. Solving for {\bf X} we obtain + +$${\bf X} = {\bf C^{-1}} {\bf T}\eqno(1.62)$$ + +\noindent +Rotation {\bf T} around {\bf k} is equivalent to rotating {\bf X} +around the $z$ axis of frame {\bf C} + +$${\bf Rot(k,\theta)} {\bf T} + = {\bf C} {\bf Rot(z,\theta)} {\bf X}\eqno(1.63)$$ + +$${\bf Rot(k,\theta)} {\bf T} + = {\bf C} {\bf Rot(z,\theta)} {\bf C^{-1}} {\bf T}.\eqno(1.64)$$ + +\noindent +Thus + +$${\bf Rot(k,\theta)} + = {\bf C} {\bf Rot(z,\theta)} {\bf C^{-1}}\eqno(1.65)$$ + +\noindent +However, we have only {\bf k}, the $z$ axis of the frame {\bf C}. By +expanding equation 1.65 we will discover that +${\bf C} {\bf Rot(z,\theta)} {\bf C^{-1}}$ is a function of {\bf k} +only. + +Multiplying ${\bf Rot(z,\theta)}$ on the right by ${\bf C^{-1}}$ we +obtain + +$${\bf Rot(z,\theta)} {\bf C^{-1}} + = \left[\matrix{cos \theta & -sin \theta & 0 & 0\cr + sin \theta & cos \theta & 0 & 0\cr + 0 & 0 & 1 & 0\cr + 0 & 0 & 0 & 1} + \right] + \left[\matrix{n_x & n_y & n_z & 0\cr + o_x & o_x & o_z & 0\cr + a_x & a_y & a_z & 0\cr + 0 & 0 & 0 & 1} + \right]$$ + +$$ = \left[\matrix{n_x cos \theta - o_x sin \theta & + n_y cos \theta - o_y sin \theta & + n_z cos \theta - o_z sin \theta & 0\cr + n_x sin \theta + o_x cos \theta & + n_y sin \theta + o_y cos \theta & + n_z sin \theta + o_z cos \theta & 0\cr + a_x & a_y & a_z & 0\cr + 0 & 0 & 0 & 1} + \right]\eqno(1.66)$$ + +\noindent +premultiplying by + +$${\bf C} = \left[\matrix{n_x & o_x & a_x & 0\cr + n_y & o_y & a_y & 0\cr + n_z & o_z & a_z & 0\cr + 0 & 0 & 0 & 1} + \right]\eqno(1.67)$$ + +\noindent +we obtain ${\bf C} {\bf Rot(z,\theta)} {\bf C^{-1}}$ + +$$\left[\matrix{ +n_x n_x cos \theta - n_x o_x sin \theta + n_x o_x sin \theta + o_x o_x +cos \theta + a_x a_x\cr +n_y n_x cos \theta - n_y o_x sin \theta + n_x o_y sin \theta + o_x o_y +cos \theta + a_y a_x\cr +n_z n_x cos \theta - n_z o_x sin \theta + n_x o_z sin \theta + o_x o_z +cos \theta + a_z a_x\cr +0} +\right.$$ + +$$\matrix{ +n_x n_y cos \theta - n_x o_y sin \theta + n_y o_x sin \theta + o_y o_x +cos \theta + a_x a_y\cr +n_y n_y cos \theta - n_y o_y sin \theta + n_y o_y sin \theta + o_y o_y +cos \theta + a_y a_y\cr +n_z n_y cos \theta - n_z o_y sin \theta + n_y o_z sin \theta + o_y o_z +cos \theta + a_z a_y\cr +0}\eqno(1.68)$$ + +$$\left.\matrix{ +n_x n_z cos \theta - n_x o_z sin \theta + n_z o_x sin \theta + o_z o_x +cos \theta + a_x a_x & 0\cr +n_y n_z cos \theta - n_y o_z sin \theta + n_z o_y sin \theta + o_z o_y +cos \theta + a_y a_z & 0\cr +n_z n_z cos \theta - n_z o_z sin \theta + n_z o_z sin \theta + o_z o_z +cos \theta + a_z a_z & 0\cr +0 & 1} +\right]$$ + +\noindent +Simplifying, using the following relationships:\\ +the dot product of any row or column of {\bf C} with any other row or +column is zero, as the vectors are orthogonal;\\ +the dot product of any row or column of {\bf C} with itself is {\bf 1} +as the vectors are of unit magnitude;\\ +the $z$ unit vector is the vector cross product of the $x$ and $y$ +vectors or +$${\bf a} = {\bf n} \times {\bf o}\eqno(1.69)$$ + +\noindent +which has components + +$$a_x = n_y o_z - n_z o_y$$ +$$a_y = n_z o_x - n_x o_z$$ +$$a_z = n_x o_y - n_y o_x$$ + +\noindent +the versine, abbreviated ${\bf vers \ \theta}$, is defined as +${\bf vers \ \theta} = (1 - cos \ \theta)$, +${k_x = a_x}$, ${k_y = a_y}$ and ${k_z = a_z}$. +We obtain ${\bf Rot(k,\theta)} =$ +$$\left[\matrix{ +k_x k_x vers \theta + cos \theta & +k_y k_x vers \theta - k_z sin \theta & +k_z k_x vers \theta + k_y sin \theta & +0\cr +k_x k_y vers \theta + k_z sin \theta & +k_y k_y vers \theta + cos \theta & +k_z k_y vers \theta - k_x sin \theta & +0\cr +k_x k_z vers \theta - k_y sin \theta & +k_y k_z vers \theta + k_x sin \theta & +k_z k_z vers \theta + cos \theta & +0\cr +0 & 0 & 0 & 1} +\right]\eqno(1.70)$$ + +\noindent +This is an important result and should be thoroughly understood before +proceeding further. + +From this general rotation transformation we can obtain each of the +elementary rotation transforms. For example ${\bf Rot(x,\theta)}$ is +${\bf Rot(k,\theta)}$ where ${k_x = 1}$, ${k_y = 0}$, and +${k_z = 0}$. Substituting these values of {\bf k} into Equation 1.70 +we obtain + +$${\bf Rot(x,\theta)} = +\left[\matrix{1 & 0 & 0 & 0\cr + 0 & cos \theta & -sin \theta & 0\cr + 0 & sin \theta & cos \theta & 0\cr + 0 & 0 & 0 & 1} +\right]\eqno(1.71)$$ + +\noindent +as before. + +\subsection{Equivalent Angle and Axis of Rotation} + +\noindent +Given any arbitrary rotational transformation, we can use Equation +1.70 to obtain an axis about which an equivalent rotation $\theta$ is +made as follows. Given a rotational transformation {\bf R} + +$${\bf R} = +\left[\matrix{n_x & o_x & a_x & 0\cr + n_y & o_y & a_y & 0\cr + n_z & o_z & a_z & 0\cr + 0 & 0 & 0 & 1} +\right]\eqno(1.72)$$ + +\noindent +we may equate {\bf R} to {\bf Rot(k,$\theta$)} + +$$\left[\matrix{n_x & o_x & a_x & 0\cr + n_y & o_y & a_y & 0\cr + n_z & o_z & a_z & 0\cr + 0 & 0 & 0 & 1} + \right] = $$ +$$\left[\matrix{ +k_x k_x vers \theta + cos \theta & +k_y k_x vers \theta - k_z sin \theta & +k_z k_x vers \theta + k_y sin \theta & +0\cr +k_x k_y vers \theta + k_z sin \theta & +k_y k_y vers \theta + cos \theta & +k_z k_y vers \theta - k_x sin \theta & +0\cr +k_x k_z vers \theta - k_y sin \theta & +k_y k_z vers \theta + k_x sin \theta & +k_z k_z vers \theta + cos \theta & +0\cr +0 & 0 & 0 & 1} +\right]\eqno(1.73)$$ + +\noindent +Summing the diagonal terms of Equation 1.73 we obtain + +$$n_x+o_y+a_z+1= +k_x^2 vers \theta + cos \theta + +k_y^2 vers \theta + cos \theta + +k_z^2 vers \theta + cos \theta + 1\eqno(1.74)$$ + +$$\left.\matrix{ n_x+o_y+a_z & = & + (k_x^2+k_y^2+k_z^2)vers \theta + 3 cos \theta\cr + & = & 1 + 2 cos \theta} + \right.\eqno(1.75)$$ + +\noindent +and the cosine of the angle of rotation is + +$$cos \theta = {1\over 2}(n_x+o_y+a_z-1)\eqno(1.76)$$ + +\noindent +Differencing pairs of off-diagonal terms in Equation 1.73 we obtain + +$$o_z - a_y = 2 k_x sin \theta\eqno(1.77)$$ +$$a_x - n_z = 2 k_y sin \theta\eqno(1.78)$$ +$$n_y - o_x = 2 k_z sin \theta\eqno(1.79)$$ + +\noindent +Squaring and adding Equations 1.77-1.79 we obtain an expression for +$sin \theta$ + +$$(o_z - a_y)^2 + (a_x - n_z)^2 + (n_y - o_x)^2 + = 4 sin^2 \theta\eqno(1.80)$$ + +\noindent +and the sine of the angle of rotation is + +$$sin \ \theta = + \pm {1\over 2} \sqrt{(o_z - a_y)^2 + (a_x - n_z)^2 + (n_y - o_x)^2} + \eqno(1.81)$$ + +\noindent +We may define the rotation to be positive about the vector {\bf k} +such that $0 \leq \theta \leq 180^\circ$. In this case the $+$ sign +is appropriate in Equation 1.81 and thus the angle of rotation +$\theta$ is uniquely defined as + +$$tan \ \theta = + {\sqrt{(o_z - a_y)^2 + (a_x - n_z)^2 + (n_y - o_x)^2} + \over + {(n_x + o_y + a_z -1)}}\eqno(1.82)$$ + +\noindent +The components of {\bf k} may be obtained from Equations 1.77-1.79 as + +$$k_x = {{o_z - a_y}\over{2 sin \theta}}\eqno(1.83)$$ +$$k_y = {{a_x - n_z}\over{2 sin \theta}}\eqno(1.84)$$ +$$k_z = {{n_y - o_x}\over{2 sin \theta}}\eqno(1.85)$$ + +When the angle of rotation is very small, the axis of rotation is +physically not well defined due to the small magnitude of both +numerator and denominator in Equations 1.83-1.85. If the resulting +angle is small, the vector {\bf k} should be renormalized to ensure +that $\left|{\bf k}\right| = 1$. When the angle of rotation approaches +$180^\circ$ the vector {\bf k} is once again poorly defined by +Equation 1.83-1.85 as the magnitude of the sine is again +decreasing. The axis of rotation is, however, physically well defined +in this case. When $\theta < 150^\circ$, the denominator of +Equations 1.83-1.85 is less than 1. As the angle increases to +$180^\circ$ the rapidly decreasing magnitude of both numerator and +denominator leads to considerable inaccuracies in the determination of +{\bf k}. At $\theta = 180^\circ$, Equations 1.83-1.85 are of the form +$0/0$, yielding no information at all about a physically well defined +vector {\bf k}. If the angle of rotation is greater than $90^\circ$, +then we must follow a different approach in determining {\bf +k}. Equating the diagonal elements of Equation 1.73 we obtain + +$$k_x^2 vers \theta + cos \theta = n_x\eqno(1.86)$$ +$$k_y^2 vers \theta + cos \theta = o_y\eqno(1.87)$$ +$$k_z^2 vers \theta + cos \theta = a_z\eqno(1.88)$$ + +Substituting for $cos \theta$ and $vers \theta$ from Equation 1.76 and +solving for the elements of {\bf k} we obtain further + +$$k_x = + \pm \sqrt{{{n_x - cos \theta}\over{1 - cos \theta}}}\eqno(1.89)$$ +$$k_y = + \pm \sqrt{{{o_y - cos \theta}\over{1 - cos \theta}}}\eqno(1.90)$$ +$$k_z = + \pm \sqrt{{{a_z - cos \theta}\over{1 - cos \theta}}}\eqno(1.91)$$ + +\noindent +The largest component of {\bf k} defined by Equations 1.89-1.91 +corresponds to the most positive component of $n_x$, $o_y$, and +$a_z$. For this largest element, the sign of the radical can be +obtained from Equations 1.77-1.79. As the sine of the angle of +rotation $\theta$ must be positive, then the sign of the component of +{\bf k} defined by Equations 1.77-1.79 must be the same as the sign of +the left hand side of these equations. Thus we may combine Equations +1.89-1.91 with the information contained in Equations 1.77-1.79 as +follows + +$$k_x = sgn(o_z-a_y)\sqrt{{{(n_x-cos \theta)} + \over + {1-cos \theta}}}\eqno(1.92)$$ + +$$k_y = sgn(a_x-n_z)\sqrt{{{(o_y-cos \theta)} + \over + {1-cos \theta}}}\eqno(1.93)$$ + +$$k_z = sgn(n_y-o_x)\sqrt{{{(a_z-cos \theta)} + \over + {1-cos \theta}}}\eqno(1.94)$$ + +\noindent +where $sgn(e) = +1$ if $e \ge 0$ and $sgn(e) = -1$ if $e \le 0$. + +Only the largest element of {\bf k} is determined from Equations +1.92-1.94, corresponding to the most positive element of $n_x$, $o_y$, +and $a_z$. The remaining elements are more accurately determined by +the following equations formed by summing pairs of off-diagonal +elements of Equation 1.73 + +$$n_y + o_x = 2 k_x k_y vers \theta\eqno(1.95)$$ +$$o_z + a_y = 2 k_y k_z vers \theta\eqno(1.96)$$ +$$n_z + a_x = 2 k_z k_x vers \theta\eqno(1.97)$$ + +\noindent +If $k_x$ is largest then + +$$k_y = {{n_y + o_x}\over{2 k_x vers \theta}} + {\rm \ \ \ \ \ from \ Equation \ 1.95}\eqno(1.98)$$ + +$$k_z = {{a_x + n_z}\over{2 k_x vers \theta}} + {\rm \ \ \ \ \ from \ Equation \ 1.97}\eqno(1.99)$$ + +\noindent +If $k_y$ is largest then + +$$k_x = {{n_y + o_x}\over{2 k_y vers \theta}} + {\rm \ \ \ \ \ from \ Equation \ 1.95}\eqno(1.100)$$ + +$$k_z = {{o_z + a_y}\over{2 k_y vers \theta}} + {\rm \ \ \ \ \ from \ Equation \ 1.96}\eqno(1.101)$$ + +\noindent +If $k_z$ is largest then + +$$k_x = {{a_x + n_z}\over{2 k_z vers \theta}} + {\rm \ \ \ \ \ from \ Equation \ 1.97}\eqno(1.102)$$ + +$$k_y = {{o_z + a_y}\over{2 k_z vers \theta}} + {\rm \ \ \ \ \ from \ Equation \ 1.96}\eqno(1.103)$$ + +\subsection{Example 1.1} + +\noindent +Determine the equivalent axis and angle of rotation for the matrix +given in Equations 1.41 + +$${\bf Rot(y,90)}{\bf Rot(z,90)} + = \left[\matrix{0 & 0 & 1 & 0\cr + 1 & 0 & 0 & 0\cr + 0 & 1 & 0 & 0\cr + 0 & 0 & 0 & 1} + \right]\eqno(1.104)$$ + +\noindent +We first determine ${\bf cos \ \theta}$ from Equation 1.76 + +$$cos \theta = {{1}\over{2}}(0 + 0 + 0 - 1) + = -{{1}\over{2}}\eqno(1.105)$$ + +\noindent +and $sin \ \theta$ from Equation 1.81 + +$$sin \theta = {{1}\over{2}}\sqrt{(1-0)^2+(1-0)^2+(1-0)^2} + = {{\sqrt3}\over{2}}\eqno(1.106)$$ + +\noindent +Thus + +$$\theta = tan^{-1}\left({{\sqrt3}\over{2}} + \raise15pt\hbox{$\bigslash$} + {{-1}\over{2}}\right) + = 120^\circ\eqno(1.107)$$ + +\noindent +As $\theta > 90$, we determine the largest component of {\bf k} +corresponding to the largest element on the diagonal. As all diagonal +elements are equal in this example we may pick any one. We will pick +$k_x$ given by Equation 1.92 + +$$k_x = +\sqrt{(0 + {{1}\over{2}}) + \raise15pt\hbox{$\bigslash$} + (1 + {{1}\over{2}})} + = {{1}\over{\sqrt{3}}}\eqno(1.108)$$ + +\noindent +As we have determined $k_x$ we may now determine $k_y$ and $k_z$ from +Equations 1.98 and 1.99, respectively + +$$k_y = {{1+0}\over{\sqrt{3}}} = {{1}\over{\sqrt{3}}}\eqno(1.109)$$ + +$$k_z = {{1+0}\over{\sqrt{3}}} = {{1}\over{\sqrt{3}}}\eqno(1.110)$$ + +\noindent +In summary, then + +$${\bf Rot(y,90)}{\bf Rot(z,90)} = {\bf Rot(k,120)}\eqno(1.111)$$ + +\noindent +where + +$${\bf k} = {{1}\over{\sqrt{3}}} {\bf i} + + {{1}\over{\sqrt{3}}} {\bf j} + + {{1}\over{\sqrt{3}}} {\bf k}\eqno(1.112)$$ + +Any combination of rotations is always equivalent to a single rotation +about some axis {\bf k} by an angle $\theta$, an important result +that we will make use of later. + +\subsection{Stretching and Scaling} + +A transform {\bf T} + +$${\bf T} = \left[\matrix{a & 0 & 0 & 0\cr + 0 & b & 0 & 0\cr + 0 & 0 & c & 0\cr + 0 & 0 & 0 & 1} + \right]\eqno(1.113)$$ + +\noindent +will stretch objects uniformly along the $x$ axis by a factor $a$, +along the $y$ axis by a factor $b$, and along the $z$ axis by a factor +$c$. Consider any point on an object $x{\bf i}+y{\bf j}+z{\bf k}$; its +tranform is + +$$\left[\matrix{ax\cr + by\cr + cz\cr + 1} + \right] + = \left[\matrix{a & 0 & 0 & 0\cr + 0 & b & 0 & 0\cr + 0 & 0 & c & 0\cr + 0 & 0 & 0 & 1} + \right] + \left[\matrix{x\cr + y\cr + z\cr + 1} + \right]\eqno(1.114)$$ + +\noindent +indicating stretching as stated. Thus a cube could be transformed into +a rectangular parallelepiped by such a transform. + +The Axiom code to perform this scale change is: + +<>= + scale(scalex, scaley, scalez) == + matrix(_ + [[scalex, 0 ,0 , 0], _ + [0 , scaley ,0 , 0], _ + [0 , 0, scalez, 0], _ + [0 , 0, 0 , 1]]) +@ +\noindent +The transform {\bf S} where + +$${\bf S} = \left[\matrix{s & 0 & 0 & 0\cr + 0 & s & 0 & 0\cr + 0 & 0 & s & 0\cr + 0 & 0 & 0 & 1} + \right]\eqno(1.115)$$ + +\noindent +will scale any object by the factor $s$. + +\subsection{Perspective Transformations} + +\noindent +Consider the image formed of an object by a simple lens. + +The axis of the lens is along the $y$ axis for convenience. An object +point $x$,$y$,$z$ is imaged at $x^\prime$,$y^\prime$,$z^\prime$ if the +lens has a focal length $f$ ($f$ is considered positive). $y^\prime$ +represents the image distance and varies with object distance $y$. If +we plot points on a plane perpendicular to the $y$ axis located at +$y^\prime$ (the film plane in a camera), then a perspective image is +formed. + +We will first obtain values of $x^\prime$, $y^\prime$, and $z^\prime$, +then introduce a perspective transformation and show that the same +values are obtained. + +Based on the fact that a ray passing through the center of the lens is +undeviated we may write + +$${\rm \ \ \ \ \ }{{z}\over{y}} = {{z^\prime}\over{y^\prime}}\eqno(1.116)$$ + +$${\rm and\ } {{x}\over{y}} = {{x^\prime}\over{y^\prime}}\eqno(1.117)$$ + +Based on the additional fact that a ray parallel to the lens axis +passes through the focal point $f$, we may write + +$${\rm \ \ \ \ \ }{{z}\over{f}} + = {{z^\prime}\over{y^\prime + f}}\eqno(1.118)$$ + +$${\rm and\ } {{x}\over{f}} + = {{x^\prime}\over{y^\prime + f}}\eqno(1.119)$$ + +\noindent +Notice that $x^\prime$, $y^\prime$, and $z^\prime$ are negative and +that $f$ is positive. Eliminating $y^\prime$ between Equations 1.116 +and 1.118 we obtain + +$${{z}\over{f}} + = {{z^\prime}\over{({{z^\prime y}\over{z}} + f)}}\eqno(1.120)$$ + +\noindent +and solving for $z^\prime$ we obtain the result + +$$z^\prime = {{z}\over{(1 - {{y}\over{f}})}}\eqno(1.121)$$ + +\noindent +Working with Equations 1.117 and 1.119 we can similarly obtain + +$$x^\prime = {{x}\over{(1 - {{y}\over{f}})}}\eqno(1.122)$$ + +\noindent +In order to obtain the image distance $y^\prime$ we rewrite Equations +1.116 and 1.118 as + +$${{z}\over{z^\prime}} = {{y}\over{y^\prime}}\eqno(1.123)$$ + +\noindent +and + +$${{z}\over{z^\prime}} = {{f}\over{y^\prime + f}}\eqno(1.124)$$ + +\noindent +thus + +$${{y}\over{y^\prime}} = {{f}\over{y^\prime + f}}\eqno(1.125)$$ + +\noindent +and solving for $y^\prime$ we obtain the result + +$$y^\prime = {{y}\over{(1-{{y}\over{f}})}}\eqno(1.126)$$ + +The homogeneous transformation {\bf P} which produces the same result +is + +$${\bf P} = \left[\matrix{1 & 0 & 0 & 0\cr + 0 & 1 & 0 & 0\cr + 0 & 0 & 1 & 0\cr + 0 & -{{1}\over{f}} & 0 & 1} + \right]\eqno(1.127)$$ + +\noindent +as any point $x{\bf i}+y{\bf j}+z{\bf k}$ transforms as + +$$\left[\matrix{x\cr + y\cr + z\cr + {1 - {{{y}\over{f}}}}} + \right] + = \left[\matrix{1 & 0 & 0 & 0\cr + 0 & 1 & 0 & 0\cr + 0 & 0 & 1 & 0\cr + 0 & -{{1}\over{f}} & 0 & 1} + \right] + \left[\matrix{x\cr + y\cr + z\cr + 1} + \right]\eqno(1.128)$$ + +\noindent +The image point $x^\prime$, $y^\prime$,, $z^\prime$, obtained by +dividing through by the weight factor $(1 - {{y}\over{f}})$, is + +$${{x}\over{(1 - {{y}\over{f}})}}{\bf i} + + {{y}\over{(1 - {{y}\over{f}})}}{\bf j} + + {{z}\over{(1 - {{y}\over{f}})}}{\bf k} \eqno(1.129)$$ + +\noindent +This is the same result that we obtained above. + +A transform similar to {\bf P} but with $-{{1}\over{f}}$ at the bottom +of the first column produces a perspective transformation along the +$x$ axis. If the $-{{1}\over{f}}$ term is in the third column then the +projection is along the $z$ axis. + +\subsection{Transform Equations} + +\noindent We will frequently be required to deal with transform +equations in which a coordinate frame is described in two or more +ways. A manipulator is positioned with respect to base coordinates by +a transform {\bf Z}. The end of the manipulator is described by a +transform $^Z{\bf T}_6$, and the end effector is described by +$^{T_6}{\bf E}$. An object is positioned with respect to base +coordinates by a transform {\bf B}, and finally the manipulator end +effector is positioned with respect to the object by $^B{\bf G}$. We +have two descriptions of the position of the end effector, one with +respect to the object and one with respect to the manipulator. As both +positions are the same, we may equate the two descriptions + +$${\bf Z}{^Z{\bf T}_6}{^{T_6}{\bf E}} + = {\bf B}{^B{\bf G}}\eqno(1.130)$$ + +If we wish to solve Equation 1.130 for the manipulator transform +${\bf T}_6$ we must premultiply Equation 1.130 by ${\bf Z}^{-1}$ and +postmultiply by ${\bf E}^{-1}$ to obtain + +$${\bf T}_6 + = {{\bf Z}^{-1}} {\bf B} {\bf G} {{\bf E}^{-1}}\eqno(1.131)$$ + +\noindent +As a further example, consider that the position of the object {\bf B} +is unknown, but that the manipulator is moved such that the end +effector is positioned over the object correctly. We may then solve +for {\bf B} from Equation 1.130 by postmultiplying by ${\bf G}^{-1}$. + +$${\bf B} = {\bf Z}{{\bf T}_6}{\bf E}{{\bf G}^{-1}}\eqno(1.133)$$ + +\subsection{Summary} + +\noindent +Homogeneous transformations may be readily used to describe the +positions and orientations of coordinate frames in space. If a +coordinate frame is embedded in an object then the position and +orientation of the object are also readily described. + +The description of object A in terms of object B by means of a +homogeneous transformation may be inverted to obtain the description +of object B in terms of object A. This is not a property of a simple +vector description of the relative displacement of one object with +respect to another. + +Transformations may be interpreted as a product of rotation and +translation transformations. If they are intrepreted from left to +right, then the rotations and translations are in terms of the +currently defined coordinate frame. If they are interpreted from right +to left, then the rotations and translations are described with +respect to the reference coordinate frame. + +Homogeneous transformations describe coordinate frames in terms of +rectangular components, which are the sines and cosines of +angles. This description may be related to rotations in which case the +description is in terms of a vector and angle of rotation. + +\pagehead{DenavitHartenbergMatrix}{DHMATRIX} +\pagepic{ps/v103denavithartenbergmatrix.ps}{DHMATRIX}{1.00} +<>= + +++ 4x4 Matrices for coordinate transformations +++ Author: Timothy Daly +++ Date Created: June 26, 1991 +++ Date Last Updated: 26 June 1991 +++ Description: +++ This package contains functions to create 4x4 matrices +++ useful for rotating and transforming coordinate systems. +++ These matrices are useful for graphics and robotics. +++ (Reference: Robot Manipulators Richard Paul MIT Press 1981) + + +)abbrev domain DHMATRIX DenavitHartenbergMatrix + +--% DHMatrix + +DenavitHartenbergMatrix(R): Exports == Implementation where + ++ A Denavit-Hartenberg Matrix is a 4x4 Matrix of the form: + ++ \spad{nx ox ax px} + ++ \spad{ny oy ay py} + ++ \spad{nz oz az pz} + ++ \spad{0 0 0 1} + ++ (n, o, and a are the direction cosines) + R : Join(Field, TranscendentalFunctionCategory) + +-- for the implementation of dhmatrix + minrow ==> 1 + mincolumn ==> 1 +-- + nx ==> x(1,1)::R + ny ==> x(2,1)::R + nz ==> x(3,1)::R + ox ==> x(1,2)::R + oy ==> x(2,2)::R + oz ==> x(3,2)::R + ax ==> x(1,3)::R + ay ==> x(2,3)::R + az ==> x(3,3)::R + px ==> x(1,4)::R + py ==> x(2,4)::R + pz ==> x(3,4)::R + row ==> Vector(R) + col ==> Vector(R) + radians ==> pi()/180 + + Exports ==> MatrixCategory(R,row,col) with + "*": (%, Point R) -> Point R + ++ t*p applies the dhmatrix t to point p + identity: () -> % + ++ identity() create the identity dhmatrix + rotatex: R -> % + ++ rotatex(r) returns a dhmatrix for rotation about axis X for r degrees + rotatey: R -> % + ++ rotatey(r) returns a dhmatrix for rotation about axis Y for r degrees + rotatez: R -> % + ++ rotatez(r) returns a dhmatrix for rotation about axis Z for r degrees + scale: (R,R,R) -> % + ++ scale(sx,sy,sz) returns a dhmatrix for scaling in the X, Y and Z + ++ directions + translate: (R,R,R) -> % + ++ translate(X,Y,Z) returns a dhmatrix for translation by X, Y, and Z + + Implementation ==> Matrix(R) add + + identity() == matrix([[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]) + +-- inverse(x) == (inverse(x pretend (Matrix R))$Matrix(R)) pretend % +-- dhinverse(x) == matrix( _ +-- [[nx,ny,nz,-(px*nx+py*ny+pz*nz)],_ +-- [ox,oy,oz,-(px*ox+py*oy+pz*oz)],_ +-- [ax,ay,az,-(px*ax+py*ay+pz*az)],_ +-- [ 0, 0, 0, 1]]) + + d * p == + v := p pretend Vector R + v := concat(v, 1$R) + v := d * v + point ([v.1, v.2, v.3]$List(R)) + +<> + +<> + +<> + +<> + +<> + +@ + +\chapter{Chunk collections} +<>= +<> +@ \begin{thebibliography}{99} \end{thebibliography} +\chapter{Index} \printindex \end{document} diff --git a/books/ps/v103denavithartenbergmatrix.ps b/books/ps/v103denavithartenbergmatrix.ps new file mode 100644 index 0000000..b796658 --- /dev/null +++ b/books/ps/v103denavithartenbergmatrix.ps @@ -0,0 +1,248 @@ +%!PS-Adobe-2.0 +%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006) +%%For: (root) root +%%Title: pic +%%Pages: (atend) +%%BoundingBox: 36 36 134 80 +%%EndComments +save +%%BeginProlog +/DotDict 200 dict def +DotDict begin + +/setupLatin1 { +mark +/EncodingVector 256 array def + EncodingVector 0 + +ISOLatin1Encoding 0 255 getinterval putinterval +EncodingVector 45 /hyphen put + +% Set up ISO Latin 1 character encoding +/starnetISO { + dup dup findfont dup length dict begin + { 1 index /FID ne { def }{ pop pop } ifelse + } forall + /Encoding EncodingVector def + currentdict end definefont +} def +/Times-Roman starnetISO def +/Times-Italic starnetISO def +/Times-Bold starnetISO def +/Times-BoldItalic starnetISO def +/Helvetica starnetISO def +/Helvetica-Oblique starnetISO def +/Helvetica-Bold starnetISO def +/Helvetica-BoldOblique starnetISO def +/Courier starnetISO def +/Courier-Oblique starnetISO def +/Courier-Bold starnetISO def +/Courier-BoldOblique starnetISO def +cleartomark +} bind def + +%%BeginResource: procset graphviz 0 0 +/coord-font-family /Times-Roman def +/default-font-family /Times-Roman def +/coordfont coord-font-family findfont 8 scalefont def + +/InvScaleFactor 1.0 def +/set_scale { + dup 1 exch div /InvScaleFactor exch def + dup scale +} bind def + +% styles +/solid { [] 0 setdash } bind def +/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def +/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def +/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def +/bold { 2 setlinewidth } bind def +/filled { } bind def +/unfilled { } bind def +/rounded { } bind def +/diagonals { } bind def + +% hooks for setting color +/nodecolor { sethsbcolor } bind def +/edgecolor { sethsbcolor } bind def +/graphcolor { sethsbcolor } bind def +/nopcolor {pop pop pop} bind def + +/beginpage { % i j npages + /npages exch def + /j exch def + /i exch def + /str 10 string def + npages 1 gt { + gsave + coordfont setfont + 0 0 moveto + (\() show i str cvs show (,) show j str cvs show (\)) show + grestore + } if +} bind def + +/set_font { + findfont exch + scalefont setfont +} def + +% draw aligned label in bounding box aligned to current point +/alignedtext { % width adj text + /text exch def + /adj exch def + /width exch def + gsave + width 0 gt { + text stringwidth pop adj mul 0 rmoveto + } if + [] 0 setdash + text show + grestore +} def + +/boxprim { % xcorner ycorner xsize ysize + 4 2 roll + moveto + 2 copy + exch 0 rlineto + 0 exch rlineto + pop neg 0 rlineto + closepath +} bind def + +/ellipse_path { + /ry exch def + /rx exch def + /y exch def + /x exch def + matrix currentmatrix + newpath + x y translate + rx ry scale + 0 0 1 0 360 arc + setmatrix +} bind def + +/endpage { showpage } bind def +/showpage { } def + +/layercolorseq + [ % layer color sequence - darkest to lightest + [0 0 0] + [.2 .8 .8] + [.4 .8 .8] + [.6 .8 .8] + [.8 .8 .8] + ] +def + +/layerlen layercolorseq length def + +/setlayer {/maxlayer exch def /curlayer exch def + layercolorseq curlayer 1 sub layerlen mod get + aload pop sethsbcolor + /nodecolor {nopcolor} def + /edgecolor {nopcolor} def + /graphcolor {nopcolor} def +} bind def + +/onlayer { curlayer ne {invis} if } def + +/onlayers { + /myupper exch def + /mylower exch def + curlayer mylower lt + curlayer myupper gt + or + {invis} if +} def + +/curlayer 0 def + +%%EndResource +%%EndProlog +%%BeginSetup +14 default-font-family set_font +1 setmiterlimit +% /arrowlength 10 def +% /arrowwidth 5 def + +% make sure pdfmark is harmless for PS-interpreters other than Distiller +/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse +% make '<<' and '>>' safe on PS Level 1 devices +/languagelevel where {pop languagelevel}{1} ifelse +2 lt { + userdict (<<) cvn ([) cvn load put + userdict (>>) cvn ([) cvn load put +} if + +%%EndSetup +%%Page: 1 1 +%%PageBoundingBox: 36 36 134 80 +%%PageOrientation: Portrait +gsave +36 36 98 44 boxprim clip newpath +36 36 translate +0 0 1 beginpage +1.0000 set_scale +4 4 translate 0 rotate +0.167 0.600 1.000 graphcolor +0.167 0.600 1.000 graphcolor +newpath -6 -6 moveto +-6 42 lineto +96 42 lineto +96 -6 lineto +closepath +fill +0.167 0.600 1.000 graphcolor +newpath -6 -6 moveto +-6 42 lineto +96 42 lineto +96 -6 lineto +closepath +stroke +0.000 0.000 0.000 graphcolor +14.00 /Times-Roman set_font +% CATEGORY +[ /Rect [ 0 0 90 36 ] + /Border [ 0 0 0 ] + /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=CATEGORY) >> + /Subtype /Link +/ANN pdfmark +gsave 10 dict begin +filled +0.537 0.247 0.902 nodecolor +0.537 0.247 0.902 nodecolor +newpath 90 36 moveto +0 36 lineto +0 0 lineto +90 0 lineto +closepath +fill +0.537 0.247 0.902 nodecolor +newpath 90 36 moveto +0 36 lineto +0 0 lineto +90 0 lineto +closepath +stroke +gsave 10 dict begin +0.000 0.000 0.000 nodecolor +7 13 moveto +(CATEGORY) +[9.12 9.36 8.64 8.64 10.08 10.08 8.4 10.08] +xshow +end grestore +end grestore +endpage +showpage +grestore +%%PageTrailer +%%EndPage: 1 +%%Trailer +%%Pages: 1 +end +restore +%%EOF diff --git a/changelog b/changelog index e652236..f081683 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,9 @@ +20081114 tpd books/bookvol10.3 add DHMATRIX +20081114 tpd src/algebra/Makefile remove dhmatrix.spad +20081114 tpd books/ps/v103denavithartenbergmatrix.ps added +20081114 tpd src/algebra/dhmatrix.spad merge with bookvol10.3 +20081114 tpd src/input/Makefile add dhmatrix.input +20081114 tpd src/input/dhmatrix.input regression test DHMATRIX 20081112 tpd books/bookvol10.2 add categories 20081112 tpd books/ps/v102quaternioncategory.ps added 20081112 tpd src/algebra/quat.spad move QUATCAT to bookvol10.2 diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet index e537f92..aef2cd2 100644 --- a/src/algebra/Makefile.pamphlet +++ b/src/algebra/Makefile.pamphlet @@ -172,7 +172,6 @@ LAYER0COPY=\ \subsection{Layer 0} \subsubsection{Completed spad files} \begin{verbatim} -dhmatrix.spad.pamphlet (DHMATRIX) print.spad.pamphlet (PRINT) system.spad.pamphlet (MSYSCMD) \end{verbatim} @@ -485,7 +484,6 @@ carten.spad.pamphlet (GRMOD GRALG CARTEN CARTEN2) clifford.spad.pamphlet (QFORM CLIF) clip.spad.pamphlet (CLIP) coordsys.spad.pamphlet (COORDSYS) -dhmatrix.spad.pamphlet (DHMATRIX) d02routine.spad.pamphlet (D02BBFA D02BHFA D02CJFA D02EJFA) ffpoly2.spad.pamphlet (FFPOLY2) irsn.spad.pamphlet (IRSN) @@ -1189,7 +1187,7 @@ SPADFILES= \ ${OUTSRC}/d03agents.spad ${OUTSRC}/d03package.spad \ ${OUTSRC}/d03routine.spad ${OUTSRC}/d03.spad ${OUTSRC}/ddfact.spad \ ${OUTSRC}/defaults.spad ${OUTSRC}/defintef.spad ${OUTSRC}/defintrf.spad \ - ${OUTSRC}/degred.spad ${OUTSRC}/derham.spad ${OUTSRC}/dhmatrix.spad \ + ${OUTSRC}/degred.spad ${OUTSRC}/derham.spad \ ${OUTSRC}/divisor.spad ${OUTSRC}/dpolcat.spad ${OUTSRC}/drawopt.spad \ ${OUTSRC}/drawpak.spad ${OUTSRC}/draw.spad \ ${OUTSRC}/e01.spad ${OUTSRC}/e02.spad ${OUTSRC}/e04agents.spad \ @@ -1348,7 +1346,7 @@ DOCFILES= \ ${DOC}/d03agents.spad.dvi ${DOC}/d03package.spad.dvi \ ${DOC}/d03routine.spad.dvi ${DOC}/d03.spad.dvi ${DOC}/ddfact.spad.dvi \ ${DOC}/defaults.spad.dvi ${DOC}/defintef.spad.dvi ${DOC}/defintrf.spad.dvi \ - ${DOC}/degred.spad.dvi ${DOC}/derham.spad.dvi ${DOC}/dhmatrix.spad.dvi \ + ${DOC}/degred.spad.dvi ${DOC}/derham.spad.dvi \ ${DOC}/divisor.spad.dvi ${DOC}/dpolcat.spad.dvi ${DOC}/drawopt.spad.dvi \ ${DOC}/drawpak.spad.dvi ${DOC}/draw.spad.dvi \ ${DOC}/e01.spad.dvi ${DOC}/e02.spad.dvi ${DOC}/e04agents.spad.dvi \ diff --git a/src/algebra/dhmatrix.spad.pamphlet b/src/algebra/dhmatrix.spad.pamphlet deleted file mode 100644 index 5c07599..0000000 --- a/src/algebra/dhmatrix.spad.pamphlet +++ /dev/null @@ -1,1741 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/algebra dhmatrix.spad} -\author{Richard Paul and Timothy Daly} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\mathchardef\bigp="3250 -\mathchardef\bigq="3251 -\mathchardef\bigslash="232C -\section{Homogeneous Transformations} -The study of robot manipulation is concerned with the relationship between -objects, and between objects and manipulators. In this chapter we will -develop the representation necessary to describe these relationships. Similar -problems of representation have already been solved in the field of computer -graphics, where the relationship between objects must also be described. -Homogeneous transformations are used in this field and in computer vision -[Duda] [Robserts63] [Roberts65]. These transformations were employed by -Denavit to describe linkages [Denavit] and are now used to describe -manipulators [Pieper] [Paul72] [Paul77b]. - -We will first establish notation for vectors and planes and then introduce -transformations on them. These transformations consist primarily of -translation and rotation. We will then show that these transformations -can also be considered as coordinate frames in which to represent -objects, including the manipulator. The inverse transformation will -then be introduced. A later section describes the general rotation -transformation representing a rotation about a vector. An algorithm is -then described to find the equivalent axis and angle of rotations -represented by any given transformation. A brief section on stretching -and scaling transforms is included together with a section on the -perspective transformation. The chapter concludes with a section on -transformation equations. - -\section{Notation} - -In describing the relationship between objects we will make use of -point vectors, planes, and coordinate frames. Point vectors are -denoted by lower case, bold face characters. Planes are denoted by -script characters, and coordinate frames by upper case, bold face -characters. For example: - -\begin{tabular}{ll} -vectors & {\bf v}, {\bf x1}, {\bf x} \\ -planes & $\bigp$, $\bigq$ \\ -coordinate frames & {\bf I}, {\bf A}, {\bf CONV}\\ -\end{tabular}\\ - -We will use point vectors, planes, and coordinate frames as variables -which have associated values. For example, a point vector has as value -its three Cartesian coordinate components. - -If we wish to describe a point in space, which we will call {\sl p}, -with respect to a coordinate frame {\bf E}, we will use a vector which -we will call {\bf v}. We will write this as - -$$^E{\bf v}$$ - -\noindent -The leading superscript describes the defining coordinate frame. - -We might also wish to describe this same point, {\sl p}, with respect -to a different coordinate frame, for example {\bf H}, using a vector -{\bf w} as - -$$^H{\bf w}$$ - -\noindent -{\bf v} and {\bf w} are two vectors which probably have different -component values and ${\bf v} \ne {\bf w}$ even though both vectors -describe the same point {\sl p}. The case might also exist of a vector -{\bf a} describing a point 3 inches above any frame - -$${^{F^1}}{\bf a}\qquad {^{F^2}}{\bf a}$$ - -\noindent -In this case the vectors are identical but describe different -points. Frequently, the defining frame will be obvious from the text -and the superscripts will be left off. In many cases the name of the -vector will be the same as the name of the object described, for -example, the tip of a pin might be described by a vector {\bf tip} -with respect to a frame {\bf BASE} as - -$${^{BASE}}{\bf tip}$$ - -\noindent -If it were obvious from the text that we were describing the vector -with respect to {\bf BASE} then we might simply write - -$${\bf tip}$$ - -If we also wish to describe this point with respect to another -coordinate frame say, {\bf HAND}, then we must use another vector to -describe this relationship, for example - -$${^{HAND}{\bf tv}}$$ - -\noindent -${^{HAND}{\bf tv}}$ and {\bf tip} both describe the same feature but -have different values. In order to refer to individual components of -coordinate frames, point vectors, or planes, we add subscripts to -indicate the particular component. For example, the vector -${^{HAND}{\bf tv}}$ has components ${^{HAND}{\bf tv}}_{\bf x}$, -${^{HAND}{\bf tv}}_{\bf y}$, ${^{HAND}{\bf tv}}_{\bf z}$. - -\section{Vectors} - -The homogeneous coordinate representation of objects in $n$-space -is an $(n + 1)$-space entity such that a particular perspective -projection recreates the $n$-space. This can also be viewed as the -addition of an extra coordinate to each vector, a scale factor, such -that the vector has the same meaning if each component, including the -scale factor, is multiplied by a constant. - -A point vector - -$${\bf v} = a{\bf i} + b{\bf j} + c{\bf k}\eqno(1.1)$$ - -\noindent -where {\bf i}, {\bf j}, and {\bf k} are unit vectors along the $x$, -$y$, and $z$ coordinate axes, respectively, is represented in -homogeneous coordinates as a column matrix - -$${\bf v} = \left[\matrix{{\bf x}\cr - {\bf y}\cr - {\bf z}\cr - {\bf w}\cr} - \right]\eqno(1.2)$$ - -\noindent -where - -$${{\bf a} = {\bf x}/{\bf w}}$$ -$${{\bf b} = {\bf y}/{\bf w}}\eqno(1.3)$$ -$${{\bf c} = {\bf z}/{\bf w}}$$ - -\noindent -Thus the vector $3{\bf i} + 4{\bf j} + 5{\bf k}$ can be represented as -$[3,4,5,1]^{\rm T}$ or as $[6,8,10,2]^{\rm T}$ or again -as $[-30,-40,-50,-10]^{\rm T}$, -etc. The superscript $T$ indicates the transpose of the row vector -into a column vector. The vector at the origin, the null vector, is -represented as $[0,0,0,n]^{\rm T}$ where $n$ is any non-zero scale -factor. The vector $[0,0,0,0]^{\rm T}$ is undefined. Vectors of the form -$[a,b,c,0]^{\rm T}$ represent vectors at infinity and are used to represent -directions; the addition of any other finite vector does not change -their value in any way. - -We will also make use of the vector dot and cross products. Given two -vectors - -$${\bf a} = a_x{\bf i} + a_y{\bf j} + a_z{\bf k}\eqno(1.4)$$ -$${\bf b} = b_x{\bf i} + b_y{\bf j} + b_z{\bf k}$$ - -\noindent -we define the vector dot product, indicated by ``$\cdot$'' as - -$${\bf a} \cdot {\bf b} = {a_x}{b_x} + {a_y}{b_y} + {a_z}{b_z}\eqno(1.5)$$ - -\noindent -The dot product of two vectors is a scalar. The cross product, -indicated by an ``$\times$'', is another vector perpendicular to the -plane formed by the vectors of the product and is defined by - -$${\bf a} \times {\bf b} = ({a_y}{b_z} - {a_z}{b_y}){\bf i} + - ({a_z}{b_x} - {a_x}{b_z}){\bf j} + - ({a_x}{b_y} - {a_y}{b_x}){\bf k}\eqno(1.6)$$ - -\noindent -This definition is easily remembered as the expansion of the -determinant - -$${\bf a} \times {\bf b} = - \left|\matrix{{\bf i}&{\bf j}&{\bf k}\cr - {a_x}&{a_y}&{a_z}\cr - {b_x}&{b_y}&{b_z}\cr}\right|\eqno(1.7)$$ - -\section{Planes} -A plane is represented as a row matrix - -$$\bigp=[a,b,c,d]\eqno(1.8)$$ - -\noindent -such that if a point {\bf v} lies in a plane $\bigp$ the matrix -product - -$$\bigp{\bf v} = 0\eqno(1.9)$$ - -\noindent -or in expanded form - -$$xa + yb + zc + wd = 0\eqno(1.10)$$ - -\noindent -If we define a constant - -$$m = +\sqrt{a^2 + b^2 + c^2}\eqno(1.11)$$ - -\noindent -and divide Equation 1.10 by $wm$ we obtain - -$${x\over w}{a\over m} + {y\over w}{b\over m} + {z\over w}{c\over m} - = -{d\over m}\eqno(1.12)$$ - -\noindent -The left hand side of Equation 1.12 is the vector dot product of two -vectors $(x/w){\bf i} + (y/w){\bf j} + (z/w){\bf k}$ and -$(a/m){\bf i} + (b/m){\bf j} + (c/m){\bf k}$ and represents the -directed distance of the point -$(x/w){\bf i} + (y/w){\bf j} + (z/w){\bf k}$ along the vector\\ -$(a/m){\bf i} + (b/m){\bf j} + (c/m){\bf k}$. The vector -$(a/m){\bf i} + (b/m){\bf j} + (c/m){\bf k}$ can be interpreted as the -outward pointing normal of a plane situated a distance $-d/m$ from the -origin in the direction of the normal. Thus a plane $\bigp$ parallel -to the $x$,$y$ plane, one unit along the $z$ axis, is represented as - -$${\rm {\ \ \ \ \ \ \ \ \ }} \bigp = [0,0,1,-1]\eqno(1.13)$$ -$${\rm {or\ as\ \ \ }} \bigp = [0,0,2,-2]\eqno(1.14)$$ -$${\rm {\ \ \ \ \ or\ as\ \ \ }} \bigp = [0,0,-100,100]\eqno(1.15)$$ - -\noindent -A point ${\bf v} = [10,20,1,1]$ should lie in this plane - -$$[0,0,-100,100]\left[\matrix{10\cr - 20\cr - 1\cr - 1\cr} - \right] - = 0\eqno(1.16)$$ - -\noindent -or - -$$[0,0,1,-1]\left[\matrix{ -5\cr - -10\cr - -.5\cr - -.5\cr} - \right] - = 0\eqno(1.17)$$ - -\noindent -The point ${\bf v} = [0,0,2,1]$ lies above the plane - -$$[0,0,2,-2]\left[\matrix{0\cr - 0\cr - 2\cr - 1\cr} - \right] - = 2\eqno(1.18)$$ - -and $\bigp{\bf v}$ is indeed positive, indicating that the point is -outside the plane in the direction of the outward pointing normal. A -point ${\bf v} = [0,0,0,1]$ lies below the plane - -$$[0,0,1,-1]\left[\matrix{0\cr - 0\cr - 0\cr - 1\cr} - \right] - = -1\eqno(1.19)$$ - -\noindent -The plane $[0,0,0,0]$ is undefined. - -\section{Transformations} - -\noindent -A transformation of the space {\bf H} is a 4x4 matrix and can -represent translation, rotation, stretching, and perspective -transformations. Given a point {\bf u}, its transformation {\bf v} is -represented by the matrix product - -$${\bf v} = {\bf H}{\bf u}\eqno(1.20)$$ - -\noindent -The corresponding plane transformation $\bigp$ to $\bigq$ is - -$$\bigq = \bigp{\bf H^{-1}}\eqno(1.21)$$ - -\noindent -as we requre that the condition - -$$\bigq{\bf v} = \bigp{\bf u}\eqno(1.22)$$ - -\noindent -is invariant under all transformations. To verify this we substitute -from Equations 1.20 and 1.21 into the left hand side of 1.22 and we -obtain on the right hand side ${\bf H^{-1}}{\bf H}$ which is the -identity matrix {\bf I} - -$$\bigp{\bf H^{-1}}{\bf H}{\bf u} = \bigp{\bf u}\eqno(1.23)$$ - -\section{Translation Transformation} - -\noindent -The transformation {\bf H} corresponding to a translation by a vector -$a{\bf i} + b{\bf j} + c{\bf k}$ is - -$${\bf H} = {\bf Trans(a,b,c)} = - \left[\matrix{1&0&0&a\cr - 0&1&0&b\cr - 0&0&1&c\cr - 0&0&0&1\cr} - \right]\eqno(1.24)$$ - -\noindent -Given a vector ${\bf u} = [x,y,z,w]^{\rm T}$ the transformed vector {\bf v} -is given by - -$${\bf H} = {\bf Trans(a,b,c)} = - \left[\matrix{1&0&0&a\cr - 0&1&0&b\cr - 0&0&1&c\cr - 0&0&0&1\cr} - \right] - \left[\matrix{x\cr - y\cr - z\cr - w\cr} - \right]\eqno(1.25)$$ - -$${\bf v} = \left[\matrix{x + aw\cr - y + bw\cr - z + cw\cr - w\cr} - \right] - = \left[\matrix{x/w + a\cr - y/w + b\cr - z/w + c\cr - 1\cr} - \right]\eqno(1.26)$$ - -\noindent -The translation may also be interpreted as the addition of the two -vectors $(x/w){\bf i} + (y/w){\bf j} + (z/w){\bf k}$ and -$a{\bf i} + b{\bf j} + c{\bf k}$. - -Every element of a transformation matrix may be multiplied by a -non-zero constant without changing the transformation, in the same -manner as points and planes. Consider the vector $2{\bf i} + 3{\bf j} -+ 2{\bf k}$ translated by, or added to\\ -4{\bf i} - 3{\bf j} + 7{\bf k} - -$$\left[\matrix{6\cr - 0\cr - 9\cr - 1\cr} - \right] = - \left[\matrix{1 & 0 & 0 & 4\cr - 0 & 1 & 0 & -3\cr - 0 & 0 & 1 & 7\cr - 0 & 0 & 0 & 1\cr} - \right] - \left[\matrix{2\cr - 3\cr - 2\cr - 1\cr} - \right]\eqno(1.27)$$ - -\noindent -If we multiply the transmation matrix elements by, say, -5, and the -vector elements by 2, we obtain - -$$\left[\matrix{-60\cr - 0\cr - -90\cr - -10\cr} - \right] = - \left[\matrix{-5 & 0 & 0 & -20\cr - 0 & -5 & 0 & 15\cr - 0 & 0 & -5 & -35\cr - 0 & 0 & 0 & -5\cr} - \right] - \left[\matrix{4\cr - 6\cr - 4\cr - 2\cr} - \right]\eqno(1.28)$$ - -\noindent -which corresponds to the vector $[6,0,9,1]^{\rm T}$ as before. The point -$[2,3,2,1]$ lies in the plane $[1,0,0,-2]$ - -$$[1,0,0,-2]\left[\matrix{2\cr - 3\cr - 2\cr - 1\cr} - \right] = 0\eqno(1.29)$$ - -\noindent -The transformed point is, as we have already found, $[6,0,9,1]^{\rm T}$. We -will now compute the transformed plane. The inverse of the transform -is - -$$\left[\matrix{1 & 0 & 0 & -4\cr - 0 & 1 & 0 & 3\cr - 0 & 0 & 1 & -7\cr - 0 & 0 & 0 & 1\cr}\right]$$ - -\noindent -and the transformed plane - -$$[1\ 0\ 0\ -6] = [1\ 0\ 0\ -2]\left[\matrix{1 & 0 & 0 & -4\cr - 0 & 1 & 0 & 3\cr - 0 & 0 & 1 & -7\cr - 0 & 0 & 0 & 1\cr} - \right]\eqno(1.30)$$ - -\noindent -Once again the transformed point lies in the transformed plane - -$$[1\ 0\ 0\ -6] \left[\matrix{6\cr - 0\cr - 9\cr - 1\cr}\right] = 0\eqno(1.31)$$ - -The general translation operation can be represented in Axiom as - -<>= - translate(x,y,z) == - matrix(_ - [[1,0,0,x],_ - [0,1,0,y],_ - [0,0,1,z],_ - [0,0,0,1]]) -@ -\section{Rotation Transformations} - -\noindent -The transformations corresponding to rotations about the $x$, $y$, and -$z$ axes by an angle $\theta$ are - -$${\bf Rot(x,\theta)} = - \left[\matrix{1 & 0 & 0 & 0\cr - 0 & {cos\ \theta} & {-sin\ \theta} & 0\cr - 0 & {sin\ \theta} & {cos\ \theta} & 0\cr - 0 & 0 & 0 & 1}\right] - \eqno(1.32)$$ - -Rotations can be described in Axiom as functions that return -matrices. We can define a function for each of the rotation matrices -that correspond to the rotations about each axis. Note that the -sine and cosine functions in Axiom expect their argument to be in -radians rather than degrees. This conversion is - -$$radians = {{degrees * \pi}\over{180}}$$ - -\noindent -The Axiom code for ${\bf Rot(x,degree)}$ is - -<>= - rotatex(degree) == - angle := degree * pi() / 180::R - cosAngle := cos(angle) - sinAngle := sin(angle) - matrix(_ - [[1, 0, 0, 0], _ - [0, cosAngle, -sinAngle, 0], _ - [0, sinAngle, cosAngle, 0], _ - [0, 0, 0, 1]]) -@ - -$${\bf Rot(y,\theta)} = - \left[\matrix{{cos\ \theta} & 0 & {sin\ \theta} & 0\cr - 0 & 1 & 0 & 0\cr - {-sin\ \theta} & 0 & {cos\ \theta} & 0\cr - 0 & 0 & 0 & 1\cr}\right] - \eqno(1.33)$$ - -\noindent -The Axiom code for ${\bf Rot(y,degree)}$ is - -<>= - rotatey(degree) == - angle := degree * pi() / 180::R - cosAngle := cos(angle) - sinAngle := sin(angle) - matrix(_ - [[ cosAngle, 0, sinAngle, 0], _ - [ 0, 1, 0, 0], _ - [-sinAngle, 0, cosAngle, 0], _ - [ 0, 0, 0, 1]]) -@ - -$${\bf Rot(z,\theta)} = - \left[\matrix{{cos\ \theta} & {-sin\ \theta} & 0 & 0\cr - {sin\ \theta} & {cos\ \theta} & 0 & 0\cr - 0 & 0 & 1 & 0\cr - 0 & 0 & 0 & 1}\right] - \eqno(1.34)$$ - -\noindent -And the Axiom code for ${\bf Rot(z,degree)}$ is - -<>= - rotatez(degree) == - angle := degree * pi() / 180::R - cosAngle := cos(angle) - sinAngle := sin(angle) - matrix(_ - [[cosAngle, -sinAngle, 0, 0], _ - [sinAngle, cosAngle, 0, 0], _ - [ 0, 0, 1, 0], _ - [ 0, 0, 0, 1]]) -@ -\noindent -Let us interpret these rotations by means of an example. Given a point -${\bf u} = 7{\bf i} + 3{\bf j} + 2{\bf k}$ what is the effect of -rotating it $90^\circ$ about the ${\bf z}$ axis to ${\bf v}$? The -transform is obtained from Equation 1.34 with $sin\ \theta = 1$ and -$cos\ \theta = 0$. - -$$\left[\matrix{-3\cr - 7\cr - 2\cr - 1\cr} - \right] = - \left[\matrix{0 & -1 & 0 & 0\cr - 1 & 0 & 0 & 0\cr - 0 & 0 & 1 & 0\cr - 0 & 0 & 0 & 1\cr} - \right] - \left[\matrix{7\cr - 3\cr - 2\cr - 1\cr} - \right]\eqno(1.35)$$ - -\noindent -Let us now rotate {\bf v} $90^\circ$ about the $y$ axis to -{\bf w}. The transform is obtained from Equation 1.33 and we have - -$$\left[\matrix{2\cr - 7\cr - 3\cr - 1\cr} - \right] = - \left[\matrix{ 0 & 0 & 1 & 0\cr - 0 & 1 & 0 & 0\cr - -1 & 0 & 0 & 0\cr - 0 & 0 & 0 & 1\cr} - \right] - \left[\matrix{-3\cr - 7\cr - 2\cr - 1\cr} - \right]\eqno(1.36)$$ - -\noindent -If we combine these two rotations we have - -$${\rm \ \ \ \ \ \ \ } {\bf v} = {\bf Rot(z,90)}{\bf u}\eqno(1.37)$$ - -$${\rm and\ \ \ } {\bf w} = {\bf Rot(y,90)}{\bf v}\eqno(1.38)$$ - -\noindent -Substituting for {\bf v} from Equation 1.37 into Equation 1.38 we -obtain - -$${\bf w} = {\bf Rot(y,90)}\ {\bf Rot(z,90)}\ {\bf u}\eqno(1.39)$$ - -$${\bf Rot(y,90)}\ {\bf Rot(z,90)} = - \left[\matrix{ 0 & 0 & 1 & 0\cr - 0 & 1 & 0 & 0\cr - -1 & 0 & 0 & 0\cr - 0 & 0 & 0 & 1} - \right] - \left[\matrix{0 & -1 & 0 & 0\cr - 1 & 0 & 0 & 0\cr - 0 & 0 & 1 & 0\cr - 0 & 0 & 0 & 1} - \right]\eqno(1.40)$$ - -$${\bf Rot(y,90)}\ {\bf Rot(z,90)} = - \left[\matrix{0 & 0 & 1 & 0\cr - 1 & 0 & 0 & 0\cr - 0 & 1 & 0 & 0\cr - 0 & 0 & 0 & 1} - \right]\eqno(1.41)$$ - -\noindent -thus - -$${\bf w} = \left[\matrix{2\cr - 7\cr - 3\cr - 1}\right] - = \left[\matrix{0 & 0 & 1 & 0\cr - 1 & 0 & 0 & 0\cr - 0 & 1 & 0 & 0\cr - 0 & 0 & 0 & 1}\right] - \left[\matrix{7\cr - 3\cr - 2\cr - 1}\right]\eqno(1.42)$$ - -\noindent -as we obtained before. - -If we reverse the order of rotations and first rotate $90^\circ$ about -the $y$ axis and then $90^\circ$ about the $z$ axis, we obtain a -different position - -$${\bf Rot(z,90)}{\bf Rot(y,90)} = - \left[\matrix{0 & -1 & 0 & 0\cr - 1 & 0 & 0 & 0\cr - 0 & 0 & 1 & 0\cr - 0 & 0 & 0 & 1} - \right] - \left[\matrix{ 0 & 0 & 1 & 0\cr - 0 & 1 & 0 & 0\cr - -1 & 0 & 0 & 0\cr - 0 & 0 & 0 & 1} - \right] - = \left[\matrix{ 0 & -1 & 0 & 0\cr - 0 & 0 & 1 & 0\cr - -1 & 0 & 0 & 0\cr - 0 & 0 & 0 & 1} - \right]\eqno(1.43)$$ - -\noindent -and the point {\bf u} transforms into {\bf w} as - -$$\left[\matrix{-3\cr - 2\cr - -7\cr - 1} - \right] - = \left[\matrix{ 0 & -1 & 0 & 0\cr - 0 & 0 & 1 & 0\cr - -1 & 0 & 0 & 0\cr - 0 & 0 & 0 & 1} - \right] - \left[\matrix{7\cr - 3\cr - 2\cr - 1} - \right]\eqno(1.44)$$ - -\noindent -We should expect this, as matrix multiplication is noncommutative. - -$${\bf A}{\bf B} \ne {\bf B}{\bf A}\eqno(1.45)$$ - -We will now combine the original rotation with a translation -$4{\bf i}-3{\bf j}+7{\bf k}$. We obtain the translation from Equation -1.27 and the rotation from Equation 1.41. The matrix expression is - -$${\bf Trans(4,-3,7)}{\bf Rot(y,90)}{\bf Rot(z,90)} - = \left[\matrix{1 & 0 & 0 & 4\cr - 0 & 1 & 0 & -3\cr - 0 & 0 & 1 & 7\cr - 0 & 0 & 0 & 1} - \right] - \left[\matrix{0 & 0 & 1 & 0\cr - 1 & 0 & 0 & 0\cr - 0 & 1 & 0 & 0\cr - 0 & 0 & 0 & 1} - \right] - = \left[\matrix{0 & 0 & 1 & 4\cr - 1 & 0 & 0 & -3\cr - 0 & 1 & 0 & 7\cr - 0 & 0 & 0 & 1} - \right]\eqno(1.46)$$ - -\noindent -and our point ${\bf w} = 7{\bf i}+3{\bf j}+2{\bf k}$ transforms into -{\bf x} as - -$$\left[\matrix{ 6\cr - 4\cr - 10\cr - 1} - \right] - = \left[\matrix{0 & 0 & 1 & 4\cr - 1 & 0 & 0 & -3\cr - 0 & 1 & 0 & 7\cr - 0 & 0 & 0 & 1} - \right] - \left[\matrix{7\cr - 3\cr - 2\cr - 1} - \right]\eqno(1.47)$$ - -\section{Coordinate Frames} - -\noindent -We can interpret the elements of the homogeneous transformation as -four vectors describing a second coordinate frame. The vector -$[0,0,0,1]^{\rm T}$ lies at the origin of the second coordinate frame. Its -transformation corresponds to the right hand column of the -transformation matrix. Consider the transform in Equation 1.47 - -$$\left[\matrix{ 4\cr - -3\cr - 7\cr - 1} - \right] - = \left[\matrix{0 & 0 & 1 & 4\cr - 1 & 0 & 0 & -3\cr - 0 & 1 & 0 & 7\cr - 0 & 0 & 0 & 1} - \right] - \left[\matrix{0\cr - 0\cr - 0\cr - 1} - \right]\eqno(1.48)$$ - -\noindent -The transform of the null vector is $[4,-3,7,1]^{\rm T}$, the right -hand column. If we transform vectors corresponding to unit vectors -along the $x$, $y$, and $z$ axes, we obtain $[4,-2,7,1]^{\rm T}$, -$[4,-3,8,1]^{\rm T}$, and $[5,-3,7,1]^{\rm T}$, respectively. Those -four vectors form a coordinate frame. - -The direction of these unit vectors is formed by subtracting the -vector representing the origin of this coordinate frame and extending -the vectors to infinity by reducing their scale factors to zero. The -direction of the $x$, $y$, and $z$ axes of this frame are -$[0,1,0,0]^{\rm T}$, $[0,0,1,0]^{\rm T}$, and $[1,0,0,0]^{\rm T}$, -respectively. These direction vectors correspond to the first three -columns of the transformation matrix. The transformation matrix thus -describes the three axis directions and the position of the origin of -a coordinate frame rotated and translated away from the reference -coordinate frame. When a vector is transformed, as in Equation 1.47, -the original vector can be considered as a vector described in the -coordinate frame. The transformed vector is the same vector described -with respect to the reference coordinate frame. - -\section{Relative Transformations} - -\noindent -The rotations and translations we have been describing have all been -made with respect to the fixed reference coordinate frame. Thus, in -the example given, - -$${\bf Trans(4,-3,7)}{\bf Rot(y,90)}{\bf Rot(z,90)} - = \left[\matrix{0 & 0 & 1 & 4\cr - 1 & 0 & 0 & -3\cr - 0 & 1 & 0 & 7\cr - 0 & 0 & 0 & 1} - \right]\eqno(1.49)$$ - -\noindent -the frame is first rotated around the reference $z$ axis by -$90^\circ$, then rotated $90^\circ$ around the reference $y$ axis, and -finally translated by $4{\bf i}-3{\bf j}+7{\bf k}$. We may also -interpret the operation in the reverse order, from left to right, as -follows: the object is first translated by -$4{\bf i}-3{\bf j}+7{\bf k}$; it is then rotated $90^\circ$ around the -current frames axes, which in this case are the same as the reference -axes; it is then rotated $90^\circ$ about the newly rotated (current) -frames axes. - -In general, if we postmultiply a transform representing a frame by a -second transformation describing a rotation and/or translation, we -make that translation and/or rotation with respect to the frame axes -described by the first transformation. If we premultiply the frame -transformation by a transformation representing a translation and/or -rotation, then that translation and/or rotation is made with respect to -the base reference coordinate frame. Thus, given a frame {\bf C} and a -transformation {\bf T}, corresponding to a rotation of $90^\circ$ -about the $z$ axis, and a translation of 10 units in the $x$ -direction, we obtain a new position {\bf X} when the change is made in -the base coordinates ${\bf X} = {\bf T} {\bf C}$ - -$$\left[\matrix{0 & 0 & 1 & 0\cr - 1 & 0 & 0 & 20\cr - 0 & 1 & 0 & 0\cr - 0 & 0 & 0 & 1} - \right] - = \left[\matrix{0 & -1 & 0 & 10\cr - 1 & 0 & 0 & 0\cr - 0 & 0 & 1 & 0\cr - 0 & 0 & 0 & 1} - \right] - \left[\matrix{1 & 0 & 0 & 20\cr - 0 & 0 & -1 & 10\cr - 0 & 1 & 0 & 0\cr - 0 & 0 & 0 & 1} - \right]\eqno(1.50)$$ - -\noindent -and a new position {\bf Y} when the change is made relative to the -frame axes as ${\bf Y} = {\bf C} {\bf T}$ - -$$\left[\matrix{0 & -1 & 0 & 30\cr - 0 & 0 & -1 & 10\cr - 1 & 0 & 0 & 0\cr - 0 & 0 & 0 & 1} - \right] - = \left[\matrix{1 & 0 & 0 & 20\cr - 0 & 0 & -1 & 10\cr - 0 & 1 & 0 & 0\cr - 0 & 0 & 0 & 1} - \right] - \left[\matrix{0 & -1 & 0 & 10\cr - 1 & 0 & 0 & 0\cr - 0 & 0 & 1 & 0\cr - 0 & 0 & 0 & 1} - \right]\eqno(1.51)$$ - -\section{Objects} - -\noindent -Transformations are used to describe the position and orientation of -objects. An object is described by six points with respect to a -coordinate frame fixed in the object. - -If we rotate the object $90^\circ$ about the $z$ axis and then -$90^\circ$ about the $y$ axis, followed by a translation of four units -in the $x$ direction, we can describe the transformation as - -$${\bf Trans(4,0,0)}{\bf Rot(y,90)}{\bf Rot(z,90)} = - \left[\matrix{0 & 0 & 1 & 4\cr - 1 & 0 & 0 & 0\cr - 0 & 1 & 0 & 0\cr - 0 & 0 & 0 & 1} - \right]\eqno(1.52)$$ - -\noindent -The transformation matrix represents the operation of rotation and -translation on a coordinate frame originally aligned with the -reference coordinate frame. We may transform the six points of the -object as - -$$\left[\matrix{4 & 4 & 6 & 6 & 4 & 4\cr - 1 & -1 & -1 & 1 & 1 & -1\cr - 0 & 0 & 0 & 0 & 4 & 4\cr - 1 & 1 & 1 & 1 & 1 & 1} - \right] - = \left[\matrix{0 & 0 & 1 & 4\cr - 1 & 0 & 0 & 0\cr - 0 & 1 & 0 & 0\cr - 0 & 0 & 0 & 1} - \right] - \left[\matrix{1 & -1 & -1 & 1 & 1 & -1\cr - 0 & 0 & 0 & 0 & 4 & 4\cr - 0 & 0 & 2 & 2 & 0 & 0\cr - 1 & 1 & 1 & 1 & 1 & 1} - \right]\eqno(1.53)$$ - -It can be seen that the object described bears the same fixed -relationship to its coordinate frame, whose position and orientation -are described by the transformation. Given an object described by a -reference coordinate frame, and a transformation representing the -position and orientation of the object's axes, the object can be -simply reconstructed, without the necessity of transforming all the -points, by noting the direction and orientation of key features with -respect to the describing frame's coordinate axes. By drawing the -transformed coordinate frame, the object can be related to the new -axis directions. - -\section{Inverse Transformations} - -\noindent -We are now in a position to develop the inverse transformation as the -transform which carries the transformed coordinate frame back to the -original frame. This is simply the description of the reference -coordinate frame with respect to the transformed frame. Suppose the -direction of the reference frame $x$ axis is $[0,0,1,0]^{\rm T}$ with -respect to the transformed frame. The $y$ and $z$ axes are -$[1,0,0,0]^{\rm T}$ and $[0,1,0,0]^{\rm T}$, respectively. The -location of the origin is $[0,0,-4,1]^{\rm T}$ with respect to the -transformed frame and thus the inverse transformation is - -$${\bf T^{-1}} = \left[\matrix{0 & 1 & 0 & 0\cr - 0 & 0 & 1 & 0\cr - 1 & 0 & 0 & -4\cr - 0 & 0 & 0 & 1} - \right]\eqno(1.54)$$ - -\noindent -That this is indeed the tranform inverse is easily verifyed by -multiplying it by the transform {\bf T} to obtain the identity -transform - -$$\left[\matrix{1 & 0 & 0 & 0\cr - 0 & 1 & 0 & 0\cr - 0 & 0 & 1 & 0\cr - 0 & 0 & 0 & 1} - \right] - = \left[\matrix{0 & 1 & 0 & 0\cr - 0 & 0 & 1 & 0\cr - 1 & 0 & 0 & -4\cr - 0 & 0 & 0 & 1} - \right] - \left[\matrix{0 & 0 & 1 & 4\cr - 1 & 0 & 0 & 0\cr - 0 & 1 & 0 & 0\cr - 0 & 0 & 0 & 1} - \right]\eqno(1.55)$$ - -\noindent -In general, given a transform with elements - -$${\bf T} = \left[\matrix{n_x & o_x & a_x & p_x\cr - n_y & o_y & a_y & p_y\cr - n_z & o_z & a_z & p_z\cr - 0 & 0 & 0 & 1} - \right]\eqno(1.56)$$ - -\noindent -then the inverse is - -$${\bf T^{-1}} = \left[\matrix{n_x & n_y & n_z & -{\bf p} \cdot {\bf n}\cr - o_x & o_y & o_z & -{\bf p} \cdot {\bf o}\cr - a_x & a_y & a_z & -{\bf p} \cdot {\bf a}\cr - 0 & 0 & 0 & 1} - \right]\eqno(1.57)$$ - -\noindent -where {\bf p}, {\bf n}, {\bf o}, and {\bf a} are the four column -vectors and ``$\cdot$'' represents the vector dot product. This result -is easily verified by postmultiplying Equation 1.56 by Equation 1.57. - -\section{General Rotation Transformation} - -\noindent -We state the rotation transformations for rotations about the $x$, -$y$, and $z$ axes (Equations 1.32, 1.33 and 1.34). These -transformations have a simple geometric interpretation. For example, -in the case of a rotation about the $z$ axis, the column representing -the $z$ axis will remain constant, while the column elements -representing the $x$ and $y$ axes will vary. - -\noindent -We will now develop the transformation matrix representing a rotation -around an arbitrary vector {\bf k} located at the origin. In order to -do this we will imagine that {\bf k} is the $z$ axis unit vector of a -coordinate frame {\bf C} - -$${\bf C} = \left[\matrix{n_x & o_x & a_x & p_x\cr - n_y & o_y & a_y & p_y\cr - n_z & o_z & a_z & p_z\cr - 0 & 0 & 0 & 1} - \right]\eqno(1.58)$$ - -$${\bf k} = a_x{\bf i} + a_y{\bf j} + a_z{\bf k}\eqno(1.59)$$ - -\noindent -Rotating around the vector {\bf k} is then equivalent to rotating -around the $z$ axis of the frame {\bf C}. - -$${\bf Rot(k,\theta)} = {\bf Rot(^C{\bf z},\theta)}\eqno(1.60)$$ - -\noindent -If we are given a frame {\bf T} described with respect to the -reference coordinate frame, we can find a frame {\bf X} which -describes the same frame with respect to frame {\bf C} as - -$${\bf T} = {\bf C} {\bf X}\eqno(1.61)$$ - -\noindent -where {\bf X} describes the position of {\bf T} with respect to frame -{\bf C}. Solving for {\bf X} we obtain - -$${\bf X} = {\bf C^{-1}} {\bf T}\eqno(1.62)$$ - -\noindent -Rotation {\bf T} around {\bf k} is equivalent to rotating {\bf X} -around the $z$ axis of frame {\bf C} - -$${\bf Rot(k,\theta)} {\bf T} - = {\bf C} {\bf Rot(z,\theta)} {\bf X}\eqno(1.63)$$ - -$${\bf Rot(k,\theta)} {\bf T} - = {\bf C} {\bf Rot(z,\theta)} {\bf C^{-1}} {\bf T}.\eqno(1.64)$$ - -\noindent -Thus - -$${\bf Rot(k,\theta)} - = {\bf C} {\bf Rot(z,\theta)} {\bf C^{-1}}\eqno(1.65)$$ - -\noindent -However, we have only {\bf k}, the $z$ axis of the frame {\bf C}. By -expanding equation 1.65 we will discover that -${\bf C} {\bf Rot(z,\theta)} {\bf C^{-1}}$ is a function of {\bf k} -only. - -Multiplying ${\bf Rot(z,\theta)}$ on the right by ${\bf C^{-1}}$ we -obtain - -$${\bf Rot(z,\theta)} {\bf C^{-1}} - = \left[\matrix{cos \theta & -sin \theta & 0 & 0\cr - sin \theta & cos \theta & 0 & 0\cr - 0 & 0 & 1 & 0\cr - 0 & 0 & 0 & 1} - \right] - \left[\matrix{n_x & n_y & n_z & 0\cr - o_x & o_x & o_z & 0\cr - a_x & a_y & a_z & 0\cr - 0 & 0 & 0 & 1} - \right]$$ - -$$ = \left[\matrix{n_x cos \theta - o_x sin \theta & - n_y cos \theta - o_y sin \theta & - n_z cos \theta - o_z sin \theta & 0\cr - n_x sin \theta + o_x cos \theta & - n_y sin \theta + o_y cos \theta & - n_z sin \theta + o_z cos \theta & 0\cr - a_x & a_y & a_z & 0\cr - 0 & 0 & 0 & 1} - \right]\eqno(1.66)$$ - -\noindent -premultiplying by - -$${\bf C} = \left[\matrix{n_x & o_x & a_x & 0\cr - n_y & o_y & a_y & 0\cr - n_z & o_z & a_z & 0\cr - 0 & 0 & 0 & 1} - \right]\eqno(1.67)$$ - -\noindent -we obtain ${\bf C} {\bf Rot(z,\theta)} {\bf C^{-1}}$ - -$$\left[\matrix{ -n_x n_x cos \theta - n_x o_x sin \theta + n_x o_x sin \theta + o_x o_x -cos \theta + a_x a_x\cr -n_y n_x cos \theta - n_y o_x sin \theta + n_x o_y sin \theta + o_x o_y -cos \theta + a_y a_x\cr -n_z n_x cos \theta - n_z o_x sin \theta + n_x o_z sin \theta + o_x o_z -cos \theta + a_z a_x\cr -0} -\right.$$ - -$$\matrix{ -n_x n_y cos \theta - n_x o_y sin \theta + n_y o_x sin \theta + o_y o_x -cos \theta + a_x a_y\cr -n_y n_y cos \theta - n_y o_y sin \theta + n_y o_y sin \theta + o_y o_y -cos \theta + a_y a_y\cr -n_z n_y cos \theta - n_z o_y sin \theta + n_y o_z sin \theta + o_y o_z -cos \theta + a_z a_y\cr -0}\eqno(1.68)$$ - -$$\left.\matrix{ -n_x n_z cos \theta - n_x o_z sin \theta + n_z o_x sin \theta + o_z o_x -cos \theta + a_x a_x & 0\cr -n_y n_z cos \theta - n_y o_z sin \theta + n_z o_y sin \theta + o_z o_y -cos \theta + a_y a_z & 0\cr -n_z n_z cos \theta - n_z o_z sin \theta + n_z o_z sin \theta + o_z o_z -cos \theta + a_z a_z & 0\cr -0 & 1} -\right]$$ - -\noindent -Simplifying, using the following relationships:\\ -the dot product of any row or column of {\bf C} with any other row or -column is zero, as the vectors are orthogonal;\\ -the dot product of any row or column of {\bf C} with itself is {\bf 1} -as the vectors are of unit magnitude;\\ -the $z$ unit vector is the vector cross product of the $x$ and $y$ -vectors or -$${\bf a} = {\bf n} \times {\bf o}\eqno(1.69)$$ - -\noindent -which has components - -$$a_x = n_y o_z - n_z o_y$$ -$$a_y = n_z o_x - n_x o_z$$ -$$a_z = n_x o_y - n_y o_x$$ - -\noindent -the versine, abbreviated ${\bf vers \ \theta}$, is defined as -${\bf vers \ \theta} = (1 - cos \ \theta)$, -${k_x = a_x}$, ${k_y = a_y}$ and ${k_z = a_z}$. -We obtain ${\bf Rot(k,\theta)} =$ -$$\left[\matrix{ -k_x k_x vers \theta + cos \theta & -k_y k_x vers \theta - k_z sin \theta & -k_z k_x vers \theta + k_y sin \theta & -0\cr -k_x k_y vers \theta + k_z sin \theta & -k_y k_y vers \theta + cos \theta & -k_z k_y vers \theta - k_x sin \theta & -0\cr -k_x k_z vers \theta - k_y sin \theta & -k_y k_z vers \theta + k_x sin \theta & -k_z k_z vers \theta + cos \theta & -0\cr -0 & 0 & 0 & 1} -\right]\eqno(1.70)$$ - -\noindent -This is an important result and should be thoroughly understood before -proceeding further. - -From this general rotation transformation we can obtain each of the -elementary rotation transforms. For example ${\bf Rot(x,\theta)}$ is -${\bf Rot(k,\theta)}$ where ${k_x = 1}$, ${k_y = 0}$, and -${k_z = 0}$. Substituting these values of {\bf k} into Equation 1.70 -we obtain - -$${\bf Rot(x,\theta)} = -\left[\matrix{1 & 0 & 0 & 0\cr - 0 & cos \theta & -sin \theta & 0\cr - 0 & sin \theta & cos \theta & 0\cr - 0 & 0 & 0 & 1} -\right]\eqno(1.71)$$ - -\noindent -as before. - -\section{Equivalent Angle and Axis of Rotation} - -\noindent -Given any arbitrary rotational transformation, we can use Equation -1.70 to obtain an axis about which an equivalent rotation $\theta$ is -made as follows. Given a rotational transformation {\bf R} - -$${\bf R} = -\left[\matrix{n_x & o_x & a_x & 0\cr - n_y & o_y & a_y & 0\cr - n_z & o_z & a_z & 0\cr - 0 & 0 & 0 & 1} -\right]\eqno(1.72)$$ - -\noindent -we may equate {\bf R} to {\bf Rot(k,$\theta$)} - -$$\left[\matrix{n_x & o_x & a_x & 0\cr - n_y & o_y & a_y & 0\cr - n_z & o_z & a_z & 0\cr - 0 & 0 & 0 & 1} - \right] = $$ -$$\left[\matrix{ -k_x k_x vers \theta + cos \theta & -k_y k_x vers \theta - k_z sin \theta & -k_z k_x vers \theta + k_y sin \theta & -0\cr -k_x k_y vers \theta + k_z sin \theta & -k_y k_y vers \theta + cos \theta & -k_z k_y vers \theta - k_x sin \theta & -0\cr -k_x k_z vers \theta - k_y sin \theta & -k_y k_z vers \theta + k_x sin \theta & -k_z k_z vers \theta + cos \theta & -0\cr -0 & 0 & 0 & 1} -\right]\eqno(1.73)$$ - -\noindent -Summing the diagonal terms of Equation 1.73 we obtain - -$$n_x+o_y+a_z+1= -k_x^2 vers \theta + cos \theta + -k_y^2 vers \theta + cos \theta + -k_z^2 vers \theta + cos \theta + 1\eqno(1.74)$$ - -$$\left.\matrix{ n_x+o_y+a_z & = & - (k_x^2+k_y^2+k_z^2)vers \theta + 3 cos \theta\cr - & = & 1 + 2 cos \theta} - \right.\eqno(1.75)$$ - -\noindent -and the cosine of the angle of rotation is - -$$cos \theta = {1\over 2}(n_x+o_y+a_z-1)\eqno(1.76)$$ - -\noindent -Differencing pairs of off-diagonal terms in Equation 1.73 we obtain - -$$o_z - a_y = 2 k_x sin \theta\eqno(1.77)$$ -$$a_x - n_z = 2 k_y sin \theta\eqno(1.78)$$ -$$n_y - o_x = 2 k_z sin \theta\eqno(1.79)$$ - -\noindent -Squaring and adding Equations 1.77-1.79 we obtain an expression for -$sin \theta$ - -$$(o_z - a_y)^2 + (a_x - n_z)^2 + (n_y - o_x)^2 - = 4 sin^2 \theta\eqno(1.80)$$ - -\noindent -and the sine of the angle of rotation is - -$$sin \ \theta = - \pm {1\over 2} \sqrt{(o_z - a_y)^2 + (a_x - n_z)^2 + (n_y - o_x)^2} - \eqno(1.81)$$ - -\noindent -We may define the rotation to be positive about the vector {\bf k} -such that $0 \leq \theta \leq 180^\circ$. In this case the $+$ sign -is appropriate in Equation 1.81 and thus the angle of rotation -$\theta$ is uniquely defined as - -$$tan \ \theta = - {\sqrt{(o_z - a_y)^2 + (a_x - n_z)^2 + (n_y - o_x)^2} - \over - {(n_x + o_y + a_z -1)}}\eqno(1.82)$$ - -\noindent -The components of {\bf k} may be obtained from Equations 1.77-1.79 as - -$$k_x = {{o_z - a_y}\over{2 sin \theta}}\eqno(1.83)$$ -$$k_y = {{a_x - n_z}\over{2 sin \theta}}\eqno(1.84)$$ -$$k_z = {{n_y - o_x}\over{2 sin \theta}}\eqno(1.85)$$ - -When the angle of rotation is very small, the axis of rotation is -physically not well defined due to the small magnitude of both -numerator and denominator in Equations 1.83-1.85. If the resulting -angle is small, the vector {\bf k} should be renormalized to ensure -that $\left|{\bf k}\right| = 1$. When the angle of rotation approaches -$180^\circ$ the vector {\bf k} is once again poorly defined by -Equation 1.83-1.85 as the magnitude of the sine is again -decreasing. The axis of rotation is, however, physically well defined -in this case. When $\theta < 150^\circ$, the denominator of -Equations 1.83-1.85 is less than 1. As the angle increases to -$180^\circ$ the rapidly decreasing magnitude of both numerator and -denominator leads to considerable inaccuracies in the determination of -{\bf k}. At $\theta = 180^\circ$, Equations 1.83-1.85 are of the form -$0/0$, yielding no information at all about a physically well defined -vector {\bf k}. If the angle of rotation is greater than $90^\circ$, -then we must follow a different approach in determining {\bf -k}. Equating the diagonal elements of Equation 1.73 we obtain - -$$k_x^2 vers \theta + cos \theta = n_x\eqno(1.86)$$ -$$k_y^2 vers \theta + cos \theta = o_y\eqno(1.87)$$ -$$k_z^2 vers \theta + cos \theta = a_z\eqno(1.88)$$ - -Substituting for $cos \theta$ and $vers \theta$ from Equation 1.76 and -solving for the elements of {\bf k} we obtain further - -$$k_x = - \pm \sqrt{{{n_x - cos \theta}\over{1 - cos \theta}}}\eqno(1.89)$$ -$$k_y = - \pm \sqrt{{{o_y - cos \theta}\over{1 - cos \theta}}}\eqno(1.90)$$ -$$k_z = - \pm \sqrt{{{a_z - cos \theta}\over{1 - cos \theta}}}\eqno(1.91)$$ - -\noindent -The largest component of {\bf k} defined by Equations 1.89-1.91 -corresponds to the most positive component of $n_x$, $o_y$, and -$a_z$. For this largest element, the sign of the radical can be -obtained from Equations 1.77-1.79. As the sine of the angle of -rotation $\theta$ must be positive, then the sign of the component of -{\bf k} defined by Equations 1.77-1.79 must be the same as the sign of -the left hand side of these equations. Thus we may combine Equations -1.89-1.91 with the information contained in Equations 1.77-1.79 as -follows - -$$k_x = sgn(o_z-a_y)\sqrt{{{(n_x-cos \theta)} - \over - {1-cos \theta}}}\eqno(1.92)$$ - -$$k_y = sgn(a_x-n_z)\sqrt{{{(o_y-cos \theta)} - \over - {1-cos \theta}}}\eqno(1.93)$$ - -$$k_z = sgn(n_y-o_x)\sqrt{{{(a_z-cos \theta)} - \over - {1-cos \theta}}}\eqno(1.94)$$ - -\noindent -where $sgn(e) = +1$ if $e \ge 0$ and $sgn(e) = -1$ if $e \le 0$. - -Only the largest element of {\bf k} is determined from Equations -1.92-1.94, corresponding to the most positive element of $n_x$, $o_y$, -and $a_z$. The remaining elements are more accurately determined by -the following equations formed by summing pairs of off-diagonal -elements of Equation 1.73 - -$$n_y + o_x = 2 k_x k_y vers \theta\eqno(1.95)$$ -$$o_z + a_y = 2 k_y k_z vers \theta\eqno(1.96)$$ -$$n_z + a_x = 2 k_z k_x vers \theta\eqno(1.97)$$ - -\noindent -If $k_x$ is largest then - -$$k_y = {{n_y + o_x}\over{2 k_x vers \theta}} - {\rm \ \ \ \ \ from \ Equation \ 1.95}\eqno(1.98)$$ - -$$k_z = {{a_x + n_z}\over{2 k_x vers \theta}} - {\rm \ \ \ \ \ from \ Equation \ 1.97}\eqno(1.99)$$ - -\noindent -If $k_y$ is largest then - -$$k_x = {{n_y + o_x}\over{2 k_y vers \theta}} - {\rm \ \ \ \ \ from \ Equation \ 1.95}\eqno(1.100)$$ - -$$k_z = {{o_z + a_y}\over{2 k_y vers \theta}} - {\rm \ \ \ \ \ from \ Equation \ 1.96}\eqno(1.101)$$ - -\noindent -If $k_z$ is largest then - -$$k_x = {{a_x + n_z}\over{2 k_z vers \theta}} - {\rm \ \ \ \ \ from \ Equation \ 1.97}\eqno(1.102)$$ - -$$k_y = {{o_z + a_y}\over{2 k_z vers \theta}} - {\rm \ \ \ \ \ from \ Equation \ 1.96}\eqno(1.103)$$ - -\section{Example 1.1} - -\noindent -Determine the equivalent axis and angle of rotation for the matrix -given in Equations 1.41 - -$${\bf Rot(y,90)}{\bf Rot(z,90)} - = \left[\matrix{0 & 0 & 1 & 0\cr - 1 & 0 & 0 & 0\cr - 0 & 1 & 0 & 0\cr - 0 & 0 & 0 & 1} - \right]\eqno(1.104)$$ - -\noindent -We first determine ${\bf cos \ \theta}$ from Equation 1.76 - -$$cos \theta = {{1}\over{2}}(0 + 0 + 0 - 1) - = -{{1}\over{2}}\eqno(1.105)$$ - -\noindent -and $sin \ \theta$ from Equation 1.81 - -$$sin \theta = {{1}\over{2}}\sqrt{(1-0)^2+(1-0)^2+(1-0)^2} - = {{\sqrt3}\over{2}}\eqno(1.106)$$ - -\noindent -Thus - -$$\theta = tan^{-1}\left({{\sqrt3}\over{2}} - \raise15pt\hbox{$\bigslash$} - {{-1}\over{2}}\right) - = 120^\circ\eqno(1.107)$$ - -\noindent -As $\theta > 90$, we determine the largest component of {\bf k} -corresponding to the largest element on the diagonal. As all diagonal -elements are equal in this example we may pick any one. We will pick -$k_x$ given by Equation 1.92 - -$$k_x = +\sqrt{(0 + {{1}\over{2}}) - \raise15pt\hbox{$\bigslash$} - (1 + {{1}\over{2}})} - = {{1}\over{\sqrt{3}}}\eqno(1.108)$$ - -\noindent -As we have determined $k_x$ we may now determine $k_y$ and $k_z$ from -Equations 1.98 and 1.99, respectively - -$$k_y = {{1+0}\over{\sqrt{3}}} = {{1}\over{\sqrt{3}}}\eqno(1.109)$$ - -$$k_z = {{1+0}\over{\sqrt{3}}} = {{1}\over{\sqrt{3}}}\eqno(1.110)$$ - -\noindent -In summary, then - -$${\bf Rot(y,90)}{\bf Rot(z,90)} = {\bf Rot(k,120)}\eqno(1.111)$$ - -\noindent -where - -$${\bf k} = {{1}\over{\sqrt{3}}} {\bf i} - + {{1}\over{\sqrt{3}}} {\bf j} - + {{1}\over{\sqrt{3}}} {\bf k}\eqno(1.112)$$ - -Any combination of rotations is always equivalent to a single rotation -about some axis {\bf k} by an angle $\theta$, an important result -that we will make use of later. - -\section{Stretching and Scaling} - -A transform {\bf T} - -$${\bf T} = \left[\matrix{a & 0 & 0 & 0\cr - 0 & b & 0 & 0\cr - 0 & 0 & c & 0\cr - 0 & 0 & 0 & 1} - \right]\eqno(1.113)$$ - -\noindent -will stretch objects uniformly along the $x$ axis by a factor $a$, -along the $y$ axis by a factor $b$, and along the $z$ axis by a factor -$c$. Consider any point on an object $x{\bf i}+y{\bf j}+z{\bf k}$; its -tranform is - -$$\left[\matrix{ax\cr - by\cr - cz\cr - 1} - \right] - = \left[\matrix{a & 0 & 0 & 0\cr - 0 & b & 0 & 0\cr - 0 & 0 & c & 0\cr - 0 & 0 & 0 & 1} - \right] - \left[\matrix{x\cr - y\cr - z\cr - 1} - \right]\eqno(1.114)$$ - -\noindent -indicating stretching as stated. Thus a cube could be transformed into -a rectangular parallelepiped by such a transform. - -The Axiom code to perform this scale change is: - -<>= - scale(scalex, scaley, scalez) == - matrix(_ - [[scalex, 0 ,0 , 0], _ - [0 , scaley ,0 , 0], _ - [0 , 0, scalez, 0], _ - [0 , 0, 0 , 1]]) -@ -\noindent -The transform {\bf S} where - -$${\bf S} = \left[\matrix{s & 0 & 0 & 0\cr - 0 & s & 0 & 0\cr - 0 & 0 & s & 0\cr - 0 & 0 & 0 & 1} - \right]\eqno(1.115)$$ - -\noindent -will scale any object by the factor $s$. - -\section{Perspective Transformations} - -\noindent -Consider the image formed of an object by a simple lens. - -The axis of the lens is along the $y$ axis for convenience. An object -point $x$,$y$,$z$ is imaged at $x^\prime$,$y^\prime$,$z^\prime$ if the -lens has a focal length $f$ ($f$ is considered positive). $y^\prime$ -represents the image distance and varies with object distance $y$. If -we plot points on a plane perpendicular to the $y$ axis located at -$y^\prime$ (the film plane in a camera), then a perspective image is -formed. - -We will first obtain values of $x^\prime$, $y^\prime$, and $z^\prime$, -then introduce a perspective transformation and show that the same -values are obtained. - -Based on the fact that a ray passing through the center of the lens is -undeviated we may write - -$${\rm \ \ \ \ \ }{{z}\over{y}} = {{z^\prime}\over{y^\prime}}\eqno(1.116)$$ - -$${\rm and\ } {{x}\over{y}} = {{x^\prime}\over{y^\prime}}\eqno(1.117)$$ - -Based on the additional fact that a ray parallel to the lens axis -passes through the focal point $f$, we may write - -$${\rm \ \ \ \ \ }{{z}\over{f}} - = {{z^\prime}\over{y^\prime + f}}\eqno(1.118)$$ - -$${\rm and\ } {{x}\over{f}} - = {{x^\prime}\over{y^\prime + f}}\eqno(1.119)$$ - -\noindent -Notice that $x^\prime$, $y^\prime$, and $z^\prime$ are negative and -that $f$ is positive. Eliminating $y^\prime$ between Equations 1.116 -and 1.118 we obtain - -$${{z}\over{f}} - = {{z^\prime}\over{({{z^\prime y}\over{z}} + f)}}\eqno(1.120)$$ - -\noindent -and solving for $z^\prime$ we obtain the result - -$$z^\prime = {{z}\over{(1 - {{y}\over{f}})}}\eqno(1.121)$$ - -\noindent -Working with Equations 1.117 and 1.119 we can similarly obtain - -$$x^\prime = {{x}\over{(1 - {{y}\over{f}})}}\eqno(1.122)$$ - -\noindent -In order to obtain the image distance $y^\prime$ we rewrite Equations -1.116 and 1.118 as - -$${{z}\over{z^\prime}} = {{y}\over{y^\prime}}\eqno(1.123)$$ - -\noindent -and - -$${{z}\over{z^\prime}} = {{f}\over{y^\prime + f}}\eqno(1.124)$$ - -\noindent -thus - -$${{y}\over{y^\prime}} = {{f}\over{y^\prime + f}}\eqno(1.125)$$ - -\noindent -and solving for $y^\prime$ we obtain the result - -$$y^\prime = {{y}\over{(1-{{y}\over{f}})}}\eqno(1.126)$$ - -The homogeneous transformation {\bf P} which produces the same result -is - -$${\bf P} = \left[\matrix{1 & 0 & 0 & 0\cr - 0 & 1 & 0 & 0\cr - 0 & 0 & 1 & 0\cr - 0 & -{{1}\over{f}} & 0 & 1} - \right]\eqno(1.127)$$ - -\noindent -as any point $x{\bf i}+y{\bf j}+z{\bf k}$ transforms as - -$$\left[\matrix{x\cr - y\cr - z\cr - {1 - {{{y}\over{f}}}}} - \right] - = \left[\matrix{1 & 0 & 0 & 0\cr - 0 & 1 & 0 & 0\cr - 0 & 0 & 1 & 0\cr - 0 & -{{1}\over{f}} & 0 & 1} - \right] - \left[\matrix{x\cr - y\cr - z\cr - 1} - \right]\eqno(1.128)$$ - -\noindent -The image point $x^\prime$, $y^\prime$,, $z^\prime$, obtained by -dividing through by the weight factor $(1 - {{y}\over{f}})$, is - -$${{x}\over{(1 - {{y}\over{f}})}}{\bf i} + - {{y}\over{(1 - {{y}\over{f}})}}{\bf j} + - {{z}\over{(1 - {{y}\over{f}})}}{\bf k} \eqno(1.129)$$ - -\noindent -This is the same result that we obtained above. - -A transform similar to {\bf P} but with $-{{1}\over{f}}$ at the bottom -of the first column produces a perspective transformation along the -$x$ axis. If the $-{{1}\over{f}}$ term is in the third column then the -projection is along the $z$ axis. - -\section{Transform Equations} - -\noindent We will frequently be required to deal with transform -equations in which a coordinate frame is described in two or more -ways. A manipulator is positioned with respect to base coordinates by -a transform {\bf Z}. The end of the manipulator is described by a -transform $^Z{\bf T}_6$, and the end effector is described by -$^{T_6}{\bf E}$. An object is positioned with respect to base -coordinates by a transform {\bf B}, and finally the manipulator end -effector is positioned with respect to the object by $^B{\bf G}$. We -have two descriptions of the position of the end effector, one with -respect to the object and one with respect to the manipulator. As both -positions are the same, we may equate the two descriptions - -$${\bf Z}{^Z{\bf T}_6}{^{T_6}{\bf E}} - = {\bf B}{^B{\bf G}}\eqno(1.130)$$ - -If we wish to solve Equation 1.130 for the manipulator transform -${\bf T}_6$ we must premultiply Equation 1.130 by ${\bf Z}^{-1}$ and -postmultiply by ${\bf E}^{-1}$ to obtain - -$${\bf T}_6 - = {{\bf Z}^{-1}} {\bf B} {\bf G} {{\bf E}^{-1}}\eqno(1.131)$$ - -\noindent -As a further example, consider that the position of the object {\bf B} -is unknown, but that the manipulator is moved such that the end -effector is positioned over the object correctly. We may then solve -for {\bf B} from Equation 1.130 by postmultiplying by ${\bf G}^{-1}$. - -$${\bf B} = {\bf Z}{{\bf T}_6}{\bf E}{{\bf G}^{-1}}\eqno(1.133)$$ - -\section{Summary} - -\noindent -Homogeneous transformations may be readily used to describe the -positions and orientations of coordinate frames in space. If a -coordinate frame is embedded in an object then the position and -orientation of the object are also readily described. - -The description of object A in terms of object B by means of a -homogeneous transformation may be inverted to obtain the description -of object B in terms of object A. This is not a property of a simple -vector description of the relative displacement of one object with -respect to another. - -Transformations may be interpreted as a product of rotation and -translation transformations. If they are intrepreted from left to -right, then the rotations and translations are in terms of the -currently defined coordinate frame. If they are interpreted from right -to left, then the rotations and translations are described with -respect to the reference coordinate frame. - -Homogeneous transformations describe coordinate frames in terms of -rectangular components, which are the sines and cosines of -angles. This description may be related to rotations in which case the -description is in terms of a vector and angle of rotation. - -\section{Denavit-Hartenberg Matrices} -<>= ---Copyright The Numerical Algorithms Group Limited 1991. - -++ 4x4 Matrices for coordinate transformations -++ Author: Timothy Daly -++ Date Created: June 26, 1991 -++ Date Last Updated: 26 June 1991 -++ Description: -++ This package contains functions to create 4x4 matrices -++ useful for rotating and transforming coordinate systems. -++ These matrices are useful for graphics and robotics. -++ (Reference: Robot Manipulators Richard Paul MIT Press 1981) - - -)abbrev domain DHMATRIX DenavitHartenbergMatrix - ---% DHMatrix - -DenavitHartenbergMatrix(R): Exports == Implementation where - ++ A Denavit-Hartenberg Matrix is a 4x4 Matrix of the form: - ++ \spad{nx ox ax px} - ++ \spad{ny oy ay py} - ++ \spad{nz oz az pz} - ++ \spad{0 0 0 1} - ++ (n, o, and a are the direction cosines) - R : Join(Field, TranscendentalFunctionCategory) - --- for the implementation of dhmatrix - minrow ==> 1 - mincolumn ==> 1 --- - nx ==> x(1,1)::R - ny ==> x(2,1)::R - nz ==> x(3,1)::R - ox ==> x(1,2)::R - oy ==> x(2,2)::R - oz ==> x(3,2)::R - ax ==> x(1,3)::R - ay ==> x(2,3)::R - az ==> x(3,3)::R - px ==> x(1,4)::R - py ==> x(2,4)::R - pz ==> x(3,4)::R - row ==> Vector(R) - col ==> Vector(R) - radians ==> pi()/180 - - Exports ==> MatrixCategory(R,row,col) with - "*": (%, Point R) -> Point R - ++ t*p applies the dhmatrix t to point p - identity: () -> % - ++ identity() create the identity dhmatrix - rotatex: R -> % - ++ rotatex(r) returns a dhmatrix for rotation about axis X for r degrees - rotatey: R -> % - ++ rotatey(r) returns a dhmatrix for rotation about axis Y for r degrees - rotatez: R -> % - ++ rotatez(r) returns a dhmatrix for rotation about axis Z for r degrees - scale: (R,R,R) -> % - ++ scale(sx,sy,sz) returns a dhmatrix for scaling in the X, Y and Z - ++ directions - translate: (R,R,R) -> % - ++ translate(X,Y,Z) returns a dhmatrix for translation by X, Y, and Z - - Implementation ==> Matrix(R) add - - identity() == matrix([[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]) - --- inverse(x) == (inverse(x pretend (Matrix R))$Matrix(R)) pretend % --- dhinverse(x) == matrix( _ --- [[nx,ny,nz,-(px*nx+py*ny+pz*nz)],_ --- [ox,oy,oz,-(px*ox+py*oy+pz*oz)],_ --- [ax,ay,az,-(px*ax+py*ay+pz*az)],_ --- [ 0, 0, 0, 1]]) - - d * p == - v := p pretend Vector R - v := concat(v, 1$R) - v := d * v - point ([v.1, v.2, v.3]$List(R)) - -<> - -<> - -<> - -<> - -<> - -@ -\section{License} -<>= ---Portions Copyright (c) Richard Paul ---Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. ---All rights reserved. --- ---Redistribution and use in source and binary forms, with or without ---modification, are permitted provided that the following conditions are ---met: --- --- - Redistributions of source code must retain the above copyright --- notice, this list of conditions and the following disclaimer. --- --- - Redistributions in binary form must reproduce the above copyright --- notice, this list of conditions and the following disclaimer in --- the documentation and/or other materials provided with the --- distribution. --- --- - Neither the name of The Numerical ALgorithms Group Ltd. nor the --- names of its contributors may be used to endorse or promote products --- derived from this software without specific prior written permission. --- ---THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS ---IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ---TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A ---PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER ---OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ---EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ---PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ---PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ---LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ---NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ---SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -@ -<<*>>= -<> - -<> -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} Paul, Richard, -{\sl Robot Manipulators}, -MIT Press, Cambridge, Mass., -(1981) -\end{thebibliography} -\end{document} diff --git a/src/input/Makefile.pamphlet b/src/input/Makefile.pamphlet index 81a53b2..071d86e 100644 --- a/src/input/Makefile.pamphlet +++ b/src/input/Makefile.pamphlet @@ -291,8 +291,8 @@ REGRES= algaggr.regress algbrbf.regress algfacob.regress alist.regress \ cycles1.regress cycles.regress cyfactor.regress \ danzwill.regress danzwill2.regress \ decimal.regress defintef.regress defintrf.regress \ - derham.regress dfloat.regress dhtri.regress directproduct.regress \ - divisor.regress \ + derham.regress dfloat.regress dhmatrix.regress \ + dhtri.regress directproduct.regress divisor.regress \ dmp.regress dpol.regress e1.regress ei.regress \ easter.regress efi.regress \ eigen.regress elemfun.regress elemnum.regress elfuts.regress \ @@ -544,7 +544,8 @@ FILES= ${OUT}/algaggr.input ${OUT}/algbrbf.input ${OUT}/algfacob.input \ ${OUT}/decimal.input ${OUT}/defs.input \ ${OUT}/defintef.input ${OUT}/defintrf.input ${OUT}/derham.input \ ${OUT}/de2re.input \ - ${OUT}/dfloat.input ${OUT}/dhtri.input ${OUT}/directproduct.input \ + ${OUT}/dfloat.input ${OUT}/dhmatrix.input \ + ${OUT}/dhtri.input ${OUT}/directproduct.input \ ${OUT}/divisor.input \ ${OUT}/dmp.input ${OUT}/dpol.input ${OUT}/draw2dsf.input \ ${OUT}/drawalg.input ${OUT}/drawcfn.input \ @@ -779,7 +780,8 @@ DOCFILES= \ ${DOC}/de2re.input.dvi ${DOC}/decimal.input.dvi \ ${DOC}/defintef.input.dvi ${DOC}/defintrf.input.dvi \ ${DOC}/defs.input.dvi ${DOC}/derham.input.dvi \ - ${DOC}/dfloat.input.dvi ${DOC}/dhtri.input.dvi \ + ${DOC}/dfloat.input.dvi ${DOC}/dhmatrix.input.dvi \ + ${DOC}/dhtri.input.dvi \ ${DOC}/directproduct.input.dvi \ ${DOC}/divisor.input.dvi ${DOC}/dmp.input.dvi \ ${DOC}/dpol.input.dvi \ diff --git a/src/input/dhmatrix.input.pamphlet b/src/input/dhmatrix.input.pamphlet new file mode 100644 index 0000000..2725a36 --- /dev/null +++ b/src/input/dhmatrix.input.pamphlet @@ -0,0 +1,260 @@ +\documentclass{article} +\usepackage{axiom} +\begin{document} +\title{\$SPAD/src/input dhmatrix.input} +\author{Timothy Daly} +\maketitle +\begin{abstract} +\end{abstract} +\eject +\tableofcontents +\eject +<<*>>= +)spool dhmatrix.output +)set message test on +)set message auto off +)clear all + +@ +We create a target domain +<<*>>= +--S 1 of 16 +t1:=DHMATRIX(DoubleFloat) +--R +--R (1) DenavitHartenbergMatrix DoubleFloat +--R Type: Domain +--E 1 + +@ +This creates an identity element from the target domain. +<<*>>= +--S 2 of 16 +t2:=identity()$t1 +--R +--R +1. 0. 0. 0.+ +--R | | +--R |0. 1. 0. 0.| +--R (2) | | +--R |0. 0. 1. 0.| +--R | | +--R +0. 0. 0. 1.+ +--R Type: DenavitHartenbergMatrix DoubleFloat +--E 2 + +@ +This is the rotation matrix around the X axis for 30 degrees +<<*>>= +--S 3 of 16 +t3:=rotatex(30) +--R +--R +1 0 0 0+ +--R | | +--R | +-+ | +--R | \|3 1 | +--R |0 ---- - - 0| +--R | 2 2 | +--R (3) | | +--R | +-+ | +--R | 1 \|3 | +--R |0 - ---- 0| +--R | 2 2 | +--R | | +--R +0 0 0 1+ +--R Type: DenavitHartenbergMatrix Expression Integer +--E 3 + +@ +This is the rotation matrix around the Y axis for 30 degrees +<<*>>= +--S 4 of 16 +t4:=rotatey(30) +--R +--R + +-+ + +--R |\|3 1 | +--R |---- 0 - 0| +--R | 2 2 | +--R | | +--R | 0 1 0 0| +--R (4) | | +--R | +-+ | +--R | 1 \|3 | +--R |- - 0 ---- 0| +--R | 2 2 | +--R | | +--R + 0 0 0 1+ +--R Type: DenavitHartenbergMatrix Expression Integer +--E 4 + +@ +This is the rotation matrix around the Z axis for 30 degrees +<<*>>= +--S 5 of 16 +t5:=rotatez(30) +--R +--R + +-+ + +--R |\|3 1 | +--R |---- - - 0 0| +--R | 2 2 | +--R | | +--R | +-+ | +--R (5) | 1 \|3 | +--R | - ---- 0 0| +--R | 2 2 | +--R | | +--R | 0 0 1 0| +--R | | +--R + 0 0 0 1+ +--R Type: DenavitHartenbergMatrix Expression Integer +--E 5 + +@ +This scales along X, Y, and Z by 1/2 +<<*>>= +--S 6 of 16 +t6:=scale(0.5,0.5,0.5) +--R +--R +0.5 0.0 0.0 0.0+ +--R | | +--R |0.0 0.5 0.0 0.0| +--R (6) | | +--R |0.0 0.0 0.5 0.0| +--R | | +--R +0.0 0.0 0.0 1.0+ +--R Type: DenavitHartenbergMatrix Float +--E 6 + +@ +This translates along the X, Y, and Z axis by 2 units +<<*>>= +--S 7 of 16 +t7:=translate(2.0,2.0,2.0) +--R +--R +1.0 0.0 0.0 2.0+ +--R | | +--R |0.0 1.0 0.0 2.0| +--R (7) | | +--R |0.0 0.0 1.0 2.0| +--R | | +--R +0.0 0.0 0.0 1.0+ +--R Type: DenavitHartenbergMatrix Float +--E 7 + +@ +This is a point on the X axis can move around the plane +<<*>>= +--S 8 of 16 +t8:Point(DoubleFloat):=[4.0,0.0,0.0]$List(DoubleFloat) +--R +--R (8) [4.,0.,0.] +--R Type: Point DoubleFloat +--E 8 + +@ +First, we construct a translation along the X axis by 3 units +<<*>>= +--S 9 of 16 +t9:=translate(4.0,0.0,0.0) +--R +--R +1.0 0.0 0.0 4.0+ +--R | | +--R |0.0 1.0 0.0 0.0| +--R (9) | | +--R |0.0 0.0 1.0 0.0| +--R | | +--R +0.0 0.0 0.0 1.0+ +--R Type: DenavitHartenbergMatrix Float +--E 9 + +@ +and we apply the transformation so t8 is now moved +<<*>>= +--S 10 of 16 +t10:=t9*t8 +--R +--R (10) [8.,0.,0.] +--R Type: Point DoubleFloat +--E 10 + +@ +Now we rotate the point 90 degrees around the Z axis +which will move the point from the X axis to the Y axis. +<<*>>= +--S 11 of 16 +t11:=rotatez(90)*t10 +--R +--R (11) [0.,8.,0.] +--R Type: Point Expression DoubleFloat +--E 11 + +@ +and we can scale the point by 1/2 to shorten along the Y axis +<<*>>= +--S 12 of 16 +t12:=scale(0.0,0.5,0.0)*t11 +--R +--R (12) [0.,4.,0.] +--R Type: Point Expression DoubleFloat +--E 12 + +@ +Now we rotate the point 90 degrees around the X axis +which will move the point from the Y axis to the Z axis. +<<*>>= +--S 13 of 16 +t13:=rotatex(90)*t12 +--R +--R (13) [0.,0.,4.] +--R Type: Point Expression DoubleFloat +--E 13 + +@ +Now we rotate the point 90 degrees around the Y axis +which will move the point from the Z axis to the X axis. +We are now back to the original point +<<*>>= +--S 14 of 16 +t14:=rotatey(90)*t13 +--R +--R (14) [4.,0.,0.] +--R Type: Point Expression DoubleFloat +--E 14 + +@ +We can do all of the translations, rotations, and scaling and +create a single matrix that will apply them all at once. +<<*>>= +--S 15 of 16 +t15:=rotatey(90)*rotatex(90)*scale(0.0,0.5,0.0)*_ + rotatez(90)*translate(4.0,0.0,0.0) +--R +--R +0.5 0.0 0.0 2.0+ +--R | | +--R |0.0 0.0 0.0 0.0| +--R (15) | | +--R |0.0 0.0 0.0 0.0| +--R | | +--R +0.0 0.0 0.0 1.0+ +--R Type: DenavitHartenbergMatrix Expression Float +--E 15 + +@ +We can do all of the translations, rotations, and scaling and +create a single matrix that will apply them all at once. The +original point is moved around the space back to its original point. +<<*>>= +--S 16 of 16 +t16:=t15*t8 +--R +--R (16) [4.,0.,0.] +--R Type: Point Expression DoubleFloat +--E 16 + +)spool +)lisp (bye) + +@ +\eject +\begin{thebibliography}{99} +\bibitem{1} nothing +\end{thebibliography} +\end{document}