Skip to content
Snippets Groups Projects
Commit 0713cde6 authored by Paul D'Angio's avatar Paul D'Angio
Browse files

updated to use new sensor_msgs_ext messages

parent 6c73d6fe
No related branches found
No related tags found
No related merge requests found
...@@ -9,7 +9,7 @@ add_compile_options(-std=c++11) ...@@ -9,7 +9,7 @@ add_compile_options(-std=c++11)
## is used, also find other catkin packages ## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS find_package(catkin REQUIRED COMPONENTS
roscpp roscpp
sensor_msgs sensor_msgs_ext
) )
## System dependencies are found with CMake's conventions ## System dependencies are found with CMake's conventions
......
...@@ -10,6 +10,6 @@ ...@@ -10,6 +10,6 @@
<buildtool_depend>catkin</buildtool_depend> <buildtool_depend>catkin</buildtool_depend>
<depend>roscpp</depend> <depend>roscpp</depend>
<depend>sensor_msgs</depend> <depend>sensor_msgs_ext</depend>
</package> </package>
#include "ros_node.h" #include "ros_node.h"
#include <sensor_msgs/Imu.h> #include <sensor_msgs_ext/accelerometer.h>
#include <sensor_msgs/MagneticField.h> #include <sensor_msgs_ext/gyroscope.h>
#include <sensor_msgs/Temperature.h> #include <sensor_msgs_ext/magnetometer.h>
#include <sensor_msgs_ext/temperature.h>
#include <cmath> #include <cmath>
...@@ -35,9 +36,10 @@ ros_node::ros_node(driver *driver, int argc, char **argv) ...@@ -35,9 +36,10 @@ ros_node::ros_node(driver *driver, int argc, char **argv)
private_node.param<int>("accel_fsr", param_accel_fsr, 0); private_node.param<int>("accel_fsr", param_accel_fsr, 0);
// Set up publishers. // Set up publishers.
ros_node::m_publisher_imu = ros_node::m_node->advertise<sensor_msgs::Imu>("imu/imu", 1); ros_node::m_publisher_accelerometer = ros_node::m_node->advertise<sensor_msgs_ext::accelerometer>("imu/accelerometer", 1);
ros_node::m_publisher_mag = ros_node::m_node->advertise<sensor_msgs::MagneticField>("imu/magneto", 1); ros_node::m_publisher_gyroscope = ros_node::m_node->advertise<sensor_msgs_ext::gyroscope>("imu/gyroscope", 1);
ros_node::m_publisher_temp = ros_node::m_node->advertise<sensor_msgs::Temperature>("imu/temperature", 1); ros_node::m_publisher_magnetometer = ros_node::m_node->advertise<sensor_msgs_ext::magnetometer>("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. // Initialize the driver and set parameters.
try try
...@@ -93,50 +95,40 @@ void ros_node::deinitialize_driver() ...@@ -93,50 +95,40 @@ void ros_node::deinitialize_driver()
void ros_node::data_callback(driver::data data) void ros_node::data_callback(driver::data data)
{ {
// Create IMU message. // Create accelerometer message.
sensor_msgs::Imu message_imu; sensor_msgs_ext::accelerometer message_accel;
message_imu.header.stamp = ros::Time::now();
message_imu.header.frame_id = "mpu9250";
// Set blank orientation.
message_imu.orientation.w = std::numeric_limits<double>::quiet_NaN();
message_imu.orientation.x = std::numeric_limits<double>::quiet_NaN();
message_imu.orientation.y = std::numeric_limits<double>::quiet_NaN();
message_imu.orientation.z = std::numeric_limits<double>::quiet_NaN();
// Covariances of -1 indicate orientation not calculated.
message_imu.orientation_covariance.fill(-1.0);
// Set accelerations (convert from g's to m/s^2) // Set accelerations (convert from g's to m/s^2)
message_imu.linear_acceleration.x = static_cast<double>(data.accel_x) * 9.80665; message_accel.x = static_cast<double>(data.accel_x) * 9.80665;
message_imu.linear_acceleration.y = static_cast<double>(data.accel_y) * 9.80665; message_accel.y = static_cast<double>(data.accel_y) * 9.80665;
message_imu.linear_acceleration.z = static_cast<double>(data.accel_z) * 9.80665; message_accel.z = static_cast<double>(data.accel_z) * 9.80665;
// Publish message.
ros_node::m_publisher_accelerometer.publish(message_accel);
// Create gyroscope message.
sensor_msgs_ext::gyroscope message_gyro;
// Set rotation rates (convert from deg/sec to rad/sec) // Set rotation rates (convert from deg/sec to rad/sec)
message_imu.angular_velocity.x = static_cast<double>(data.gyro_x) * M_PI / 180.0; message_gyro.x = static_cast<double>(data.gyro_x) * M_PI / 180.0;
message_imu.angular_velocity.y = static_cast<double>(data.gyro_y) * M_PI / 180.0; message_gyro.y = static_cast<double>(data.gyro_y) * M_PI / 180.0;
message_imu.angular_velocity.z = static_cast<double>(data.gyro_z) * M_PI / 180.0; message_gyro.z = static_cast<double>(data.gyro_z) * M_PI / 180.0;
// Leave covariance matrices at zero. // Publish message.
// Publish IMU message. ros_node::m_publisher_gyroscope.publish(message_gyro);
ros_node::m_publisher_imu.publish(message_imu);
// Check if there was a magneto overflow. // Check if there was a magneto overflow.
if(isnan(data.magneto_x) == false) if(isnan(data.magneto_x) == false)
{ {
// Create magneto message. // Create magneto message.
sensor_msgs::MagneticField message_mag; sensor_msgs_ext::magnetometer message_mag;
message_mag.header = message_imu.header;
// Fill magnetic field strengths (convert from uT to T) // Fill magnetic field strengths (convert from uT to T)
message_mag.magnetic_field.x = static_cast<double>(data.magneto_x) * 0.000001; message_mag.x = static_cast<double>(data.magneto_x) * 0.000001;
message_mag.magnetic_field.y = static_cast<double>(data.magneto_y) * 0.000001; message_mag.y = static_cast<double>(data.magneto_y) * 0.000001;
message_mag.magnetic_field.z = static_cast<double>(data.magneto_z) * 0.000001; message_mag.z = static_cast<double>(data.magneto_z) * 0.000001;
// Leave covariance matrices at zero. // Publish message.
ros_node::m_publisher_magnetometer.publish(message_mag);
// Publish magneto message.
ros_node::m_publisher_mag.publish(message_mag);
} }
// Create temperature message. // Create temperature message.
sensor_msgs::Temperature message_temp; sensor_msgs_ext::temperature message_temp;
message_temp.header = message_imu.header;
message_temp.temperature = static_cast<double>(data.temp); message_temp.temperature = static_cast<double>(data.temp);
message_temp.variance = 0.0;
// Publish temperature message. // Publish temperature message.
ros_node::m_publisher_temp.publish(message_temp); ros_node::m_publisher_temperature.publish(message_temp);
} }
...@@ -7,61 +7,43 @@ ...@@ -7,61 +7,43 @@
#include <ros/ros.h> #include <ros/ros.h>
///
/// \brief Implements the driver's ROS node functionality. /// \brief Implements the driver's ROS node functionality.
///
class ros_node class ros_node
{ {
public: public:
// CONSTRUCTORS // CONSTRUCTORS
///
/// \brief ros_node Initializes the ROS node. /// \brief ros_node Initializes the ROS node.
/// \param driver The MPU9250 driver instance. /// \param driver The MPU9250 driver instance.
/// \param argc Number of main() args. /// \param argc Number of main() args.
/// \param argv The main() args. /// \param argv The main() args.
///
ros_node(driver* driver, int argc, char **argv); ros_node(driver* driver, int argc, char **argv);
~ros_node(); ~ros_node();
// METHODS // METHODS
///
/// \brief spin Runs the node. /// \brief spin Runs the node.
///
void spin(); void spin();
private: private:
// VARIABLES // VARIABLES
///
/// \brief m_driver The driver instance. /// \brief m_driver The driver instance.
///
driver* m_driver; driver* m_driver;
///
/// \brief m_node The node's handle. /// \brief m_node The node's handle.
///
ros::NodeHandle* m_node; ros::NodeHandle* m_node;
/// /// \brief Publisher for accelerometer data.
/// \brief m_publisher_imu The publisher for IMU messages. ros::Publisher m_publisher_accelerometer;
/// /// \brief Publisher for gyroscope data.
ros::Publisher m_publisher_imu; ros::Publisher m_publisher_gyroscope;
/// /// \brief Publisher for magnetometer data.
/// \brief m_publisher_mag The publisher for MagneticField messages. ros::Publisher m_publisher_magnetometer;
/// /// \brief Publisher for temperature data.
ros::Publisher m_publisher_mag; ros::Publisher m_publisher_temperature;
///
/// \brief m_publisher_temp The publisher for Temperature messages.
///
ros::Publisher m_publisher_temp;
// METHODS // METHODS
///
/// \brief deinitialize_driver Deinitializes the driver. /// \brief deinitialize_driver Deinitializes the driver.
///
void deinitialize_driver(); void deinitialize_driver();
///
/// \brief data_callback The callback function for when new data is available. /// \brief data_callback The callback function for when new data is available.
/// \param data The latest data read from the MPU9250/AK8963. /// \param data The latest data read from the MPU9250/AK8963.
///
void data_callback(driver::data data); void data_callback(driver::data data);
}; };
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment