实现行为树执行器、任务协调和技能接口
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
#include "robot_bt/core.hpp"
|
||||
#include <cassert>
|
||||
#include <cstdlib>
|
||||
#include <filesystem>
|
||||
#include <iostream>
|
||||
using namespace robot_bt;
|
||||
struct FaultDriver final : GoalDriver {
|
||||
unsigned sent{0}, canceled{0};
|
||||
bool ready(Skill) const override { return true; }
|
||||
void send(const GoalRequest&) override { ++sent; }
|
||||
void cancel(const std::string&) override { ++canceled; }
|
||||
std::vector<GoalEvent> drain_events() override { return {}; }
|
||||
};
|
||||
int main() {
|
||||
char name[]="/tmp/bt_journal_failure_XXXXXX";
|
||||
const char* directory=::mkdtemp(name); assert(directory);
|
||||
std::string path=std::string(directory)+"/goals";
|
||||
FaultDriver driver;
|
||||
ActiveGoalRegistry registry(driver,path);
|
||||
GoalRequest q;q.robot_id="robot";q.trace={"task","pick","run",1,1,1,1};
|
||||
const auto id=registry.start(q,SteadyTime{});assert(id&&driver.sent==1);
|
||||
// Simulate an unavailable journal after the motion request has been sent.
|
||||
std::filesystem::remove(path);std::filesystem::create_directory(path);
|
||||
try { registry.request_cancel(*id,SteadyTime{}); } catch(const std::exception&) {}
|
||||
assert(driver.canceled==1 && "journal failure must never suppress a stop request");
|
||||
assert(registry.robot_locked("robot"));
|
||||
q.trace.attempt=2;assert(!registry.start(q,SteadyTime{}));
|
||||
std::filesystem::remove_all(directory);
|
||||
std::cout<<"journal fault preserves cancel and quarantine\n";
|
||||
}
|
||||
Reference in New Issue
Block a user