6 #include <spdlog/spdlog.h>
10 #include "RobotSimulator/b3RobotSimulatorClientAPI.h"
22 return btQuaternion(quat.x(), quat.y(), quat.z(), quat.w());
32 return btVector3(v.x(), v.y(), v.z());
42 return Eigen::Quaterniond(quat.getW(), quat.getX(), quat.getY(), quat.getZ());
52 return Eigen::Vector3d(v.getX(), v.getY(), v.getZ());
64 const std::string& link_name) noexcept {
65 b3JointInfo joint_info;
66 int nb_joints = bullet.getNumJoints(robot);
67 for (
int joint_index = 0; joint_index < nb_joints; ++joint_index) {
68 bullet.getJointInfo(robot, joint_index, &joint_info);
69 if (std::string(joint_info.m_linkName) == link_name) {
85 b3RobotSimulatorClientAPI& bullet,
int robot,
86 const int imu_link_index,
double dt) {
87 b3LinkState link_state;
88 bullet.getLinkState(robot, imu_link_index,
true,
91 Eigen::Quaterniond orientation_imu_in_world;
92 orientation_imu_in_world.w() = link_state.m_worldLinkFrameOrientation[3];
93 orientation_imu_in_world.x() = link_state.m_worldLinkFrameOrientation[0];
94 orientation_imu_in_world.y() = link_state.m_worldLinkFrameOrientation[1];
95 orientation_imu_in_world.z() = link_state.m_worldLinkFrameOrientation[2];
100 Eigen::Matrix3d rotation_world_to_ars =
101 Eigen::Vector3d{1.0, -1.0, -1.0}.asDiagonal();
103 Eigen::Matrix3d rotation_imu_to_world =
104 orientation_imu_in_world.toRotationMatrix();
105 Eigen::Matrix3d rotation_imu_to_ars =
106 rotation_world_to_ars * rotation_imu_to_world;
107 Eigen::Quaterniond orientation_imu_in_ars(rotation_imu_to_ars);
109 Eigen::Vector3d linear_velocity_imu_in_world = {
110 link_state.m_worldLinearVelocity[0],
111 link_state.m_worldLinearVelocity[1],
112 link_state.m_worldLinearVelocity[2],
115 Eigen::Vector3d angular_velocity_imu_to_world_in_world = {
116 link_state.m_worldAngularVelocity[0],
117 link_state.m_worldAngularVelocity[1],
118 link_state.m_worldAngularVelocity[2],
123 Eigen::Vector3d linear_acceleration_imu_in_world =
124 (linear_velocity_imu_in_world - previous_linear_velocity) / dt;
126 auto rotation_world_to_imu = orientation_imu_in_world.normalized().inverse();
127 Eigen::Vector3d angular_velocity_imu_in_imu =
128 rotation_world_to_imu * angular_velocity_imu_to_world_in_world;
129 Eigen::Vector3d linear_acceleration_imu_in_imu =
130 rotation_world_to_imu * linear_acceleration_imu_in_world;
Send actions to actuators or simulators.
void read_imu_data(BulletImuData &imu_data, b3RobotSimulatorClientAPI &bullet, int robot, const int imu_link_index, double dt)
Compute IMU readings from the IMU link state.
Eigen::Quaterniond eigen_from_bullet(const btQuaternion &quat)
Convert a Bullet quaternion to an Eigen one.
btQuaternion bullet_from_eigen(const Eigen::Quaterniond &quat)
Convert an Eigen quaternion to a Bullet one.
int find_link_index(b3RobotSimulatorClientAPI &bullet, int robot, const std::string &link_name) noexcept
Find the index of a link.
Eigen::Vector3d linear_velocity_imu_in_world
Spatial linear velocity in [m] / [s]², used to compute the acceleration.
Eigen::Quaterniond orientation_imu_in_ars
Orientation from the IMU frame to the attitude reference system (ARS) frame.
Eigen::Vector3d linear_acceleration_imu_in_imu
Body linear acceleration of the IMU, in [m] / [s]².
Eigen::Vector3d angular_velocity_imu_in_imu
Body angular velocity of the IMU frame in [rad] / [s].