<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>The MRPT project: jacobians.h Source File</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> </head><body> <div align="left"><a href="http://www.mrpt.org/">Main MRPT website</a> > <b>C++ reference</b> </div> <div align="right"> <a href="index.html"><img border="0" src="mrpt_logo.png" alt="MRPT logo"></a> </div> <!-- Generated by Doxygen 1.7.2 --> <script type="text/javascript"><!-- var searchBox = new SearchBox("searchBox", "search",false,'Search'); --></script> <div class="navigation" id="top"> <div class="tabs"> <ul class="tablist"> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="pages.html"><span>Related Pages</span></a></li> <li><a href="modules.html"><span>Modules</span></a></li> <li><a href="namespaces.html"><span>Namespaces</span></a></li> <li><a href="annotated.html"><span>Classes</span></a></li> <li class="current"><a href="files.html"><span>Files</span></a></li> <li id="searchli"> <div id="MSearchBox" class="MSearchBoxInactive"> <span class="left"> <form id="FSearchBox" action="search.php" method="get"> <img id="MSearchSelect" src="search/mag.png" alt=""/> <input type="text" id="MSearchField" name="query" value="Search" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)"/> </form> </span><span class="right"></span> </div> </li> </ul> </div> <div class="tabs2"> <ul class="tablist"> <li><a href="files.html"><span>File List</span></a></li> <li><a href="globals.html"><span>File Members</span></a></li> </ul> </div> <div class="header"> <div class="headertitle"> <h1>jacobians.h</h1> </div> </div> <div class="contents"> <a href="jacobians_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/* +---------------------------------------------------------------------------+</span> <a name="l00002"></a>00002 <span class="comment"> | The Mobile Robot Programming Toolkit (MRPT) C++ library |</span> <a name="l00003"></a>00003 <span class="comment"> | |</span> <a name="l00004"></a>00004 <span class="comment"> | http://mrpt.sourceforge.net/ |</span> <a name="l00005"></a>00005 <span class="comment"> | |</span> <a name="l00006"></a>00006 <span class="comment"> | Copyright (C) 2005-2011 University of Malaga |</span> <a name="l00007"></a>00007 <span class="comment"> | |</span> <a name="l00008"></a>00008 <span class="comment"> | This software was written by the Machine Perception and Intelligent |</span> <a name="l00009"></a>00009 <span class="comment"> | Robotics Lab, University of Malaga (Spain). |</span> <a name="l00010"></a>00010 <span class="comment"> | Contact: Jose-Luis Blanco <jlblanco@ctima.uma.es> |</span> <a name="l00011"></a>00011 <span class="comment"> | |</span> <a name="l00012"></a>00012 <span class="comment"> | This file is part of the MRPT project. |</span> <a name="l00013"></a>00013 <span class="comment"> | |</span> <a name="l00014"></a>00014 <span class="comment"> | MRPT is free software: you can redistribute it and/or modify |</span> <a name="l00015"></a>00015 <span class="comment"> | it under the terms of the GNU General Public License as published by |</span> <a name="l00016"></a>00016 <span class="comment"> | the Free Software Foundation, either version 3 of the License, or |</span> <a name="l00017"></a>00017 <span class="comment"> | (at your option) any later version. |</span> <a name="l00018"></a>00018 <span class="comment"> | |</span> <a name="l00019"></a>00019 <span class="comment"> | MRPT is distributed in the hope that it will be useful, |</span> <a name="l00020"></a>00020 <span class="comment"> | but WITHOUT ANY WARRANTY; without even the implied warranty of |</span> <a name="l00021"></a>00021 <span class="comment"> | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |</span> <a name="l00022"></a>00022 <span class="comment"> | GNU General Public License for more details. |</span> <a name="l00023"></a>00023 <span class="comment"> | |</span> <a name="l00024"></a>00024 <span class="comment"> | You should have received a copy of the GNU General Public License |</span> <a name="l00025"></a>00025 <span class="comment"> | along with MRPT. If not, see <http://www.gnu.org/licenses/>. |</span> <a name="l00026"></a>00026 <span class="comment"> | |</span> <a name="l00027"></a>00027 <span class="comment"> +---------------------------------------------------------------------------+ */</span> <a name="l00028"></a>00028 <span class="preprocessor">#ifndef mrpt_math_jacobians_H</span> <a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#define mrpt_math_jacobians_H</span> <a name="l00030"></a>00030 <span class="preprocessor"></span> <a name="l00031"></a>00031 <span class="preprocessor">#include <<a class="code" href="_c_quaternion_8h.html">mrpt/math/CQuaternion.h</a>></span> <a name="l00032"></a>00032 <span class="preprocessor">#include <<a class="code" href="base_2include_2mrpt_2math_2utils_8h.html">mrpt/math/utils.h</a>></span> <a name="l00033"></a>00033 <span class="preprocessor">#include <<a class="code" href="_c_pose3_d_8h.html">mrpt/poses/CPose3D.h</a>></span> <a name="l00034"></a>00034 <span class="preprocessor">#include <<a class="code" href="_c_pose3_d_p_d_f_gaussian_8h.html">mrpt/poses/CPose3DPDFGaussian.h</a>></span> <a name="l00035"></a>00035 <span class="preprocessor">#include <<a class="code" href="_c_pose_p_d_f_gaussian_8h.html">mrpt/poses/CPosePDFGaussian.h</a>></span> <a name="l00036"></a>00036 <a name="l00037"></a>00037 <span class="keyword">namespace </span>mrpt <a name="l00038"></a>00038 { <a name="l00039"></a>00039 <span class="keyword">namespace </span>math <a name="l00040"></a>00040 {<span class="comment"></span> <a name="l00041"></a>00041 <span class="comment"> /** A collection of functions to compute jacobians of diverse transformations, etc (some functions are redirections to existing methods elsewhere, so this namespace is actually used with grouping purposes).</span> <a name="l00042"></a>00042 <span class="comment"> * Since most functions in this namespace are inline, their use implies no execution time overload and the code may be more clear to read, so it's recommended to use them where needed.</span> <a name="l00043"></a>00043 <span class="comment"> */</span> <a name="l00044"></a><a class="code" href="namespacemrpt_1_1math_1_1jacobians.html">00044</a> <span class="keyword">namespace </span>jacobians <a name="l00045"></a>00045 { <a name="l00046"></a>00046 <span class="keyword">using namespace </span>mrpt::utils; <a name="l00047"></a>00047 <span class="keyword">using namespace </span>mrpt::poses; <a name="l00048"></a>00048 <span class="keyword">using namespace </span>mrpt::math; <a name="l00049"></a>00049 <span class="comment"></span> <a name="l00050"></a>00050 <span class="comment"> /** Computes the 4x3 Jacobian of the transformation from a 3D pose angles (yaw pitch roll) into a Quaternion, that is, the Jacobian of:</span> <a name="l00051"></a>00051 <span class="comment"> * \f[ \mathbf{q} = \left( \begin{array}{c} \cos (\phi /2) \cos (\theta /2) \cos (\psi /2) + \sin (\phi /2) \sin (\theta /2) \sin (\psi /2) \\ \sin (\phi /2) \cos (\theta /2) \cos (\psi /2) - \cos (\phi /2) \sin (\theta /2) \sin (\psi /2) \\ \cos (\phi /2) \sin (\theta /2) \cos (\psi /2) + \sin (\phi /2) \cos (\theta /2) \sin (\psi /2) \\ \cos (\phi /2) \cos (\theta /2) \sin (\psi /2) - \sin (\phi /2) \sin (\theta /2) \cos (\psi /2) \\ \end{array}\right) \f]</span> <a name="l00052"></a>00052 <span class="comment"> * With : \f$ \phi = roll \f$, \f$ \theta = pitch \f$ and \f$ \psi = yaw \f$.</span> <a name="l00053"></a>00053 <span class="comment"> * \sa jacob_yawpitchroll_from_quat, mrpt::poses::CPose3D::getAsQuaternion</span> <a name="l00054"></a>00054 <span class="comment"> */</span> <a name="l00055"></a><a class="code" href="namespacemrpt_1_1math_1_1jacobians.html#a30e4241b019f9b1160df7bca4afb783d">00055</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacemrpt_1_1math_1_1jacobians.html#a30e4241b019f9b1160df7bca4afb783d" title="Computes the 4x3 Jacobian of the transformation from a 3D pose angles (yaw pitch roll) into a Quatern...">jacob_quat_from_yawpitchroll</a>( <a name="l00056"></a>00056 <a class="code" href="classmrpt_1_1math_1_1_c_matrix_fixed_numeric.html" title="A numeric matrix of compile-time fixed size.">CMatrixFixedNumeric<double,4,3></a> &out_dq_dr, <a name="l00057"></a>00057 <span class="keyword">const</span> <span class="keywordtype">double</span> yaw, <a name="l00058"></a>00058 <span class="keyword">const</span> <span class="keywordtype">double</span> pitch, <a name="l00059"></a>00059 <span class="keyword">const</span> <span class="keywordtype">double</span> roll <a name="l00060"></a>00060 ) <a name="l00061"></a>00061 { <a name="l00062"></a>00062 <a class="code" href="classmrpt_1_1math_1_1_c_quaternion.html">CQuaternionDouble</a> q(<a class="code" href="namespacemrpt_1_1math.html#a8ab289d85828809b390d477f824a908aa845e9a46f0b0e9601057449d65849fb5">UNINITIALIZED_QUATERNION</a>); <a name="l00063"></a>00063 <a class="code" href="classmrpt_1_1poses_1_1_c_pose3_d.html" title="A class used to store a 3D pose (a 3D translation + a rotation in 3D).">CPose3D</a> p(0,0,0,yaw,pitch,roll); <a name="l00064"></a>00064 p.<a class="code" href="classmrpt_1_1poses_1_1_c_pose3_d.html#a31e4434ffbcf84c2675abcc131a51abf" title="Returns the quaternion associated to the rotation of this object (NOTE: XYZ translation is ignored) ...">getAsQuaternion</a>(q,&out_dq_dr); <a name="l00065"></a>00065 } <a name="l00066"></a>00066 <span class="comment"></span> <a name="l00067"></a>00067 <span class="comment"> /** Computes the 4x3 Jacobian of the transformation from a 3D pose angles (yaw pitch roll) into a Quaternion, that is, the Jacobian of:</span> <a name="l00068"></a>00068 <span class="comment"> * \f[ \mathbf{q} = \left( \begin{array}{c} \cos (\phi /2) \cos (\theta /2) \cos (\psi /2) + \sin (\phi /2) \sin (\theta /2) \sin (\psi /2) \\ \sin (\phi /2) \cos (\theta /2) \cos (\psi /2) - \cos (\phi /2) \sin (\theta /2) \sin (\psi /2) \\ \cos (\phi /2) \sin (\theta /2) \cos (\psi /2) + \sin (\phi /2) \cos (\theta /2) \sin (\psi /2) \\ \cos (\phi /2) \cos (\theta /2) \sin (\psi /2) - \sin (\phi /2) \sin (\theta /2) \cos (\psi /2) \\ \end{array}\right) \f]</span> <a name="l00069"></a>00069 <span class="comment"> * With : \f$ \phi = roll \f$, \f$ \theta = pitch \f$ and \f$ \psi = yaw \f$.</span> <a name="l00070"></a>00070 <span class="comment"> * \sa jacob_yawpitchroll_from_quat, mrpt::poses::CPose3D::getAsQuaternion</span> <a name="l00071"></a>00071 <span class="comment"> */</span> <a name="l00072"></a><a class="code" href="namespacemrpt_1_1math_1_1jacobians.html#ad8c2781c9bbd4c32743bf0be99bf8c33">00072</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacemrpt_1_1math_1_1jacobians.html#a30e4241b019f9b1160df7bca4afb783d" title="Computes the 4x3 Jacobian of the transformation from a 3D pose angles (yaw pitch roll) into a Quatern...">jacob_quat_from_yawpitchroll</a>( <a name="l00073"></a>00073 <a class="code" href="classmrpt_1_1math_1_1_c_matrix_fixed_numeric.html" title="A numeric matrix of compile-time fixed size.">CMatrixFixedNumeric<double,4,3></a> &out_dq_dr, <a name="l00074"></a>00074 <span class="keyword">const</span> <a class="code" href="classmrpt_1_1poses_1_1_c_pose3_d.html" title="A class used to store a 3D pose (a 3D translation + a rotation in 3D).">CPose3D</a> &in_pose <a name="l00075"></a>00075 ) <a name="l00076"></a>00076 { <a name="l00077"></a>00077 <a class="code" href="classmrpt_1_1math_1_1_c_quaternion.html">CQuaternionDouble</a> q(<a class="code" href="namespacemrpt_1_1math.html#a8ab289d85828809b390d477f824a908aa845e9a46f0b0e9601057449d65849fb5">UNINITIALIZED_QUATERNION</a>); <a name="l00078"></a>00078 in_pose.<a class="code" href="classmrpt_1_1poses_1_1_c_pose3_d.html#a31e4434ffbcf84c2675abcc131a51abf" title="Returns the quaternion associated to the rotation of this object (NOTE: XYZ translation is ignored) ...">getAsQuaternion</a>(q,&out_dq_dr); <a name="l00079"></a>00079 } <a name="l00080"></a>00080 <a name="l00081"></a>00081 <span class="comment"></span> <a name="l00082"></a>00082 <span class="comment"> /** Computes the 3x4 Jacobian of the transformation from a quaternion (qr qx qy qz) to 3D pose angles (yaw pitch roll).</span> <a name="l00083"></a>00083 <span class="comment"> * \sa jacob_quat_from_yawpitchroll</span> <a name="l00084"></a>00084 <span class="comment"> */</span> <a name="l00085"></a><a class="code" href="namespacemrpt_1_1math_1_1jacobians.html#ae82c0c77eb8140df495cdb9312bcf49a">00085</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacemrpt_1_1math_1_1jacobians.html#ae82c0c77eb8140df495cdb9312bcf49a" title="Computes the 3x4 Jacobian of the transformation from a quaternion (qr qx qy qz) to 3D pose angles (ya...">jacob_yawpitchroll_from_quat</a>( <a name="l00086"></a>00086 <a class="code" href="classmrpt_1_1math_1_1_c_matrix_fixed_numeric.html" title="A numeric matrix of compile-time fixed size.">CMatrixFixedNumeric<double,3,4></a> &out_dr_dq <a name="l00087"></a>00087 ) <a name="l00088"></a>00088 { <a name="l00089"></a>00089 <a class="code" href="mrpt__macros_8h.html#aaa3f404ea85a6575a7139f8d101370ba">THROW_EXCEPTION</a>(<span class="stringliteral">"TO DO"</span>) <a name="l00090"></a>00090 } <a name="l00091"></a>00091 <span class="comment"></span> <a name="l00092"></a>00092 <span class="comment"> /** Compute the Jacobian of the rotation composition operation \f$ p = f(\cdot) = q_{this} \times r \f$, that is the 4x4 matrix \f$ \frac{\partial f}{\partial q_{this} } \f$.</span> <a name="l00093"></a>00093 <span class="comment"> * The output matrix can be a dynamic or fixed size (4x4) matrix. The input quaternion can be mrpt::math::CQuaternionFloat or mrpt::math::CQuaternionDouble.</span> <a name="l00094"></a>00094 <span class="comment"> */</span> <a name="l00095"></a>00095 <span class="keyword">template</span> <<span class="keyword">class</span> QUATERNION,<span class="keyword">class</span> MATRIXLIKE> <a name="l00096"></a><a class="code" href="namespacemrpt_1_1math_1_1jacobians.html#a8363c1894ed7ebf667680233ba475638">00096</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacemrpt_1_1math_1_1jacobians.html#a8363c1894ed7ebf667680233ba475638" title="Compute the Jacobian of the rotation composition operation , that is the 4x4 matrix ...">jacob_quat_rotation</a>(<span class="keyword">const</span> QUATERNION& quaternion, MATRIXLIKE &out_mat4x4) <a name="l00097"></a>00097 { <a name="l00098"></a>00098 quaternion.rotationJacobian(out_mat4x4); <a name="l00099"></a>00099 } <a name="l00100"></a>00100 <span class="comment"></span> <a name="l00101"></a>00101 <span class="comment"> /** Given the 3D(6D) pose composition \f$ f(x,u) = x \oplus u \f$, compute the two 6x6 Jacobians \f$ \frac{\partial f}{\partial x} \f$ and \f$ \frac{\partial f}{\partial u} \f$.</span> <a name="l00102"></a>00102 <span class="comment"> * For the equations, see CPose3DPDFGaussian::jacobiansPoseComposition</span> <a name="l00103"></a>00103 <span class="comment"> */</span> <a name="l00104"></a><a class="code" href="namespacemrpt_1_1math_1_1jacobians.html#acb6a24540a986fe0f20d73c8c72f1b50">00104</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacemrpt_1_1math_1_1jacobians.html#acb6a24540a986fe0f20d73c8c72f1b50" title="Given the 3D(6D) pose composition , compute the two 6x6 Jacobians and .">jacobs_6D_pose_comp</a>( <a name="l00105"></a>00105 <span class="keyword">const</span> <a class="code" href="classmrpt_1_1poses_1_1_c_pose3_d.html" title="A class used to store a 3D pose (a 3D translation + a rotation in 3D).">CPose3D</a> &x, <a name="l00106"></a>00106 <span class="keyword">const</span> <a class="code" href="classmrpt_1_1poses_1_1_c_pose3_d.html" title="A class used to store a 3D pose (a 3D translation + a rotation in 3D).">CPose3D</a> &u, <a name="l00107"></a>00107 <a class="code" href="classmrpt_1_1math_1_1_c_matrix_fixed_numeric.html">CMatrixDouble66</a> &out_df_dx, <a name="l00108"></a>00108 <a class="code" href="classmrpt_1_1math_1_1_c_matrix_fixed_numeric.html">CMatrixDouble66</a> &out_df_du) <a name="l00109"></a>00109 { <a name="l00110"></a>00110 <a class="code" href="classmrpt_1_1poses_1_1_c_pose3_d_p_d_f_gaussian.html#a3ebe1b404b8d2749eba448a91c4d5bf5" title="This static method computes the pose composition Jacobians.">CPose3DPDFGaussian::jacobiansPoseComposition</a>(x,u,out_df_dx,out_df_du); <a name="l00111"></a>00111 } <a name="l00112"></a>00112 <span class="comment"></span> <a name="l00113"></a>00113 <span class="comment"> /** Given the 2D pose composition \f$ f(x,u) = x \oplus u \f$, compute the two 3x3 Jacobians \f$ \frac{\partial f}{\partial x} \f$ and \f$ \frac{\partial f}{\partial u} \f$.</span> <a name="l00114"></a>00114 <span class="comment"> * For the equations, see CPosePDFGaussian::jacobiansPoseComposition</span> <a name="l00115"></a>00115 <span class="comment"> */</span> <a name="l00116"></a><a class="code" href="namespacemrpt_1_1math_1_1jacobians.html#ab49860321328e9d934c2e9f019e1c464">00116</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacemrpt_1_1math_1_1jacobians.html#ab49860321328e9d934c2e9f019e1c464" title="Given the 2D pose composition , compute the two 3x3 Jacobians and .">jacobs_2D_pose_comp</a>( <a name="l00117"></a>00117 <span class="keyword">const</span> <a class="code" href="classmrpt_1_1poses_1_1_c_pose_p_d_f_gaussian.html" title="Declares a class that represents a Probability Density function (PDF) of a 2D pose ...">CPosePDFGaussian</a> &x, <a name="l00118"></a>00118 <span class="keyword">const</span> <a class="code" href="classmrpt_1_1poses_1_1_c_pose_p_d_f_gaussian.html" title="Declares a class that represents a Probability Density function (PDF) of a 2D pose ...">CPosePDFGaussian</a> &u, <a name="l00119"></a>00119 <a class="code" href="classmrpt_1_1math_1_1_c_matrix_fixed_numeric.html">CMatrixDouble33</a> &out_df_dx, <a name="l00120"></a>00120 <a class="code" href="classmrpt_1_1math_1_1_c_matrix_fixed_numeric.html">CMatrixDouble33</a> &out_df_du) <a name="l00121"></a>00121 { <a name="l00122"></a>00122 <a class="code" href="classmrpt_1_1poses_1_1_c_pose_p_d_f_gaussian.html#a09df13a3b30ffdb07c24b4eadb2e5641" title="This static method computes the pose composition Jacobians, with these formulas:">CPosePDFGaussian::jacobiansPoseComposition</a>(x,u,out_df_dx,out_df_du); <a name="l00123"></a>00123 } <a name="l00124"></a>00124 <span class="comment"></span> <a name="l00125"></a>00125 <span class="comment"> /** Numerical estimation of the Jacobian of a user-supplied function - this template redirects to mrpt::math::estimateJacobian, see that function for documentation. */</span> <a name="l00126"></a>00126 <span class="keyword">template</span> <<span class="keyword">class</span> VECTORLIKE,<span class="keyword">class</span> VECTORLIKE2, <span class="keyword">class</span> VECTORLIKE3, <span class="keyword">class</span> MATRIXLIKE, <span class="keyword">class</span> USERPARAM > <a name="l00127"></a><a class="code" href="namespacemrpt_1_1math_1_1jacobians.html#ab74e763a8fdadf7870a460605af09bda">00127</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacemrpt_1_1math_1_1jacobians.html#ab74e763a8fdadf7870a460605af09bda" title="Numerical estimation of the Jacobian of a user-supplied function - this template redirects to mrpt::m...">jacob_numeric_estimate</a>( <a name="l00128"></a>00128 <span class="keyword">const</span> VECTORLIKE &x, <a name="l00129"></a>00129 <span class="keywordtype">void</span> (*functor) (<span class="keyword">const</span> VECTORLIKE &x,<span class="keyword">const</span> USERPARAM &<a class="code" href="namespaceinternal.html#a170c9f639220e3eb414362c243c80dee">y</a>, VECTORLIKE3 &out), <a name="l00130"></a>00130 <span class="keyword">const</span> VECTORLIKE2 &increments, <a name="l00131"></a>00131 <span class="keyword">const</span> USERPARAM &userParam, <a name="l00132"></a>00132 MATRIXLIKE &out_Jacobian ) <a name="l00133"></a>00133 { <a name="l00134"></a>00134 <a class="code" href="namespacemrpt_1_1math.html#ac0ce577d29a01ff3ddf74686abd7005d" title="Estimate the Jacobian of a multi-dimensional function around a point &quot;x&quot;, using finite differences of a given size in each input dimension.">mrpt::math::estimateJacobian</a>(x,functor,increments,userParam,out_Jacobian); <a name="l00135"></a>00135 } <a name="l00136"></a>00136 <a name="l00137"></a>00137 <a name="l00138"></a>00138 } <span class="comment">// End of jacobians namespace</span> <a name="l00139"></a>00139 <a name="l00140"></a>00140 } <span class="comment">// End of MATH namespace</span> <a name="l00141"></a>00141 <a name="l00142"></a>00142 } <span class="comment">// End of namespace</span> <a name="l00143"></a>00143 <a name="l00144"></a>00144 <span class="preprocessor">#endif</span> </pre></div></div> </div> <br><hr><br> <table border="0" width="100%"> <tr> <td> Page generated by <a href="http://www.doxygen.org" target="_blank">Doxygen 1.7.2</a> for MRPT 0.9.4 SVN: at Mon Jan 10 22:30:30 UTC 2011</td><td></td> <td width="100"> </td> <td width="150"> </td></tr> </table> </body></html>