Skip to content

Commit 1b4719b

Browse files
committed
checkpoint: get_link_pose outputs Eigen::Affine3d
1 parent 6a17d64 commit 1b4719b

File tree

4 files changed

+38
-23
lines changed

4 files changed

+38
-23
lines changed

bench/bench_tinyfk.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include <Eigen/Geometry>
12
#include <fstream>
23
#include <iostream>
34
#include <memory>
@@ -23,7 +24,7 @@ void benchmark_fk(KinematicModel &kin, size_t n_iter,
2324
const std::vector<double> q = {0, 0, 0, 0, 0, 0, 0, 0};
2425
{
2526
clock_t start = clock();
26-
urdf::Pose out;
27+
Eigen::Affine3d out;
2728
for (size_t i = 0; i < n_iter; i++) {
2829
kin.set_joint_angles(joint_ids, q); // this clear cached TFs
2930
for (int lid : link_ids) {
@@ -36,7 +37,7 @@ void benchmark_fk(KinematicModel &kin, size_t n_iter,
3637

3738
{
3839
clock_t start = clock();
39-
urdf::Pose out;
40+
Eigen::Affine3d out;
4041
for (size_t i = 0; i < n_iter; i++) {
4142
kin.set_joint_angles(joint_ids, q); // this clear cached TFs
4243
for (size_t j = 0; j < link_ids.size(); j++) {

include/tinyfk.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ class KinematicModel {
123123
return link_names;
124124
}
125125

126-
void get_link_pose(size_t link_id, Transform &out_tf_root_to_ef) const;
126+
void get_link_pose(size_t link_id, Eigen::Affine3d &out_tf_root_to_ef) const;
127127

128128
Eigen::MatrixXd get_jacobian(size_t elink_id,
129129
const std::vector<size_t> &joint_ids,
@@ -150,7 +150,8 @@ class KinematicModel {
150150
size_t parent_id, const Transform &pose);
151151

152152
private:
153-
void get_link_pose_inner(size_t link_id, Transform &out_tf_root_to_ef) const;
153+
void get_link_pose_inner(size_t link_id,
154+
Eigen::Affine3d &out_tf_root_to_ef) const;
154155
void update_rptable();
155156
};
156157

src/kinematics.cpp

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,19 @@ Rotation q_derivative(const Rotation &q, const Vector3 &omega) {
3535
return Rotation(dxdt, dydt, dzdt, -dwdt); // TODO: why minus????
3636
}
3737

38-
void KinematicModel::get_link_pose(size_t link_id,
39-
Transform &out_tf_rlink_to_elink) const {
38+
void KinematicModel::get_link_pose(
39+
size_t link_id, Eigen::Affine3d &out_tf_rlink_to_elink) const {
4040
Eigen::Affine3d const *pose_ptr = transform_cache_.get_cache(link_id);
4141
if (pose_ptr) {
4242
// FIXME: remove
43-
// out_tf_rlink_to_elink = *pose_ptr;
44-
out_tf_rlink_to_elink = eigen_affine3d_to_urdf_pose(*pose_ptr);
43+
out_tf_rlink_to_elink = *pose_ptr;
4544
return;
4645
}
4746
this->get_link_pose_inner(link_id, out_tf_rlink_to_elink);
4847
}
4948

5049
void KinematicModel::get_link_pose_inner(
51-
size_t link_id, Transform &out_tf_rlink_to_elink) const {
50+
size_t link_id, Eigen::Affine3d &out_tf_rlink_to_elink) const {
5251
urdf::LinkSharedPtr hlink = links_[link_id];
5352

5453
Eigen::Affine3d tf_rlink_to_blink = base_pose_;
@@ -85,7 +84,7 @@ void KinematicModel::get_link_pose_inner(
8584
} else if (pjoint->type == urdf::Joint::REVOLUTE ||
8685
pjoint->type == urdf::Joint::CONTINUOUS) {
8786
double angle = joint_angles_[pjoint->id];
88-
Eigen::AngleAxisd tf_pjoint_to_hlink{
87+
Eigen::AngleAxisd&& tf_pjoint_to_hlink{
8988
angle,
9089
Eigen::Vector3d{pjoint->axis.x, pjoint->axis.y, pjoint->axis.z}};
9190
tf_plink_to_hlink = tf_plink_to_pjoint * tf_pjoint_to_hlink;
@@ -111,9 +110,7 @@ void KinematicModel::get_link_pose_inner(
111110
transform_cache_.set_cache(hid, tf_rlink_to_hlink);
112111
tf_rlink_to_plink = std::move(tf_rlink_to_hlink);
113112
}
114-
// FIXME
115-
// out_tf_rlink_to_elink = std::move(tf_rlink_to_plink);
116-
out_tf_rlink_to_elink = eigen_affine3d_to_urdf_pose(tf_rlink_to_plink);
113+
out_tf_rlink_to_elink = std::move(tf_rlink_to_plink);
117114
}
118115

119116
Eigen::MatrixXd
@@ -125,8 +122,10 @@ KinematicModel::get_jacobian(size_t elink_id,
125122
const int dim_dof = joint_ids.size() + (with_base ? 6 : 0);
126123

127124
// compute values shared through the loop
128-
Transform tf_rlink_to_elink;
129-
this->get_link_pose(elink_id, tf_rlink_to_elink);
125+
Eigen::Affine3d tf_rlink_to_elink_tmp; // FIXME
126+
this->get_link_pose(elink_id, tf_rlink_to_elink_tmp);
127+
Transform tf_rlink_to_elink =
128+
eigen_affine3d_to_urdf_pose(tf_rlink_to_elink_tmp);
130129
Vector3 &epos = tf_rlink_to_elink.position;
131130
Rotation &erot = tf_rlink_to_elink.rotation;
132131

@@ -154,8 +153,11 @@ KinematicModel::get_jacobian(size_t elink_id,
154153
hjoint->getChildLink(); // rotation of clink and hlink is same. so
155154
// clink is ok.
156155

157-
Transform tf_rlink_to_clink;
158-
this->get_link_pose(clink->id, tf_rlink_to_clink);
156+
// FIXME
157+
Eigen::Affine3d tf_rlink_to_clink_tmp;
158+
this->get_link_pose(clink->id, tf_rlink_to_clink_tmp);
159+
Transform tf_rlink_to_clink =
160+
eigen_affine3d_to_urdf_pose(tf_rlink_to_clink_tmp);
159161

160162
Rotation &crot = tf_rlink_to_clink.rotation;
161163
Vector3 &&world_axis = crot * hjoint->axis; // axis w.r.t root link
@@ -194,9 +196,11 @@ KinematicModel::get_jacobian(size_t elink_id,
194196
}
195197

196198
Transform tf_rlink_to_blink, tf_blink_to_rlink, tf_blink_to_elink;
199+
Eigen::Affine3d tf_rlink_to_blink_tmp;
197200
Vector3 rpy_rlink_to_blink;
198201
if (with_base) {
199-
this->get_link_pose(this->root_link_id_, tf_rlink_to_blink);
202+
this->get_link_pose(this->root_link_id_, tf_rlink_to_blink_tmp);
203+
tf_rlink_to_blink = eigen_affine3d_to_urdf_pose(tf_rlink_to_blink_tmp);
200204
tf_blink_to_rlink = tf_rlink_to_blink.inverse();
201205
rpy_rlink_to_blink = tf_rlink_to_blink.rotation.getRPY();
202206
tf_blink_to_elink = pose_transform(tf_blink_to_rlink, tf_rlink_to_elink);
@@ -252,9 +256,11 @@ Vector3 KinematicModel::get_com() {
252256
Vector3 com_average;
253257
double mass_total = 0.0;
254258
Transform tf_base_to_com;
259+
Eigen::Affine3d tf_base_to_com_tmp; // FIXME
255260
for (const auto &link : com_dummy_links_) {
256261
mass_total += link->inertial->mass;
257-
this->get_link_pose(link->id, tf_base_to_com);
262+
this->get_link_pose(link->id, tf_base_to_com_tmp);
263+
tf_base_to_com = eigen_affine3d_to_urdf_pose(tf_base_to_com_tmp);
258264
com_average.x += link->inertial->mass * tf_base_to_com.position.x;
259265
com_average.y += link->inertial->mass * tf_base_to_com.position.y;
260266
com_average.z += link->inertial->mass * tf_base_to_com.position.z;
@@ -302,7 +308,9 @@ Eigen::Matrix3d KinematicModel::get_total_inertia_matrix() {
302308
size_t link_id = link->id;
303309

304310
Transform tf_base_to_link;
305-
this->get_link_pose(link_id, tf_base_to_link);
311+
Eigen::Affine3d tf_base_to_link_tmp; // FIXME
312+
this->get_link_pose(link_id, tf_base_to_link_tmp);
313+
tf_base_to_link = eigen_affine3d_to_urdf_pose(tf_base_to_link_tmp);
306314
const auto &trans = tf_base_to_link.position;
307315
Eigen::Vector3d vec;
308316
vec << trans.x - com.x, trans.y - com.y, trans.z - com.z;

test/test_kinematics.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,11 @@ Eigen::MatrixXd compute_numerical_jacobian_with_base(
5858
}
5959

6060
tinyfk::Transform pose0, pose1;
61+
Eigen::Affine3d pose0_tmp, pose1_tmp; // FIXME
6162
Vector3 rpy0, rpy1;
6263
set_configuration(q0);
63-
kin.get_link_pose(link_id, pose0);
64+
kin.get_link_pose(link_id, pose0_tmp);
65+
pose0 = eigen_affine3d_to_urdf_pose(pose0_tmp);
6466
rpy0 = pose0.rotation.getRPY();
6567

6668
const size_t dim_jacobi = 3 + (rot_type == RotationType::RPY) * 3 +
@@ -70,7 +72,8 @@ Eigen::MatrixXd compute_numerical_jacobian_with_base(
7072
for (size_t idx = 0; idx < q0.size(); idx++) {
7173
const auto q1 = get_tweaked_q(q0, idx);
7274
set_configuration(q1);
73-
kin.get_link_pose(link_id, pose1);
75+
kin.get_link_pose(link_id, pose1_tmp);
76+
pose1 = eigen_affine3d_to_urdf_pose(pose1_tmp);
7477
J(0, idx) = (pose1.position.x - pose0.position.x) / eps;
7578
J(1, idx) = (pose1.position.y - pose0.position.y) / eps;
7679
J(2, idx) = (pose1.position.z - pose0.position.z) / eps;
@@ -158,10 +161,12 @@ TEST(FORWARD_KINEMATICS_TEST, AllTest) {
158161
kin.set_base_pose(base_pose);
159162

160163
tinyfk::Transform pose, pose_naive;
164+
Eigen::Affine3d pose_tmp;
161165
for (size_t i = 0; i < n_links; i++) {
162166
int link_id = link_ids[i];
163167

164-
kin.get_link_pose(link_id, pose);
168+
kin.get_link_pose(link_id, pose_tmp);
169+
pose = eigen_affine3d_to_urdf_pose(pose_tmp);
165170
EXPECT_TRUE(isNear(pose.position.x, pose_list[i][0]));
166171
EXPECT_TRUE(isNear(pose.position.y, pose_list[i][1]));
167172
EXPECT_TRUE(isNear(pose.position.z, pose_list[i][2]));

0 commit comments

Comments
 (0)