9 #include <std_msgs/String.h> 10 #include <std_msgs/UInt32.h> 11 #include <std_msgs/Float32.h> 12 #include <std_msgs/Float64.h> 14 #include <sensor_msgs/Imu.h> 15 #include <piksi_rtk_msgs/BaselineHeading.h> 17 # define M_PI 3.14159265358979323846 18 # define sensor_yaw_deviation 0.002882263 24 :
_nh(node_handle),
_pnh(private_node_handle)
72 _imu.orientation_covariance[0] = (1 *
M_PI/180.0)*(1 *
M_PI/180.0);
73 _imu.orientation_covariance[4] =
_imu.orientation_covariance[0];
74 _imu.orientation_covariance[8] = (9 *
M_PI/180.0)*(9 *
M_PI/180.0);
75 _imu.angular_velocity_covariance[0] = (0.25 *
M_PI/180.0)*(0.25 *
M_PI/180.0);
76 _imu.angular_velocity_covariance[4] =
_imu.angular_velocity_covariance[0];
77 _imu.angular_velocity_covariance[8] =
_imu.angular_velocity_covariance[0];
78 _imu.linear_acceleration_covariance[0] = 0.0004;
79 _imu.linear_acceleration_covariance[4] =
_imu.linear_acceleration_covariance[0];
80 _imu.linear_acceleration_covariance[8] =
_imu.linear_acceleration_covariance[0];
89 std_msgs::UInt32 heading;
90 std_msgs::Float32 heading_deg, heading_radians;
91 sensor_msgs::Imu heading_rtk;
94 heading.data = msg->heading;
97 heading_deg.data = (float)heading.data/1000;
98 heading_deg.data = 360 - heading_deg.data;
99 heading_deg.data = heading_deg.data + 90;
103 heading_deg.data = heading_deg.data - 180;
106 if (heading_deg.data > 360.0)
107 heading_deg.data = heading_deg.data - 360.0;
108 heading_radians.data = heading_deg.data *
M_PI/180.0;
115 ROS_DEBUG(
"Heading : [%d] deg ENU: [%f] rad ENU: [%f]", heading.data, heading_deg.data, heading_radians.data);
120 heading_rtk.header.stamp = msg->header.stamp;
121 heading_rtk.header.frame_id =
"gps_receiver";
125 heading_rtk.orientation_covariance[8] = standard_deviation*standard_deviation;
126 heading_rtk.linear_acceleration.x = 0;
127 heading_rtk.linear_acceleration.y = 0;
128 heading_rtk.linear_acceleration.z = 0;
129 heading_rtk.linear_acceleration_covariance[0] = -1;
130 heading_rtk.angular_velocity.x = 0;
131 heading_rtk.angular_velocity.y = 0;
132 heading_rtk.angular_velocity.z = 0;
133 heading_rtk.angular_velocity_covariance[0] = -1;
142 _imu.header = msg->header;
143 _imu.angular_velocity = msg->angular_velocity;
144 _imu.linear_acceleration = msg->linear_acceleration;
148 double roll, pitch, yaw;
151 yaw = yaw < 0 ? (yaw * 180.0 /
M_PI)+360 : (yaw * 180.0 /
M_PI);
161 double yaw_delta = (yaw -
_imu0);
162 if (yaw_delta > 180) { yaw_delta = yaw - 360 -
_imu0; }
163 if (yaw_delta < -180) { yaw_delta = yaw + 360 -
_imu0; }
165 while (yaw > 360) { yaw -= 360; }
166 while (yaw < 0) { yaw += 360; }
174 int main(
int argc,
char **argv)
176 ros::init(argc, argv,
"heading_listener");
HeadingListenerNode(const ros::NodeHandle &node_handle, const ros::NodeHandle &private_node_handle)
#define sensor_yaw_deviation
ros::Subscriber _sub_imu_vru
ros::Publisher _pub_heading_enu_deg
void publish(const boost::shared_ptr< M > &message) const
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
void cb_imu_vru2enu(const sensor_msgs::Imu::ConstPtr &msg)
ROSCPP_DECL void spin(Spinner &spinner)
static void quaternionMsgToTF(const geometry_msgs::Quaternion &msg, Quaternion &bt)
void getRPY(tfScalar &roll, tfScalar &pitch, tfScalar &yaw, unsigned int solution_number=1) const
~HeadingListenerNode()=default
ros::Publisher _pub_imu_enu
ros::Publisher _pub_heading_enu
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
int main(int argc, char **argv)
static geometry_msgs::Quaternion createQuaternionMsgFromYaw(double yaw)
bool getParam(const std::string &key, std::string &s) const
static geometry_msgs::Quaternion createQuaternionMsgFromRollPitchYaw(double roll, double pitch, double yaw)
std::string _mounting_type
ros::Subscriber _sub_heading_ned
void cb_heading_ned2enu(const piksi_rtk_msgs::BaselineHeading::ConstPtr &msg)