ubuntu 20.04 ros noetic订阅消息报错:error: no matching function for call to ‘ros::NodeHandle::subscribe 。。。
imu_sub_ = nh_.advertise("imu",100,boost::bind(&RosInterface::imuCallback,this,1));
说没有匹配的函数
我参考的是别人的代码
我原本是这样写的(和别人一样):就是没有用boost::bind(),,也报错,试了boost::bind也报错,求指点。
imu_sub = nh_.advertise("imu",100,&RosInterface::imuCallback,this);
代码如下:
#include "ros_interface.h"
RosInterface::RosInterface(ros::NodeHandle nh): nh_(nh),it_(nh_),imu_calibrated_(false),prev_imu_time_(0.0)
{
odom_pub_ = nh.advertise<nav_msgs::Odometry>("odom", 10);
imu_sub_ = nh_.advertise("imu",100,boost::bind(&RosInterface::imuCallback,this,_1));
}
void RosInterface::imuCallback(const sensor_msgs::ImuConstPtr& imu)
{
imu_msg_buffer_.emplace_back(*imu);
}
void RosInterface::imuInitialize()
{
Eigen::Vector3f accel_accum;
Eigen::Vector3f gyro_accum;
int num_readings = 0;
accel_accum.setZero();
gyro_accum.setZero();
for(const auto& entry : imu_msg_buffer_){
accel_accum[0] += entry.linear_acceleration.x;
gyro_accum[0] += entry.angular_velocity.x;
num_readings++;
}
Eigen::Vector3f accel_mean = accel_accum / num_readings;
Eigen::Vector3f gyro_mean = gyro_accum / num_readings;
imy_state_.gyro_bias = gyro_mean;
imy_state_.g << 0.0, 0.0, -9.81;
}
头文件:
#include <ros/ros.h>
#include <sensor_msgs/Imu.h>
#include <sensor_msgs/Image.h>
#include <nav_msgs/Odometry.h>
#include <image_transport/image_transport.h>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <Eigen/Dense>
#include <Eigen/Geometry>
struct IMUState{
typedef long long int StateIDType;
StateIDType id;
static StateIDType next_id;
double time; //received time
//Eigen::Vector4d orientation; //world frame to imu frame
//Eigen::Vector3d position; // imu position in world frame
//Eigen::Vector3d velocity; // velocity of imu in world frame
Eigen::Vector3f gyro_bias; // gyro_bias
//Eigen::Vector3d acc_bias; // acc_bias
//Eigen::Matrix3d R_imu_cam; // rotation matrix from imu to cam
//Eigen::Vector3d t_cam_imu; // movements?c
//to have a proper null spacee
//Eigen::Vector4d orientation_null;
//Eigen::Vector3d position_null;
//Eigen::Vector3d velocity_null;
// noise
Eigen::Vector3d g;
//Eigen::Vector3d gyro_noise;
//Eigen::Vector3d acc_noise;
//Eigen::Vector3d gyro_bias_noise;
//Eigen::Vector3d acc_bias_noise;
//static Eigen::Vector3d gravity; //graviity in the world frame
//static Eigen::Isometry3d T_imu_body;
};
class RosInterface{
public:
RosInterface(ros::NodeHandle nh);
void imuCallback(const sensor_msgs::ImuConstPtr& imu);
void imuInitialize();
// void imageCallback(const sensor_msgs::ImageConstPtr& image);
private:
ros::NodeHandle nh_;
image_transport::ImageTransport it_;
image_transport::Subscriber image_sub_;
image_transport::Publisher track_image_pub_;
ros::Subscriber imu_sub_;
ros::Publisher odom_pub_;
std::atomic<bool> imu_calibrated_;
double prev_imu_time_;
IMUState imy_state_;
std::vector<sensor_msgs::Imu> imu_msg_buffer_;
};