каким образом «нестатическая ссылка на элемент должна относиться к определенному объекту» может быть решена с помощью доступа к другой функции - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь передать некоторую функцию для тестирования в узел main(), как показано ниже.Тем не менее, я получаю следующее non static member reference must be relative to a specific object.Я провел большое количество исследований об этой проблеме, как, например, я обнаружил этот , у которого была похожая проблема, также это полезно , который объяснял, как получить доступ и понять отношенияс «родительским» экземпляром.Я применил то, что советовали здесь , и благодаря передаче madgwick::MADGWICK_reader obj(std::string file); на основную часть я частично смог получить доступ к class MADGWICK_reader, который имеет функцию void filter_function(const sensor_msgs::Imu &msg);, к которой я пытаюсь получить доступ с mainно все-таки что-то не совсем правильно.

Я знаю, что неправильно делать члены статичными, просто добавляя ключевое слово «static», и что мне также нужно определить их, и это причинапочему функция специально установлена ​​как void filter_function(const sensor_msgs::Imu &msg); Я передаю амперсенд & с целью передать его по ссылке на main, но кажется, что функция никогда не принимается.

Это madgwick_filter.h , обратите внимание на функцию void filter_function(const sensor_msgs::Imu &msg);, которая имеет проблему в main:

namespace madgwick
{
    using timestamp_t = uint64_t;
    using timestampToDouble_t = double;

    struct IMU_MADGWICK_DATA
    {
        double magz;
        double magy;
        double magx;
        float accelz;
        float accelx;
        float accely;
        unsigned long timestamp;
        double phi;   // orientation
        double psi;   // orientation
        double theta; // orientation
        double gyrox; // angular velocity x
        double gyroy; // angular velocity y
        double gyroz; // angular velocity z
    };


    class Madgwick
    {
    public:
      Madgwick();

    };

    class MADGWICK_reader
    {
    public:
        MADGWICK_reader(std::string filename);
        bool nextLine();
        bool nextLineWithSupport();

        IMU_MADGWICK_DATA madgwick_data;

        sensor_msgs::Imu imuMadgwickMsg;
        sensor_msgs::MagneticField magMedgwickMsg;

        geometry_msgs::QuaternionStamped q;
        geometry_msgs::Vector3Stamped v;
        geometry_msgs::TransformStamped q_trans;
        float sampleFreq;
        double beta;
        double q0=1.0, q1=0.0, q2=0.0, q3=0.0;
        std_msgs::Header header;
        float ax, ay, az, gx, gy, gz;
        ros::Duration dtime;
        float dt;

        float invSqrt();
        void qua2Euler(geometry_msgs::QuaternionStamped);
        void madgwickIMU(float gx, float gy, float gz, float ax, float ay, float az);
        void filter_function(const sensor_msgs::Imu &msg);

    private:
        io::CSVReader<13> madg_imu_reader;
        unsigned int imuMadgNum;
        unsigned int magMadgNum;
        void packMadgMagMsg();
        void pack_Imu_Madgwick_Msg();
        void pack_Mag_Madgwick_Msg();
    };
}

madgwick_filter.cpp

namespace madgwick
{
    Madgwick::Madgwick()
    {

    }

    MADGWICK_reader::MADGWICK_reader(std::string filename):
        madg_imu_reader(filename)
    {
        // operations ...
    }

    void MADGWICK_reader::filter_function(const sensor_msgs::Imu &msg)
    {
        timestampToDouble_t currentTime = (madgwick_data.timestamp)/1e6;
        ros::Time stamp(currentTime);
        header = msg.header;
        ax = float(msg.linear_acceleration.x);
        ay = float(msg.linear_acceleration.y);
        az = float(msg.linear_acceleration.z);

        // more operations ...
    }
}

и, наконец, это madgwick_filter_node.cpp

#include "imu_filter_madgwick/madgwick_filter.h"
#include <iostream>

    int main(int argc, char** argv)
    {
        ros::init(argc, argv, "madgwick_filter_node");
        madgwick::MADGWICK_reader reader(std::string filename);

        ros::NodeHandle n;
        ros::Publisher pub1 = n.advertise<geometry_msgs::QuaternionStamped>("quaternion", 1);
        ros::Publisher pub2 = n.advertise<geometry_msgs::Vector3Stamped>("ypr", 1);

        tf::TransformBroadcaster q_brodecaster;

        madgwick::MADGWICK_reader obj(std::string file);

        ros::Subscriber sub = n.subscribe("imu0", 10, obj.filter_function); // <-- Error Here

        ros::spin();
    }

Может ли кто-нибудь указать верное направление или объяснить, почему по-прежнему невозможно получить доступ к функции, содержащейся вслосел от main?Спасибо, что пролил свет на это.

1 Ответ

1 голос
/ 22 мая 2019

Поскольку вы не предоставили объявление о подписке, но, похоже, ваша проблема связана с передачей функций-членов класса другой функции, поэтому в приведенном ниже решении представлены два способа достижения этого - с помощью лямбда-выражения и другого - с помощью связывания.

#include <iostream>
#include <functional>
class Test{
    public:
    void fun(int x)
    {
        std::cout<<"I am having fun in Test with number "<<x<<std::endl;
    }
};
void sampleFunction(std::function<void(int)> sf,int x)
{
    sf(x);
}
int main()
{
    Test obj;
    auto objf = std::bind(&Test::fun,&obj,std::placeholders::_1);
    sampleFunction(objf,5);

    auto lf = [&obj](int y) { return obj.fun(y); };
    sampleFunction(lf,6);
    return 0;
}
...