-
Notifications
You must be signed in to change notification settings - Fork 804
Closed
Description
I am trying to pass a double deque through a subtree.
<root BTCPP_format="4" >
<TreeNodesModel>
<SubTree ID="PrintNumberLoop">
<input_port name="queue_values"/>
</SubTree>
</TreeNodesModel>
<BehaviorTree ID="PrintNumberLoop">
<LoopDouble queue="{queue_values}" value="{number}">
<PrintNumber value="{number}" />
</LoopDouble>
</BehaviorTree>
<BehaviorTree ID="TreeA">
<Sequence>
<SubTree ID="PrintNumberLoop" queue_values="1;2;3" />
</Sequence>
</BehaviorTree>
</root>
)"However when I do this I get the error
terminate called after throwing an instance of 'std::runtime_error'
what(): [Any::convert]: no known safe conversion between [std::string] and [std::shared_ptr<std::deque<double, std::allocator<double> > >]
[1] 2397806 IOT instruction (core dumped) ./t18_waypoints
The problem can be reproduced by this piece of code
#include "behaviortree_cpp/bt_factory.h"
#include "behaviortree_cpp/decorators/loop_node.h"
#include "behaviortree_cpp/loggers/bt_cout_logger.h"
#include <deque>
using namespace BT;
//--------------------------------------------------------------
class PrintNumber : public SyncActionNode
{
public:
PrintNumber(const std::string& name, const NodeConfig& config)
: SyncActionNode(name, config)
{}
NodeStatus tick() override
{
double value;
if(getInput("value", value))
{
std::cout << "PrintNumber: " << value << "\n";
return NodeStatus::SUCCESS;
}
return NodeStatus::FAILURE;
}
static PortsList providedPorts()
{
return { InputPort<double>("value") };
}
};
// clang-format off
static const char* xml_tree = R"(
<root BTCPP_format="4" >
<TreeNodesModel>
<SubTree ID="PrintNumberLoop">
<input_port name="queue_values"/>
</SubTree>
</TreeNodesModel>
<BehaviorTree ID="PrintNumberLoop">
<LoopDouble queue="{queue_values}" value="{number}">
<PrintNumber value="{number}" />
</LoopDouble>
</BehaviorTree>
<BehaviorTree ID="TreeA">
<Sequence>
<SubTree ID="PrintNumberLoop" queue_values="1;2;3" />
</Sequence>
</BehaviorTree>
</root>
)";
// clang-format on
int main()
{
BehaviorTreeFactory factory;
factory.registerNodeType<PrintNumber>("PrintNumber");
factory.registerBehaviorTreeFromText(xml_tree);
auto tree = factory.createTree("TreeA");
StdCoutLogger logger(tree);
logger.enableTransitionToIdle(false);
tree.tickWhileRunning();
return 0;
}I have a workaround with an extra component to convert an std::string input to a double deque output, however I wonder if there is a more elegant solution available.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels