Skip to content

Commit e752e65

Browse files
Fix bug in tesseract kdl kinematics
1 parent 44b86cf commit e752e65

File tree

2 files changed

+139
-79
lines changed

2 files changed

+139
-79
lines changed

tesseract/tesseract_kinematics/include/tesseract_kinematics/kdl/kdl_utils.h

Lines changed: 3 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,6 @@ inline bool parseSceneGraph(KDLChainData& results,
181181

182182
results.joint_list.resize(results.robot_chain.getNrOfJoints());
183183
results.joint_limits.resize(results.robot_chain.getNrOfJoints(), 2);
184-
std::vector<int> joint_too_segment;
185-
joint_too_segment.resize(results.robot_chain.getNrOfJoints());
186-
joint_too_segment.back() = -1;
187184

188185
results.segment_index[results.base_name] = 0;
189186
results.link_list.push_back(results.base_name);
@@ -195,6 +192,9 @@ inline bool parseSceneGraph(KDLChainData& results,
195192
const KDL::Joint& jnt = seg.getJoint();
196193
results.link_list.push_back(seg.getName());
197194

195+
// When requesting forward kin for link_name it is index + 1
196+
results.segment_index[seg.getName()] = static_cast<int>(i + 1);
197+
198198
if (found)
199199
results.active_link_list.push_back(seg.getName());
200200

@@ -211,8 +211,6 @@ inline bool parseSceneGraph(KDLChainData& results,
211211
const tesseract_scene_graph::Joint::ConstPtr& joint = scene_graph.getJoint(jnt.getName());
212212
results.joint_limits(j, 0) = joint->limits->lower;
213213
results.joint_limits(j, 1) = joint->limits->upper;
214-
if (j > 0)
215-
joint_too_segment[j - 1] = static_cast<int>(i);
216214

217215
// Need to set limits for continuous joints. TODO: This may not be required
218216
// by the optization library but may be nice to have
@@ -226,38 +224,6 @@ inline bool parseSceneGraph(KDLChainData& results,
226224
++j;
227225
}
228226

229-
for (unsigned i = 0; i < results.robot_chain.getNrOfSegments(); ++i)
230-
{
231-
bool found = false;
232-
const KDL::Segment& seg = results.robot_chain.getSegment(i);
233-
tesseract_scene_graph::Link::ConstPtr link_model = scene_graph.getLink(seg.getName());
234-
while (!found)
235-
{
236-
// Check if the link is the root
237-
std::vector<tesseract_scene_graph::Joint::ConstPtr> parent_joints =
238-
scene_graph.getInboundJoints(link_model->getName());
239-
if (parent_joints.empty())
240-
{
241-
results.segment_index[seg.getName()] = 0;
242-
break;
243-
}
244-
245-
std::string joint_name = parent_joints[0]->getName();
246-
std::vector<std::string>::const_iterator it =
247-
std::find(results.joint_list.begin(), results.joint_list.end(), joint_name);
248-
if (it != results.joint_list.end())
249-
{
250-
unsigned joint_index = static_cast<unsigned>(it - results.joint_list.begin());
251-
results.segment_index[seg.getName()] = joint_too_segment[joint_index];
252-
found = true;
253-
}
254-
else
255-
{
256-
link_model = scene_graph.getSourceLink(joint_name);
257-
}
258-
}
259-
}
260-
261227
return true;
262228
}
263229
} // namespace tesseract_kinematics

tesseract/tesseract_kinematics/test/kdl_kinematics_unit.cpp

Lines changed: 136 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,83 @@ void runFwdKinTest(tesseract_kinematics::ForwardKinematics& kin)
6363
///////////////////////////
6464
// Test forward kinematics
6565
///////////////////////////
66+
{
67+
pose.setIdentity();
68+
EXPECT_TRUE(kin.calcFwdKin(pose, jvals, "link_1"));
69+
Eigen::Isometry3d result;
70+
result.setIdentity();
71+
result.translation()[0] = 0;
72+
result.translation()[1] = 0;
73+
result.translation()[2] = 0;
74+
EXPECT_TRUE(pose.isApprox(result));
75+
}
76+
77+
{
78+
pose.setIdentity();
79+
EXPECT_TRUE(kin.calcFwdKin(pose, jvals, "link_2"));
80+
Eigen::Isometry3d result;
81+
result.setIdentity();
82+
result.translation()[0] = -0.00043624;
83+
result.translation()[1] = 0;
84+
result.translation()[2] = 0.36;
85+
EXPECT_TRUE(pose.isApprox(result));
86+
}
87+
88+
{
89+
pose.setIdentity();
90+
EXPECT_TRUE(kin.calcFwdKin(pose, jvals, "link_3"));
91+
Eigen::Isometry3d result;
92+
result.setIdentity();
93+
result.translation()[0] = -0.00043624;
94+
result.translation()[1] = 0;
95+
result.translation()[2] = 0.36;
96+
EXPECT_TRUE(pose.isApprox(result));
97+
}
98+
99+
{
100+
pose.setIdentity();
101+
EXPECT_TRUE(kin.calcFwdKin(pose, jvals, "link_4"));
102+
Eigen::Isometry3d result;
103+
result.setIdentity();
104+
result.translation()[0] = 0;
105+
result.translation()[1] = 0;
106+
result.translation()[2] = 0.36 + 0.42;
107+
EXPECT_TRUE(pose.isApprox(result));
108+
}
109+
110+
{
111+
pose.setIdentity();
112+
EXPECT_TRUE(kin.calcFwdKin(pose, jvals, "link_5"));
113+
Eigen::Isometry3d result;
114+
result.setIdentity();
115+
result.translation()[0] = 0;
116+
result.translation()[1] = 0;
117+
result.translation()[2] = 0.36 + 0.42;
118+
EXPECT_TRUE(pose.isApprox(result));
119+
}
120+
121+
{
122+
pose.setIdentity();
123+
EXPECT_TRUE(kin.calcFwdKin(pose, jvals, "link_6"));
124+
Eigen::Isometry3d result;
125+
result.setIdentity();
126+
result.translation()[0] = 0;
127+
result.translation()[1] = 0;
128+
result.translation()[2] = 0.36 + 0.42 + 0.4;
129+
EXPECT_TRUE(pose.isApprox(result));
130+
}
131+
132+
{
133+
pose.setIdentity();
134+
EXPECT_TRUE(kin.calcFwdKin(pose, jvals, "link_7"));
135+
Eigen::Isometry3d result;
136+
result.setIdentity();
137+
result.translation()[0] = 0;
138+
result.translation()[1] = 0;
139+
result.translation()[2] = 0.36 + 0.42 + 0.4;
140+
EXPECT_TRUE(pose.isApprox(result));
141+
}
142+
66143
pose.setIdentity();
67144
EXPECT_TRUE(kin.calcFwdKin(pose, jvals, "tool0"));
68145
Eigen::Isometry3d result;
@@ -73,6 +150,29 @@ void runFwdKinTest(tesseract_kinematics::ForwardKinematics& kin)
73150
EXPECT_TRUE(pose.isApprox(result));
74151
}
75152

153+
void runJacobianTestHelper(tesseract_kinematics::ForwardKinematics& kin,
154+
const Eigen::VectorXd& jvals,
155+
const std::string& link_name,
156+
const Eigen::Vector3d& link_point,
157+
const Eigen::Isometry3d& change_base)
158+
{
159+
Eigen::MatrixXd jacobian, numerical_jacobian;
160+
Eigen::Isometry3d pose;
161+
kin.calcFwdKin(pose, jvals, link_name);
162+
163+
jacobian.resize(6, 7);
164+
EXPECT_TRUE(kin.calcJacobian(jacobian, jvals, link_name));
165+
tesseract_kinematics::jacobianChangeBase(jacobian, change_base);
166+
tesseract_kinematics::jacobianChangeRefPoint(jacobian, (change_base * pose).linear() * link_point);
167+
168+
numerical_jacobian.resize(6, 7);
169+
tesseract_kinematics::numericalJacobian(numerical_jacobian, change_base, kin, jvals, link_name, link_point);
170+
171+
for (int i = 0; i < 6; ++i)
172+
for (int j = 0; j < 7; ++j)
173+
EXPECT_NEAR(numerical_jacobian(i, j), jacobian(i, j), 1e-3);
174+
}
175+
76176
void runJacobianTest(tesseract_kinematics::ForwardKinematics& kin)
77177
{
78178
//////////////////////////////////////////////////////////////////
@@ -93,17 +193,16 @@ void runJacobianTest(tesseract_kinematics::ForwardKinematics& kin)
93193
///////////////////////////
94194
// Test Jacobian
95195
///////////////////////////
96-
jacobian.resize(6, 7);
97-
EXPECT_TRUE(kin.calcJacobian(jacobian, jvals, "tool0"));
98-
99196
Eigen::Vector3d link_point(0, 0, 0);
100-
numerical_jacobian.resize(6, 7);
101-
tesseract_kinematics::numericalJacobian(
102-
numerical_jacobian, Eigen::Isometry3d::Identity(), kin, jvals, "tool0", link_point);
103-
104-
for (int i = 0; i < 6; ++i)
105-
for (int j = 0; j < 7; ++j)
106-
EXPECT_NEAR(numerical_jacobian(i, j), jacobian(i, j), 1e-3);
197+
runJacobianTestHelper(kin, jvals, "base_link", link_point, Eigen::Isometry3d::Identity());
198+
runJacobianTestHelper(kin, jvals, "link_1", link_point, Eigen::Isometry3d::Identity());
199+
runJacobianTestHelper(kin, jvals, "link_2", link_point, Eigen::Isometry3d::Identity());
200+
runJacobianTestHelper(kin, jvals, "link_3", link_point, Eigen::Isometry3d::Identity());
201+
runJacobianTestHelper(kin, jvals, "link_4", link_point, Eigen::Isometry3d::Identity());
202+
runJacobianTestHelper(kin, jvals, "link_5", link_point, Eigen::Isometry3d::Identity());
203+
runJacobianTestHelper(kin, jvals, "link_6", link_point, Eigen::Isometry3d::Identity());
204+
runJacobianTestHelper(kin, jvals, "link_7", link_point, Eigen::Isometry3d::Identity());
205+
runJacobianTestHelper(kin, jvals, "tool0", link_point, Eigen::Isometry3d::Identity());
107206

108207
///////////////////////////
109208
// Test Jacobian at Point
@@ -115,17 +214,15 @@ void runJacobianTest(tesseract_kinematics::ForwardKinematics& kin)
115214
Eigen::Vector3d link_point(0, 0, 0);
116215
link_point[k] = 1;
117216

118-
// calcJacobian requires the link point to be in the base frame for which the jacobian is calculated.
119-
EXPECT_TRUE(kin.calcJacobian(jacobian, jvals, "tool0"));
120-
tesseract_kinematics::jacobianChangeRefPoint(jacobian, pose.linear() * link_point);
121-
122-
numerical_jacobian.resize(6, 7);
123-
tesseract_kinematics::numericalJacobian(
124-
numerical_jacobian, Eigen::Isometry3d::Identity(), kin, jvals, "tool0", link_point);
125-
126-
for (int i = 0; i < 6; ++i)
127-
for (int j = 0; j < 7; ++j)
128-
EXPECT_NEAR(numerical_jacobian(i, j), jacobian(i, j), 1e-3);
217+
runJacobianTestHelper(kin, jvals, "base_link", link_point, Eigen::Isometry3d::Identity());
218+
runJacobianTestHelper(kin, jvals, "link_1", link_point, Eigen::Isometry3d::Identity());
219+
runJacobianTestHelper(kin, jvals, "link_2", link_point, Eigen::Isometry3d::Identity());
220+
runJacobianTestHelper(kin, jvals, "link_3", link_point, Eigen::Isometry3d::Identity());
221+
runJacobianTestHelper(kin, jvals, "link_4", link_point, Eigen::Isometry3d::Identity());
222+
runJacobianTestHelper(kin, jvals, "link_5", link_point, Eigen::Isometry3d::Identity());
223+
runJacobianTestHelper(kin, jvals, "link_6", link_point, Eigen::Isometry3d::Identity());
224+
runJacobianTestHelper(kin, jvals, "link_7", link_point, Eigen::Isometry3d::Identity());
225+
runJacobianTestHelper(kin, jvals, "tool0", link_point, Eigen::Isometry3d::Identity());
129226
}
130227

131228
///////////////////////////////////////////
@@ -143,15 +240,15 @@ void runJacobianTest(tesseract_kinematics::ForwardKinematics& kin)
143240
change_base.translation() = Eigen::Vector3d(0, 0, 0);
144241
change_base.translation()[k] = 1;
145242

146-
EXPECT_TRUE(kin.calcJacobian(jacobian, jvals, "tool0"));
147-
tesseract_kinematics::jacobianChangeBase(jacobian, change_base);
148-
149-
numerical_jacobian.resize(6, 7);
150-
tesseract_kinematics::numericalJacobian(numerical_jacobian, change_base, kin, jvals, "tool0", link_point);
151-
152-
for (int i = 0; i < 6; ++i)
153-
for (int j = 0; j < 7; ++j)
154-
EXPECT_NEAR(numerical_jacobian(i, j), jacobian(i, j), 1e-3);
243+
runJacobianTestHelper(kin, jvals, "base_link", link_point, change_base);
244+
runJacobianTestHelper(kin, jvals, "link_1", link_point, change_base);
245+
runJacobianTestHelper(kin, jvals, "link_2", link_point, change_base);
246+
runJacobianTestHelper(kin, jvals, "link_3", link_point, change_base);
247+
runJacobianTestHelper(kin, jvals, "link_4", link_point, change_base);
248+
runJacobianTestHelper(kin, jvals, "link_5", link_point, change_base);
249+
runJacobianTestHelper(kin, jvals, "link_6", link_point, change_base);
250+
runJacobianTestHelper(kin, jvals, "link_7", link_point, change_base);
251+
runJacobianTestHelper(kin, jvals, "tool0", link_point, change_base);
155252
}
156253

157254
///////////////////////////////////////////
@@ -170,18 +267,15 @@ void runJacobianTest(tesseract_kinematics::ForwardKinematics& kin)
170267
change_base(1, 1) = 0;
171268
change_base.translation() = link_point;
172269

173-
kin.calcFwdKin(pose, jvals, "tool0");
174-
// calcJacobian requires the link point to be in the base frame for which the jacobian is calculated.
175-
EXPECT_TRUE(kin.calcJacobian(jacobian, jvals, "tool0"));
176-
tesseract_kinematics::jacobianChangeBase(jacobian, change_base);
177-
tesseract_kinematics::jacobianChangeRefPoint(jacobian, (change_base * pose).linear() * link_point);
178-
179-
numerical_jacobian.resize(6, 7);
180-
tesseract_kinematics::numericalJacobian(numerical_jacobian, change_base, kin, jvals, "tool0", link_point);
181-
182-
for (int i = 0; i < 6; ++i)
183-
for (int j = 0; j < 7; ++j)
184-
EXPECT_NEAR(numerical_jacobian(i, j), jacobian(i, j), 1e-3);
270+
runJacobianTestHelper(kin, jvals, "base_link", link_point, change_base);
271+
runJacobianTestHelper(kin, jvals, "link_1", link_point, change_base);
272+
runJacobianTestHelper(kin, jvals, "link_2", link_point, change_base);
273+
runJacobianTestHelper(kin, jvals, "link_3", link_point, change_base);
274+
runJacobianTestHelper(kin, jvals, "link_4", link_point, change_base);
275+
runJacobianTestHelper(kin, jvals, "link_5", link_point, change_base);
276+
runJacobianTestHelper(kin, jvals, "link_6", link_point, change_base);
277+
runJacobianTestHelper(kin, jvals, "link_7", link_point, change_base);
278+
runJacobianTestHelper(kin, jvals, "tool0", link_point, change_base);
185279
}
186280
}
187281

0 commit comments

Comments
 (0)