From 41e2163cd26d086d6fff8f7d4aa749391cdd39ae Mon Sep 17 00:00:00 2001 From: Paul D'Angio <pcdangio@gmail.com> Date: Tue, 17 Nov 2020 23:01:48 -0500 Subject: [PATCH] added covariance publishing --- driver_mpu9250/src/ros_node.cpp | 46 +++++++++++++++++++++++++++++++-- driver_mpu9250/src/ros_node.h | 12 ++++++++- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/driver_mpu9250/src/ros_node.cpp b/driver_mpu9250/src/ros_node.cpp index 8a44e42..706a649 100644 --- a/driver_mpu9250/src/ros_node.cpp +++ b/driver_mpu9250/src/ros_node.cpp @@ -4,6 +4,7 @@ #include <sensor_msgs_ext/angular_velocity.h> #include <sensor_msgs_ext/magnetic_field.h> #include <sensor_msgs_ext/temperature.h> +#include <sensor_msgs_ext/covariance.h> #include <cmath> @@ -37,12 +38,12 @@ ros_node::ros_node(std::shared_ptr<driver> driver, int argc, char **argv) ros_node::m_calibration_accelerometer.load(private_node, "calibration_accelerometer"); ros_node::m_calibration_magnetometer.load(private_node, "calibration_magnetometer"); - // Set up publishers. + // Set up data publishers. ros_node::m_publisher_accelerometer = ros_node::m_node->advertise<sensor_msgs_ext::acceleration>("imu/accelerometer", 1); ros_node::m_publisher_gyroscope = ros_node::m_node->advertise<sensor_msgs_ext::angular_velocity>("imu/gyroscope", 1); ros_node::m_publisher_magnetometer = ros_node::m_node->advertise<sensor_msgs_ext::magnetic_field>("imu/magnetometer", 1); ros_node::m_publisher_temperature = ros_node::m_node->advertise<sensor_msgs_ext::temperature>("imu/temperature", 1); - + // Initialize the driver and set parameters. try { @@ -64,6 +65,9 @@ ros_node::ros_node(std::shared_ptr<driver> driver, int argc, char **argv) exit(1); } + // Publish covariance matrices. + ros_node::publish_covariance(); + // Set up services. ros_node::m_service_calibrate_gyroscope = ros_node::m_node->advertiseService("imu/calibrate_gyroscope", &ros_node::service_calibrate_gyroscope, this); @@ -143,6 +147,44 @@ bool ros_node::calibrate_gyroscope(uint32_t averaging_period) } // METHODS +void ros_node::publish_covariance() +{ + // Get a private nodehandle for reading parameters. + ros::NodeHandle private_node("~"); + + // Create a publisher and publish a latched covariance message for each sensor. + // NOTE: Variances are read from parameters. Default values are from testing. + + // Accelerometer + ros_node::m_publisher_covariance_accelerometer = ros_node::m_node->advertise<sensor_msgs_ext::covariance>("imu/accelerometer/covariance", 1, true); + sensor_msgs_ext::covariance covariance_accelerometer; + covariance_accelerometer.dimensions = 3; + covariance_accelerometer.covariance.resize(9, 0.0); + covariance_accelerometer.covariance[0] = private_node.param<double>("variance/accelerometer/x", 5e-4); + covariance_accelerometer.covariance[4] = private_node.param<double>("variance/accelerometer/y", 5e-4); + covariance_accelerometer.covariance[8] = private_node.param<double>("variance/accelerometer/z", 5e-4); + ros_node::m_publisher_covariance_accelerometer.publish(covariance_accelerometer); + + // Gyroscope + ros_node::m_publisher_covariance_gyroscope = ros_node::m_node->advertise<sensor_msgs_ext::covariance>("imu/gyroscope/covariance", 1, true); + sensor_msgs_ext::covariance covariance_gyroscope; + covariance_gyroscope.dimensions = 3; + covariance_gyroscope.covariance.resize(9, 0.0); + covariance_gyroscope.covariance[0] = private_node.param<double>("variance/gyroscope/x", 3e-6); + covariance_gyroscope.covariance[4] = private_node.param<double>("variance/gyroscope/y", 3e-6); + covariance_gyroscope.covariance[8] = private_node.param<double>("variance/gyroscope/z", 3e-6); + ros_node::m_publisher_covariance_gyroscope.publish(covariance_gyroscope); + + // Magnetometer + ros_node::m_publisher_covariance_magnetometer = ros_node::m_node->advertise<sensor_msgs_ext::covariance>("imu/magnetometer/covariance", 1, true); + sensor_msgs_ext::covariance covariance_magnetometer; + covariance_magnetometer.dimensions = 3; + covariance_magnetometer.covariance.resize(9, 0.0); + covariance_magnetometer.covariance[0] = private_node.param<double>("variance/magnetometer/x", 4.8e-13); + covariance_magnetometer.covariance[4] = private_node.param<double>("variance/magnetometer/y", 4.8e-13); + covariance_magnetometer.covariance[8] = private_node.param<double>("variance/magnetometer/z", 4.8e-13); + ros_node::m_publisher_covariance_magnetometer.publish(covariance_magnetometer); +} void ros_node::deinitialize_driver() { try diff --git a/driver_mpu9250/src/ros_node.h b/driver_mpu9250/src/ros_node.h index 1aafd49..6a8952e 100644 --- a/driver_mpu9250/src/ros_node.h +++ b/driver_mpu9250/src/ros_node.h @@ -54,7 +54,7 @@ private: /// \brief m_node The node's handle. std::shared_ptr<ros::NodeHandle> m_node; - // PUBLISHERS + // PUBLISHERS - DATA /// \brief Publisher for accelerometer data. ros::Publisher m_publisher_accelerometer; /// \brief Publisher for gyroscope data. @@ -64,6 +64,14 @@ private: /// \brief Publisher for temperature data. ros::Publisher m_publisher_temperature; + // PUBLISHERS - COVARIANCE + /// \brief Publisher for accelerometer covariance. + ros::Publisher m_publisher_covariance_accelerometer; + /// \brief Publisher for gyroscope covariance. + ros::Publisher m_publisher_covariance_gyroscope; + /// \brief Publisher for magnetometer covariance. + ros::Publisher m_publisher_covariance_magnetometer; + // SERVICES /// \brief Service server for calibrating the gyroscope. ros::ServiceServer m_service_calibrate_gyroscope; @@ -74,6 +82,8 @@ private: bool service_calibrate_gyroscope(driver_mpu9250_msgs::calibrate_gyroscopeRequest& request, driver_mpu9250_msgs::calibrate_gyroscopeResponse& response); // METHODS + /// \brief Publishes covariance matrices. + void publish_covariance(); /// \brief deinitialize_driver Deinitializes the driver. void deinitialize_driver(); -- GitLab