gpt4 book ai didi

c++ - 包括CallbackGroups后ROS通信未响应

转载 作者:行者123 更新时间:2023-12-02 10:23:33 27 4
gpt4 key购买 nike

我对ROS2中rclcpp的CallbackGroups有疑问。我正在尝试让rclcpp::TimerBase以指定的更新速率运行更新周期,同时该节点应侦听订阅中的传入消息。据我所知,这样做的方法是将MultiThreadExceutor与CallbackGroups一起使用。因此,我创建了一个可重入类型CallbackGroup,在其中添加了计时器和订阅。但是,一旦将计时器添加到CallbackGroup,计时器就会停止工作。也许我忘记了什么? CallbackGroups或Node是否需要在指定的上下文中?还是我完全误解了CallbackGroups的概念?会很高兴收到您的任何帮助!

到目前为止,我尝试过的操作:SingleThreadExecutor出现了相同的问题,删除CallbackGroup则显示了预期的行为,计时器正在运行,并且调用了update()。试图找出问题所在,并发现它是在MTE的run(...)方法期间,在wait_for_work()的父类(rclcpp::executor::Executor)的get_next_executable(:: :)中进行的。 ...)执行器在447-448行中的功能:

    rcl_ret_t status = rcl_wait(&wait_set_, std::chrono::duration_cast<std::chrono::nanoseconds>(timeout).count());

如果我放弃
    memory_strategy_->number_of_ready_timers()

在MultiThreadedExecutor中显示1,因此计时器似乎已注册,对吧?

头文件:controller_node_test / controller_node_test.h:

#ifndef CONTROLLER_NODE_H
#define CONTROLLER_NODE_H

#include "rclcpp/rclcpp.hpp"
#include "controller_node_test/multi_threaded_executor.hpp"
#include "chrono"
#include <ctime>

using std::placeholders::_1;

namespace controller_node
{
class ControllerNode : public rclcpp::Node {
public:
ControllerNode();
~ControllerNode();

private:

rclcpp::TimerBase::SharedPtr update_timer_;

void update();

};
} // namespace controller_node

源文件:controller_node_test.cpp

#include "controller_node_test/controller_node_test.h"

namespace controller_node
{

ControllerNode::ControllerNode() : rclcpp::Node("controller_node"){
rclcpp::callback_group::CallbackGroup::SharedPtr update_group = this->create_callback_group(rclcpp::callback_group::CallbackGroupType::Reentrant);
update_timer_ = this->create_wall_timer(
std::chrono::milliseconds(100),
std::bind(&ControllerNode::update, this),
update_group);
}

ControllerNode::~ControllerNode(){

}

void ControllerNode::update(){
std::cout << "Timer: " << std::this_thread::get_id() << std::endl;
}
} // namespace controller_node

int main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
rclcpp::executors::MultiThreadedExecutor exec;
auto controller_node = std::make_shared<controller_node::ControllerNode>();
exec.add_node(controller_node);
exec.spin();
rclcpp::shutdown();
return 0;
}

问题是
    std::cout << "Timer: " << std::this_thread::get_id() << std::endl;

永远不会被调用,所以计时器根本不工作。

我删除了代码中所有不必要的部分,以使您更加清楚,所以如果不编译,请通知我。非常感谢您的帮助!我只是不明白那里到底发生了什么,现在我需要您的帮助...谢谢!

最佳答案

您已正确了解如何使用CallbackGroups。

您发布的示例不起作用的原因:在ControllerNode构造函数中,声明一个局部变量rclcpp::callback_group::CallbackGroup::SharedPtr cbg
当构造函数返回时,指针的引用计数变为0,并且CallbackGroup被销毁。您需要保留对CallbackGroup的引用,您的示例应该可以使用。

例如

class ControllerNode : public rclcpp::Node {
public:
ControllerNode() : rclcpp::Node("controller_node") {
cbg_ = create_callback_group(rclcpp::callback_group::CallbackGroupType::Reentrant);
update_timer_ = create_wall_timer(
100ms, std::bind(&ControllerNode::update, this), cbg_);
}

private:
rclcpp::TimerBase::SharedPtr update_timer_;
rclcpp::callback_group::CallbackGroup::SharedPtr cbg_;
void update() {
std::cout << "Timer: " << std::this_thread::get_id() << std::endl;
}
};

关于c++ - 包括CallbackGroups后ROS通信未响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57893546/

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