Skip to content

Commit 0483f35

Browse files
authored
Merge pull request #149 from resibots/fix_base_pose
[robot]: fix base/body pose
2 parents f359dde + bac92f3 commit 0483f35

File tree

2 files changed

+55
-16
lines changed

2 files changed

+55
-16
lines changed

src/examples/tutorial.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ int main()
6666
// add the arm to the simulator
6767
simu.add_robot(arm_robot);
6868

69-
// run the simulator for 5 seconds
69+
// run the simulator for 10 seconds
7070
simu.run(10.);
7171
return 0;
7272
}

src/robot_dart/robot.cpp

+54-15
Original file line numberDiff line numberDiff line change
@@ -1129,8 +1129,12 @@ namespace robot_dart {
11291129

11301130
Eigen::Isometry3d Robot::base_pose() const
11311131
{
1132-
if (free())
1133-
return dart::math::expMap(_skeleton->getPositions().head(6));
1132+
if (free()) {
1133+
Eigen::Isometry3d tf(Eigen::Isometry3d::Identity());
1134+
tf.linear() = dart::math::expMapRot(_skeleton->getPositions().head<6>().head<3>());
1135+
tf.translation() = _skeleton->getPositions().head<6>().tail<3>();
1136+
return tf;
1137+
}
11341138
auto jt = _skeleton->getRootBodyNode()->getParentJoint();
11351139
ROBOT_DART_ASSERT(jt != nullptr, "Skeleton does not have a proper root BodyNode!",
11361140
Eigen::Isometry3d::Identity());
@@ -1144,28 +1148,41 @@ namespace robot_dart {
11441148
auto jt = _skeleton->getRootBodyNode()->getParentJoint();
11451149
ROBOT_DART_ASSERT(jt != nullptr, "Skeleton does not have a proper root BodyNode!",
11461150
Eigen::Vector6d::Zero());
1147-
return dart::math::logMap(jt->getTransformFromParentBodyNode());
1151+
Eigen::Isometry3d tf = jt->getTransformFromParentBodyNode();
1152+
Eigen::Vector6d x;
1153+
x.head<3>() = dart::math::logMap(tf.linear());
1154+
x.tail<3>() = tf.translation();
1155+
return x;
11481156
}
11491157

11501158
void Robot::set_base_pose(const Eigen::Isometry3d& tf)
11511159
{
11521160
auto jt = _skeleton->getRootBodyNode()->getParentJoint();
11531161
if (jt) {
1154-
if (free())
1155-
jt->setPositions(dart::math::logMap(tf));
1162+
if (free()) {
1163+
Eigen::Vector6d x;
1164+
x.head<3>() = dart::math::logMap(tf.linear());
1165+
x.tail<3>() = tf.translation();
1166+
jt->setPositions(x);
1167+
}
11561168
else
11571169
jt->setTransformFromParentBodyNode(tf);
11581170
}
11591171
}
11601172

1173+
/// set base pose: pose is a 6D vector (first 3D orientation in angle-axis and last 3D translation)
11611174
void Robot::set_base_pose(const Eigen::Vector6d& pose)
11621175
{
11631176
auto jt = _skeleton->getRootBodyNode()->getParentJoint();
11641177
if (jt) {
11651178
if (free())
11661179
jt->setPositions(pose);
1167-
else
1168-
jt->setTransformFromParentBodyNode(dart::math::expMap(pose));
1180+
else {
1181+
Eigen::Isometry3d tf(Eigen::Isometry3d::Identity());
1182+
tf.linear() = dart::math::expMapRot(pose.head<3>());
1183+
tf.translation() = pose.tail<3>();
1184+
jt->setTransformFromParentBodyNode(tf);
1185+
}
11691186
}
11701187
}
11711188

@@ -1432,16 +1449,25 @@ namespace robot_dart {
14321449
auto bd = _skeleton->getBodyNode(body_name);
14331450
ROBOT_DART_ASSERT(bd != nullptr, "BodyNode does not exist in skeleton!", Eigen::Vector6d::Zero());
14341451

1435-
return dart::math::logMap(bd->getWorldTransform());
1452+
Eigen::Isometry3d tf = bd->getWorldTransform();
1453+
Eigen::Vector6d x;
1454+
x.head<3>() = dart::math::logMap(tf.linear());
1455+
x.tail<3>() = tf.translation();
1456+
1457+
return x;
14361458
}
14371459

14381460
Eigen::Vector6d Robot::body_pose_vec(size_t body_index) const
14391461
{
14401462
ROBOT_DART_ASSERT(body_index < _skeleton->getNumBodyNodes(), "BodyNode index out of bounds", Eigen::Vector6d::Zero());
14411463

1442-
Eigen::Isometry3d bd_trans = _skeleton->getBodyNode(body_index)->getWorldTransform();
1464+
Eigen::Isometry3d tf = _skeleton->getBodyNode(body_index)->getWorldTransform();
1465+
1466+
Eigen::Vector6d x;
1467+
x.head<3>() = dart::math::logMap(tf.linear());
1468+
x.tail<3>() = tf.translation();
14431469

1444-
return dart::math::logMap(bd_trans);
1470+
return x;
14451471
}
14461472

14471473
Eigen::Vector6d Robot::body_velocity(const std::string& body_name) const
@@ -2064,7 +2090,11 @@ namespace robot_dart {
20642090

20652091
std::shared_ptr<Robot> Robot::create_box(const Eigen::Vector3d& dims, const Eigen::Isometry3d& tf, const std::string& type, double mass, const Eigen::Vector4d& color, const std::string& box_name)
20662092
{
2067-
return create_box(dims, dart::math::logMap(tf), type, mass, color, box_name);
2093+
Eigen::Vector6d x;
2094+
x.head<3>() = dart::math::logMap(tf.linear());
2095+
x.tail<3>() = tf.translation();
2096+
2097+
return create_box(dims, x, type, mass, color, box_name);
20682098
}
20692099

20702100
std::shared_ptr<Robot> Robot::create_box(const Eigen::Vector3d& dims, const Eigen::Vector6d& pose, const std::string& type, double mass, const Eigen::Vector4d& color, const std::string& box_name)
@@ -2099,14 +2129,23 @@ namespace robot_dart {
20992129
if (type == "free") // free floating
21002130
robot->set_positions(pose);
21012131
else // fixed
2102-
body->getParentJoint()->setTransformFromParentBodyNode(dart::math::expMap(pose));
2132+
{
2133+
Eigen::Isometry3d T;
2134+
T.linear() = dart::math::expMapRot(pose.head<3>());
2135+
T.translation() = pose.tail<3>();
2136+
body->getParentJoint()->setTransformFromParentBodyNode(T);
2137+
}
21032138

21042139
return robot;
21052140
}
21062141

21072142
std::shared_ptr<Robot> Robot::create_ellipsoid(const Eigen::Vector3d& dims, const Eigen::Isometry3d& tf, const std::string& type, double mass, const Eigen::Vector4d& color, const std::string& ellipsoid_name)
21082143
{
2109-
return create_ellipsoid(dims, dart::math::logMap(tf), type, mass, color, ellipsoid_name);
2144+
Eigen::Vector6d x;
2145+
x.head<3>() = dart::math::logMap(tf.linear());
2146+
x.tail<3>() = tf.translation();
2147+
2148+
return create_ellipsoid(dims, x, type, mass, color, ellipsoid_name);
21102149
}
21112150

21122151
std::shared_ptr<Robot> Robot::create_ellipsoid(const Eigen::Vector3d& dims, const Eigen::Vector6d& pose, const std::string& type, double mass, const Eigen::Vector4d& color, const std::string& ellipsoid_name)
@@ -2143,8 +2182,8 @@ namespace robot_dart {
21432182
else // fixed
21442183
{
21452184
Eigen::Isometry3d T;
2146-
T.linear() = dart::math::eulerXYZToMatrix(pose.head(3));
2147-
T.translation() = pose.tail(3);
2185+
T.linear() = dart::math::expMapRot(pose.head<3>());
2186+
T.translation() = pose.tail<3>();
21482187
body->getParentJoint()->setTransformFromParentBodyNode(T);
21492188
}
21502189

0 commit comments

Comments
 (0)