攻城狮参上 2024-04-02 09:24 采纳率: 0%
浏览 99
已结题

ubuntu 20.04 ros noetic订阅消息报错:error: no matching function for call to ‘ros::NodeHandle::subscribe

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_;
        
        
};


  • 写回答

12条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-02 09:24
    关注
    获得0.75元问题酬金

    引自免费微信小程序:皆我百晓生

    针对您在Ubuntu 20.04系统上使用ROS Noetic时遇到的ros::NodeHandle::subscribe调用错误,以及您提供的相关代码片段,我已经进行了分析,并找到了问题所在及相应的解决办法。以下是详细的解答与修正后的代码:

    问题分析:

    您提到的错误信息指出没有找到匹配的ros::NodeHandle::subscribe函数调用。实际上,您试图订阅的是名为"imu"的话题,但使用了advertise方法而不是subscribe方法。advertise用于发布话题,而subscribe用于订阅话题。因此,错误在于方法名使用不当。

    解决方案:

    imu_sub_ = nh_.advertise("imu",100,boost::bind(&RosInterface::imuCallback,this,_1));这一行中的advertise更正为subscribe。同时,由于您希望使用成员函数作为回调,应使用std::bind(C++11标准)而非boost::bind。另外,取消对imuCallback参数的显式指定,因为std::bind会自动处理成员函数的隐含this指针。修改后的代码如下:

    imu_sub_ = nh_.subscribe("imu", 100, &RosInterface::imuCallback, this);
    

    修正后的RosInterface类定义:

    #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_.subscribe("imu", 100, &RosInterface::imuCallback, this);
    }
    
    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;
    }
    

    修正后的头文件:

    无需改动。

    通过上述调整,您的RosInterface类应该能正确地订阅名为"imu"的话题并调用imuCallback函数处理接收到的消息。如果您在后续实现过程中遇到其他问题,欢迎继续提问。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月11日
  • 赞助了问题酬金15元 4月3日
  • 创建了问题 4月2日