Skip to content

Commit 2543444

Browse files
committed
set bool examples
1 parent d567cc8 commit 2543444

File tree

5 files changed

+198
-0
lines changed

5 files changed

+198
-0
lines changed

btcpp_ros2_samples/CMakeLists.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@ find_package(ament_cmake REQUIRED)
99
find_package(behaviortree_ros2 REQUIRED)
1010
find_package(btcpp_ros2_interfaces REQUIRED)
1111
find_package(std_msgs REQUIRED)
12+
find_package(std_srvs REQUIRED)
1213

1314
set(THIS_PACKAGE_DEPS
1415
behaviortree_ros2
1516
std_msgs
17+
std_srvs
1618
btcpp_ros2_interfaces )
1719

1820
######################################################
@@ -50,6 +52,14 @@ ament_target_dependencies(sleep_server ${THIS_PACKAGE_DEPS})
5052
add_executable(subscriber_test src/subscriber_test.cpp)
5153
ament_target_dependencies(subscriber_test ${THIS_PACKAGE_DEPS})
5254

55+
######################################################
56+
# the SetBool test
57+
add_executable(bool_client src/bool_client.cpp src/set_bool_node.cpp)
58+
ament_target_dependencies(bool_client ${THIS_PACKAGE_DEPS})
59+
60+
add_executable(bool_server src/bool_server.cpp )
61+
ament_target_dependencies(bool_server ${THIS_PACKAGE_DEPS})
62+
5363
######################################################
5464
# INSTALL
5565

@@ -60,6 +70,8 @@ install(TARGETS
6070
sleep_plugin
6171
subscriber_test
6272
sample_bt_executor
73+
bool_client
74+
bool_server
6375
DESTINATION lib/${PROJECT_NAME}
6476
)
6577

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#include "behaviortree_ros2/bt_action_node.hpp"
2+
#include "rclcpp/rclcpp.hpp"
3+
#include "rclcpp/executors.hpp"
4+
5+
#include "set_bool_node.hpp"
6+
7+
using namespace BT;
8+
9+
static const char* xml_text = R"(
10+
<root BTCPP_format="4">
11+
<BehaviorTree>
12+
<Sequence>
13+
<RobotSetBool robot="robotA" command="true"/>
14+
<RobotSetBool robot="robotB" command="true"/>
15+
</Sequence>
16+
</BehaviorTree>
17+
</root>
18+
)";
19+
20+
int main(int argc, char** argv)
21+
{
22+
rclcpp::init(argc, argv);
23+
auto nh = std::make_shared<rclcpp::Node>("bool_client");
24+
25+
BehaviorTreeFactory factory;
26+
factory.registerNodeType<NamespacedSetBool>("RobotSetBool", "set_bool", nh);
27+
28+
auto tree = factory.createTreeFromText(xml_text);
29+
30+
tree.tickWhileRunning();
31+
32+
return 0;
33+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#include "rclcpp/rclcpp.hpp"
2+
#include "std_srvs/srv/set_bool.hpp"
3+
4+
#include <memory>
5+
6+
void CallbackA(const std::shared_ptr<std_srvs::srv::SetBool::Request> request,
7+
std::shared_ptr<std_srvs::srv::SetBool::Response> response)
8+
{
9+
response->success = request->data;
10+
auto logger = rclcpp::get_logger("rclcpp");
11+
RCLCPP_INFO(logger, "Incoming request A: %s", request->data ? "true" : "false");
12+
}
13+
14+
void CallbackB(const std::shared_ptr<std_srvs::srv::SetBool::Request> request,
15+
std::shared_ptr<std_srvs::srv::SetBool::Response> response)
16+
{
17+
response->success = request->data;
18+
auto logger = rclcpp::get_logger("rclcpp");
19+
RCLCPP_INFO(logger, "Incoming request B: %s", request->data ? "true" : "false");
20+
}
21+
22+
int main(int argc, char** argv)
23+
{
24+
rclcpp::init(argc, argv);
25+
26+
std::shared_ptr<rclcpp::Node> node = rclcpp::Node::make_shared("add_two_ints_server");
27+
28+
auto serviceA =
29+
node->create_service<std_srvs::srv::SetBool>("robotA/set_bool", &CallbackA);
30+
auto serviceB =
31+
node->create_service<std_srvs::srv::SetBool>("robotB/set_bool", &CallbackB);
32+
33+
RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Ready.");
34+
35+
rclcpp::spin(node);
36+
rclcpp::shutdown();
37+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
#include "set_bool_node.hpp"
2+
3+
bool SetBoolService::setRequest(Request::SharedPtr& request)
4+
{
5+
getInput("value", request->data);
6+
std::cout << "setRequest " << std::endl;
7+
return true;
8+
}
9+
10+
BT::NodeStatus SetBoolService::onResponseReceived(const Response::SharedPtr& response)
11+
{
12+
std::cout << "onResponseReceived " << std::endl;
13+
if(response->success)
14+
{
15+
RCLCPP_INFO(logger(), "SetString service succeeded.");
16+
return BT::NodeStatus::SUCCESS;
17+
}
18+
else
19+
{
20+
RCLCPP_INFO(logger(), "SetString service failed: %s", response->message.c_str());
21+
return BT::NodeStatus::FAILURE;
22+
}
23+
}
24+
25+
BT::NodeStatus SetBoolService::onFailure(BT::ServiceNodeErrorCode error)
26+
{
27+
RCLCPP_ERROR(logger(), "Error: %d", error);
28+
return BT::NodeStatus::FAILURE;
29+
}
30+
31+
//------------------------------------------------------
32+
//------------------------------------------------------
33+
//------------------------------------------------------
34+
35+
NamespacedSetBool::NamespacedSetBool(const std::string& name, const BT::NodeConfig& conf,
36+
const std::string& service_name,
37+
std::weak_ptr<rclcpp::Node> node)
38+
: BT::ActionNodeBase(name, conf)
39+
, local_bb_(BT::Blackboard::create(conf.blackboard))
40+
, service_name_(service_name)
41+
{
42+
BT::NodeConfig impl_config;
43+
impl_config.blackboard = local_bb_;
44+
impl_config.input_ports["service_name"] = "{=}";
45+
impl_config.input_ports["value"] = "{=}";
46+
BT::RosNodeParams impl_params;
47+
impl_params.nh = node;
48+
set_bool_service_ = std::make_unique<SetBoolService>(name, impl_config, impl_params);
49+
}
50+
51+
BT::NodeStatus NamespacedSetBool::tick()
52+
{
53+
std::string robot;
54+
bool command;
55+
if(!getInput("robot", robot) || !getInput("command", command))
56+
{
57+
throw BT::RuntimeError("NamespacedSetBool: Missing inputs");
58+
}
59+
60+
local_bb_->set("service_name", robot + "/" + service_name_);
61+
local_bb_->set("value", command);
62+
std::cout << "ticking " << std::endl;
63+
return set_bool_service_->tick();
64+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#pragma once
2+
3+
#include <behaviortree_ros2/bt_service_node.hpp>
4+
#include "std_srvs/srv/set_bool.hpp"
5+
6+
using SetBool = std_srvs::srv::SetBool;
7+
8+
class SetBoolService : public BT::RosServiceNode<SetBool>
9+
{
10+
public:
11+
SetBoolService(const std::string& name, const BT::NodeConfig& conf,
12+
const BT::RosNodeParams& params)
13+
: RosServiceNode<SetBool>(name, conf, params)
14+
{}
15+
16+
static BT::PortsList providedPorts()
17+
{
18+
return providedBasicPorts({ BT::InputPort<bool>("value") });
19+
}
20+
21+
bool setRequest(Request::SharedPtr& request) override;
22+
23+
BT::NodeStatus onResponseReceived(const Response::SharedPtr& response) override;
24+
25+
virtual BT::NodeStatus onFailure(BT::ServiceNodeErrorCode error) override;
26+
};
27+
28+
//------------------------------------------------------
29+
30+
class NamespacedSetBool : public BT::ActionNodeBase
31+
{
32+
public:
33+
NamespacedSetBool(const std::string& name, const BT::NodeConfig& conf,
34+
const std::string& service_name, std::weak_ptr<rclcpp::Node> node);
35+
36+
static BT::PortsList providedPorts()
37+
{
38+
return { BT::InputPort<std::string>("robot"), BT::InputPort<bool>("command") };
39+
}
40+
41+
BT::NodeStatus tick() override;
42+
43+
void halt() override
44+
{
45+
set_bool_service_->halt();
46+
}
47+
48+
private:
49+
BT::Blackboard::Ptr local_bb_;
50+
std::string service_name_;
51+
std::unique_ptr<SetBoolService> set_bool_service_;
52+
};

0 commit comments

Comments
 (0)