3
\brief Implementations of the LinkTraverse class
4
\author Shin'ichiro Nakaoka
7
#include "LinkTraverse.h"
11
using namespace cnoid;
14
LinkTraverse::LinkTraverse()
20
LinkTraverse::LinkTraverse(int size)
27
LinkTraverse::LinkTraverse(Link* root, bool doUpward, bool doDownward)
29
find(root, doUpward, doDownward);
33
LinkTraverse::~LinkTraverse()
39
void LinkTraverse::find(Link* root, bool doUpward, bool doDownward)
41
numUpwardConnections = 0;
43
traverse(root, doUpward, doDownward, false, 0);
47
void LinkTraverse::traverse(Link* link, bool doUpward, bool doDownward, bool isUpward, Link* prev)
49
links.push_back(link);
51
++numUpwardConnections;
54
if(doUpward && link->parent){
55
traverse(link->parent, doUpward, true, true, link);
58
for(Link* child = link->child; child; child = child->sibling){
60
traverse(child, false, true, false, 0);
67
void LinkTraverse::calcForwardKinematics(bool calcVelocity, bool calcAcceleration) const
71
for(i=1; i <= numUpwardConnections; ++i){
73
Link* link = links[i];
74
Link* child = links[i-1];
76
switch(child->jointType){
78
case Link::ROTATIONAL_JOINT:
79
link->R.noalias() = child->R * AngleAxisd(child->q, child->a).inverse();
80
arm.noalias() = link->R * child->b;
81
link->p = child->p - arm;
84
child->sw.noalias() = link->R * child->a;
85
link->w = child->w - child->dq * child->sw;
86
link->v = child->v - link->w.cross(arm);
89
link->dw = child->dw - child->dq * child->w.cross(child->sw) - (child->ddq * child->sw);
90
link->dv = child->dv - child->w.cross(child->w.cross(arm)) - child->dw.cross(arm);
95
case Link::SLIDE_JOINT:
97
arm.noalias() = link->R * (child->b + child->q * child->d);
98
link->p = child->p - arm;
101
child->sv.noalias() = link->R * child->d;
103
link->v = child->v - child->dq * child->sv;
105
if(calcAcceleration){
106
link->dw = child->dw;
107
link->dv = child->dv - child->w.cross(child->w.cross(arm)) - child->dw.cross(arm)
108
- 2.0 * child->dq * child->w.cross(child->sv) - child->ddq * child->sv;
113
case Link::FIXED_JOINT:
116
link->p.noalias() = child->p - (link->R * child->b);
122
if(calcAcceleration){
123
link->dw = child->dw;
124
link->dv = child->dv;
131
int n = links.size();
134
Link* link = links[i];
135
Link* parent = link->parent;
137
switch(link->jointType){
139
case Link::ROTATIONAL_JOINT:
140
link->R.noalias() = parent->R * AngleAxisd(link->q, link->a);
141
arm.noalias() = parent->R * link->b;
142
link->p = parent->p + arm;
145
link->sw.noalias() = parent->R * link->a;
146
link->w = parent->w + link->sw * link->dq;
147
link->v = parent->v + parent->w.cross(arm);
149
if(calcAcceleration){
150
link->dw = parent->dw + link->dq * parent->w.cross(link->sw) + (link->ddq * link->sw);
151
link->dv = parent->dv + parent->w.cross(parent->w.cross(arm)) + parent->dw.cross(arm);
156
case Link::SLIDE_JOINT:
158
arm.noalias() = parent->R * (link->b + link->q * link->d);
159
link->p = parent->p + arm;
162
link->sv.noalias() = parent->R * link->d;
164
link->v = parent->v + link->sv * link->dq;
166
if(calcAcceleration){
167
link->dw = parent->dw;
168
link->dv = parent->dv + parent->w.cross(parent->w.cross(arm)) + parent->dw.cross(arm)
169
+ 2.0 * link->dq * parent->w.cross(link->sv) + link->ddq * link->sv;
174
case Link::FIXED_JOINT:
177
link->p.noalias() = parent->R * link->b + parent->p;
183
if(calcAcceleration){
184
link->dw = parent->dw;
185
link->dv = parent->dv;
194
std::ostream& operator<<(std::ostream& os, LinkTraverse& traverse)
196
int n = traverse.numLinks();
197
for(int i=0; i < n; ++i){
198
Link* link = traverse[i];
201
os << (traverse.isDownward(i) ? " => " : " <= ");