gpt4 book ai didi

c++ - ROS使用模板类成员作为主题订阅的回调

转载 作者:行者123 更新时间:2023-11-30 05:23:19 25 4
gpt4 key购买 nike

我正在尝试创建一个可以实例化一次的类,并且可以向其中添加 ros 主题订阅,其中回调是同一成员函数的模板特化。

类ros_topic_subscriber.h文件是

class ROSTopicSubscriber
{
public:

ROSTopicSubscriber() {}

~ROSTopicSubscriber() {}

template<typename ROSMessageType>
int init
(
const ros::NodeHandle &controller_nh,
const std::string& topic_name,
unsigned int buffer_size
)
{
ros::Subscriber sub = controller_nh.subscribe(
topic_name,
buffer_size,
&ROSTopicSubscriber::topicCallback<ROSMessageType>,
this
);
}

/*! \brief Implement this function for your own message!
*/
template<typename ROSMessageType>
void topicCallback(const typename ROSMessageType::ConstPtr& msg);


private:

// No copying of this class is allowed !
ROSTopicSubscriber(const ROSTopicSubscriber& other) = delete;
ROSTopicSubscriber(ROSTopicSubscriber&& other) = delete;
ROSTopicSubscriber& operator=(const ROSTopicSubscriber& other) = delete;
ROSTopicSubscriber& operator=(ROSTopicSubscriber&& other) noexcept = delete;

};

在我的例子中,topicCallback 的一种可能的模板特化是(在 ros_topic_subscriber.cpp 文件中)

template<>
void ROSTopicSubscriber::topicCallback<geometry_msgs::Pose>
(
const geometry_msgs::Pose::ConstPtr& msg
)
{
std::cout << "msg\n";
}

并且要利用这个类,例如可以做

topic_subscriber_.init<geometry_msgs::Pose>
(n, "/wintracker/pose", 100);

现在,我得到的编译器错误是这样的:

ros_topic_subscriber.h:66:3: 
error: passing ‘const ros::NodeHandle’ as ‘this’ argument of
‘ros::Subscriber ros::NodeHandle::subscribe(
const string&,
uint32_t,
void (T::*)(const boost::shared_ptr<const M>&),
T*,
const ros::TransportHints&)
[with M = geometry_msgs::Pose_<std::allocator<void> >;
T = hiqp::ROSTopicSubscriber;
std::string = std::basic_string<char>;
uint32_t = unsigned int]’
discards qualifiers [-fpermissive]

为什么在这种情况下会出现此错误消息?是否可以实现这种类?我该如何修复错误?

最佳答案

您的 ROSTopicSubscriber::init 获取 controller_nh 参数作为 const 引用,这意味着它只能调用声明为可调用的方法一个常量对象。但是,您尝试调用未以这种方式声明的 subscribe 方法。

方法声明在您的代码中可能如下所示:

class NodeHandle {
// ...
Subscriber subscribe(/* all the parameters */);
// ...
}

解决方案取决于 subscribe 方法是否需要更改 NodeHandle 对象中的任何内容。如果不是,则将其标记为可在常量对象上调用:

class NodeHandle {
// ...
Subscriber subscribe(/* all the parameters */) const; // <- notice const!
// ...
}

如果 subscribe 方法更改了 NodeHandle 中的内容,那么您需要更改 ROSTopicSubscriber::init 的 controller_nh 参数 方法是一个可变的(不是常量)引用:

int init
(
ros::NodeHandle &controller_nh, // <- notice const is gone
const std::string& topic_name,
unsigned int buffer_size
)

关于c++ - ROS使用模板类成员作为主题订阅的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39268042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com