36 #include <sensor_msgs/Imu.h>
44 double dt = msg->header.stamp.toSec() -
imu_->header.stamp.toSec();
45 if(
imu_->header.stamp.sec == 0){
51 imu_->header = msg->header;
52 imu_->angular_velocity = msg->angular_velocity;
53 imu_->angular_velocity_covariance = msg->angular_velocity_covariance;
54 imu_->linear_acceleration = msg->linear_acceleration;
55 imu_->linear_acceleration_covariance = msg->linear_acceleration_covariance;
57 double diff = pow(
imu_->orientation.w, 2.0)-pow(
imu_->orientation.z, 2.0);
58 double mult = 2.0*
imu_->orientation.w*
imu_->orientation.z;
59 double theta = atan2(mult, diff);
61 theta = theta +
imu_->angular_velocity.z*dt;
65 imu_->orientation.z = sin(theta/2.0);
66 imu_->orientation.w = cos(theta/2.0);
73 int main(
int argc,
char **argv){
81 imu_.reset(
new sensor_msgs::Imu());
82 imu_->orientation.w = 1.0;