Merge of itasc branch. Project files, scons and cmake should be working. Makefile...
[blender.git] / intern / itasc / kdl / segment.hpp
1 // Copyright  (C)  2007  Ruben Smits <ruben dot smits at mech dot kuleuven dot be>
2
3 // Version: 1.0
4 // Author: Ruben Smits <ruben dot smits at mech dot kuleuven dot be>
5 // Maintainer: Ruben Smits <ruben dot smits at mech dot kuleuven dot be>
6 // URL: http://www.orocos.org/kdl
7
8 // This library is free software; you can redistribute it and/or
9 // modify it under the terms of the GNU Lesser General Public
10 // License as published by the Free Software Foundation; either
11 // version 2.1 of the License, or (at your option) any later version.
12
13 // This library is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 // Lesser General Public License for more details.
17
18 // You should have received a copy of the GNU Lesser General Public
19 // License along with this library; if not, write to the Free Software
20 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
21
22
23 #ifndef KDL_SEGMENT_HPP
24 #define KDL_SEGMENT_HPP
25
26 #include "frames.hpp"
27 #include "inertia.hpp"
28 #include "joint.hpp"
29 #include <vector>
30
31 namespace KDL {
32
33     /**
34           * \brief This class encapsulates a simple segment, that is a "rigid
35           * body" (i.e., a frame and an inertia) with a joint and with
36           * "handles", root and tip to connect to other segments.
37      *
38      * A simple segment is described by the following properties :
39      *      - Joint
40      *      - inertia: of the rigid body part of the Segment
41      *      - Offset from the end of the joint to the tip of the segment:
42      *        the joint is located at the root of the segment.
43      *
44      * @ingroup KinematicFamily
45      */
46     class Segment {
47         friend class Chain;
48     private:
49         Joint joint;
50         Inertia M;
51         Frame f_tip;
52
53     public:
54         /**
55          * Constructor of the segment
56          *
57          * @param joint joint of the segment, default:
58          * Joint(Joint::None)
59          * @param f_tip frame from the end of the joint to the tip of
60          * the segment, default: Frame::Identity()
61          * @param M rigid body inertia of the segment, default: Inertia::Zero()
62          */
63         Segment(const Joint& joint=Joint(), const Frame& f_tip=Frame::Identity(),const Inertia& M = Inertia::Zero());
64         Segment(const Segment& in);
65         Segment& operator=(const Segment& arg);
66
67         virtual ~Segment();
68
69         /**
70          * Request the pose of the segment, given the joint position q.
71          *
72          * @param q 1D position of the joint
73          *
74          * @return pose from the root to the tip of the segment
75          */
76         Frame pose(const double& q)const;
77         /**
78          * Request the 6D-velocity of the tip of the segment, given
79          * the joint position q and the joint velocity qdot.
80          *
81          * @param q ND position of the joint
82          * @param qdot ND velocity of the joint
83          *
84          * @return 6D-velocity of the tip of the segment, expressed
85          *in the base-frame of the segment(root) and with the tip of
86          *the segment as reference point.
87          */
88         Twist twist(const double& q,const double& qdot, int dof=0)const;
89
90         /**
91          * Request the 6D-velocity at a given point p, relative to base frame of the segment
92          * givven the joint velocity qdot.
93          *
94          * @param p reference point
95          * @param qdot ND velocity of the joint
96          *
97          * @return 6D-velocity at a given point p, expressed
98          * in the base-frame of the segment(root) 
99          */
100             Twist twist(const Vector& p, const double& qdot, int dof=0)const;
101
102         /**
103          * Request the 6D-velocity at a given frame origin, relative to base frame of the segment
104          * assuming the frame rotation is the rotation of the joint.
105          *
106          * @param f joint pose frame + reference point
107          * @param qdot ND velocity of the joint
108          *
109          * @return 6D-velocity at frame reference point, expressed
110          * in the base-frame of the segment(root) 
111          */
112                 Twist twist(const Frame& f, const double& qdot, int dof)const;
113
114         /**
115          * Request the joint of the segment
116          *
117          *
118          * @return const reference to the joint of the segment
119          */
120         const Joint& getJoint()const
121         {
122             return joint;
123         }
124         /**
125          * Request the inertia of the segment
126          *
127          *
128          * @return const reference to the inertia of the segment
129          */
130         const Inertia& getInertia()const
131         {
132             return M;
133         }
134
135         /**
136          * Request the pose from the joint end to the tip of the
137          *segment.
138          *
139          * @return const reference to the joint end - segment tip pose.
140          */
141         const Frame& getFrameToTip()const
142         {
143             return f_tip;
144         }
145
146     };
147 }//end of namespace KDL
148
149 #endif