【问题标题】:ROS 2 Subscriber Callback with a method of member classROS 2订阅者回调与成员类的方法
【发布时间】:2020-10-30 03:15:24
【问题描述】:

我想在回调函数中使用成员类方法。 以下 C++ 代码是一个简单的订阅者,使用成员类方法 hello() 进行回调。

#include <functional>
#include <memory>

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

using std::placeholders::_1;

class Subclass
{
private:
public:
    Subclass(/* args */);
    ~Subclass();
    std::string hello(std::string &s)
    {
        return "Hello " + s;
    }
};

class MinimalSubscriber : public rclcpp::Node
{
public:
    MinimalSubscriber()
        : Node("minimal_subscriber")
    {
        subscription_ = this->create_subscription<std_msgs::msg::String>(
            "topic", 10, std::bind(&MinimalSubscriber::topic_callback, this, _1));
    }

private:
    Subclass subclass_;
    void topic_callback(const std_msgs::msg::String::SharedPtr msg) const
    {
        std::string s = subclass_.hello(msg->data);
        RCLCPP_INFO(this->get_logger(), "I heard: '%s'", s.c_str());
    }
    rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;
};

int main(int argc, char *argv[])
{
    rclcpp::init(argc, argv);
    rclcpp::spin(std::make_shared<MinimalSubscriber>());
    rclcpp::shutdown();
    return 0;
}

我构建了 C++ 代码并收到以下消息。我如何修复代码? 使用 Ubuntu LTS 20.04 中的 ROS2 Foxy 构建。

/home/ubuntu/dev_ws/src/ros2_pigpio/src/subclass.cpp: In member function ‘void MinimalSubscriber::topic_callback(std_msgs::msg::String_<std::allocator<void> >::SharedPtr) const’:
/home/ubuntu/dev_ws/src/ros2_pigpio/src/subclass.cpp:35:50: error: passing ‘const Subclass’ as ‘this’ argument discards qualifiers [-fpermissive]
   35 |         std::string s = subclass_.hello(msg->data);
      |                                                  ^
/home/ubuntu/dev_ws/src/ros2_pigpio/src/subclass.cpp:15:17: note:   in call to std::string Subclass::hello(std::string&)’
   15 |     std::string hello(std::string &s)
      |                 ^~~~~
make[2]: *** [CMakeFiles/subclass.dir/build.make:63: CMakeFiles/subclass.dir/src/subclass.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:84: CMakeFiles/subclass.dir/all] Error 2
make: *** [Makefile:141: all] Error 2

【问题讨论】:

    标签: c++ c++11 ros subscriber ros2


    【解决方案1】:

    我可以构建以下一个。

    #include <functional>
    #include <memory>
    
    #include "rclcpp/rclcpp.hpp"
    #include "std_msgs/msg/string.hpp"
    
    using std::placeholders::_1;
    
    class Subclass
    {
    private:
    public:
        Subclass(/* args */){};
        ~Subclass(){};
        std::string hello(std::string &s) const
        {
            return "Hello " + s;
        }
    };
    
    class MinimalSubscriber : public rclcpp::Node
    {
    public:
        MinimalSubscriber()
            : Node("minimal_subscriber")
        {
            subscription_ = this->create_subscription<std_msgs::msg::String>(
                "topic", 10, std::bind(&MinimalSubscriber::topic_callback, this, _1));
        }
    
    private:
        Subclass subclass_;
        void topic_callback(const std_msgs::msg::String::SharedPtr msg) const
        {
            std::string s = subclass_.hello(msg->data);
            RCLCPP_INFO(this->get_logger(), "I heard: '%s'", s.c_str());
        }
        rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;
    };
    
    int main(int argc, char *argv[])
    {
        rclcpp::init(argc, argv);
        rclcpp::spin(std::make_shared<MinimalSubscriber>());
        rclcpp::shutdown();
        return 0;
    }
    

    【讨论】:

      【解决方案2】:

      首先,如果您将msg-&gt;data 作为字符串传递,请使用msg-&gt;data.c_str()。因此,我相信您的 std::string hello(std::string &amp;s) 方法在这种情况下必须是静态的,否则您必须使用构造函数创建子类的实例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-28
        • 1970-01-01
        • 1970-01-01
        • 2016-02-07
        • 2014-12-12
        • 2020-10-29
        相关资源
        最近更新 更多