ROS 订阅回调 - 使用 boost::bind 和成员函数
ROS subscribe callback - using boost::bind with member functions
我正在尝试订阅 ROS 中的不同主题(每辆弹出的车辆一个),对所有主题使用相同的回调。这个想法是 boost::bind
将主题名称作为附加参数传递,这样我就知道我应该在回调中访问哪个车辆。
问题是,尽管我已经回答了关于该主题的多个问题,none 的解决方案似乎有效。
基本上,我有以下 class VOBase
包含一个 std::map<std::string, VOAgent*> agents_
和一个成员函数如下:
void VOBase::callback_agentState(const custom_msgs::VState::ConstPtr& vStateMsg,
std::string topic) {
// [...] regex to find agent name from topic string
std::string agent_name = match.str();
// [...] Check if agent name exists, else throw exception
// Process message
agents_[agent_name]->pos_ = vStateMsg->pose.position; // etc.
}
我通过此订阅呼叫:
void VOBase::callback_agentList(const custom_msgs::VehicleList& vehListMsg) {
// [...] New agent/vehicle found: process vehListMsg and get agent_name string
// Subscribe to VState
topic_name = agent_name + "/state_estimate";
subscribers_[topic_name] = nodeHandlePtr->subscribe<custom_msgs::VState>(topic_name, 1,
std::bind(&VOBase::callback_agentState, this, _1, topic_name));
}
但是,我收到了所有候选人的 template argument deduction/substitution failed
和这个错误:
mismatched types ‘std::reference_wrapper<_Tp>’ and ‘VO::VOBase*’
typename add_cv<_Functor>::type&>::type>()(
我已经测试了很多解决方案,例如使用 std::ref(this)
来获得 std::reference_wrapper<_Tp>
而不是 VO::VOBase*
(尽管引用不存在:use of deleted function
),使用 boost::bind
而不是 std::bind
(但自 C++11 以来它应该完全相同),在回调函数参数(以及 subscribe<acl_msgs::ViconState::ConstPtr>
等中)有和没有用于 ROS 消息的 ...::ConstPtr
。所以我是只是在这里处理部分解决方案及其排列...
有什么线索吗?
我没有查看您显示的代码的细节(很难找出未显示的信息并推断出需要什么)。
但是,上次我帮助某人进行 ROS 订阅和类型推导时,处理程序显然应该对消息采取 shared_ptr。这可能会帮助您开始寻找解决方案:
我正在尝试订阅 ROS 中的不同主题(每辆弹出的车辆一个),对所有主题使用相同的回调。这个想法是 boost::bind
将主题名称作为附加参数传递,这样我就知道我应该在回调中访问哪个车辆。
问题是,尽管我已经回答了关于该主题的多个问题,none 的解决方案似乎有效。
基本上,我有以下 class VOBase
包含一个 std::map<std::string, VOAgent*> agents_
和一个成员函数如下:
void VOBase::callback_agentState(const custom_msgs::VState::ConstPtr& vStateMsg,
std::string topic) {
// [...] regex to find agent name from topic string
std::string agent_name = match.str();
// [...] Check if agent name exists, else throw exception
// Process message
agents_[agent_name]->pos_ = vStateMsg->pose.position; // etc.
}
我通过此订阅呼叫:
void VOBase::callback_agentList(const custom_msgs::VehicleList& vehListMsg) {
// [...] New agent/vehicle found: process vehListMsg and get agent_name string
// Subscribe to VState
topic_name = agent_name + "/state_estimate";
subscribers_[topic_name] = nodeHandlePtr->subscribe<custom_msgs::VState>(topic_name, 1,
std::bind(&VOBase::callback_agentState, this, _1, topic_name));
}
但是,我收到了所有候选人的 template argument deduction/substitution failed
和这个错误:
mismatched types ‘std::reference_wrapper<_Tp>’ and ‘VO::VOBase*’
typename add_cv<_Functor>::type&>::type>()(
我已经测试了很多解决方案,例如使用 std::ref(this)
来获得 std::reference_wrapper<_Tp>
而不是 VO::VOBase*
(尽管引用不存在:use of deleted function
),使用 boost::bind
而不是 std::bind
(但自 C++11 以来它应该完全相同),在回调函数参数(以及 subscribe<acl_msgs::ViconState::ConstPtr>
等中)有和没有用于 ROS 消息的 ...::ConstPtr
。所以我是只是在这里处理部分解决方案及其排列...
有什么线索吗?
我没有查看您显示的代码的细节(很难找出未显示的信息并推断出需要什么)。
但是,上次我帮助某人进行 ROS 订阅和类型推导时,处理程序显然应该对消息采取 shared_ptr。这可能会帮助您开始寻找解决方案: