使用行為樹控制機器人(三) ——通用端口

文章目錄

  • 一、通用端口功能實現
    • 1. 功能實現
      • 1.1 頭文件定義
      • 1.2 源文件實現
      • 1.3 main文件實現
      • 1.4 tree.xml 實現
    • 2. 執行結果

使用行為樹控制機器人(一) —— 節點
使用行為樹控制機器人(二) —— 黑板
使用行為樹控制機器人(三) —— 通用端口

有了上述前兩節我們已經可以實現節點間的通信,BehaviorTree.CPP支持將字符串自動轉換為常見類型(如int、long、double、bool、NodeStatus等),但作為導航,我們希望節點間實現自定義數據的傳遞,如:導航點的數據傳遞:

// 自定義二維位姿類型
struct Pose2D 
{ double x;double y; double yaw; 
};

接下來,我們將展示如何將通用的 C++ 類型作為端口。

一、通用端口功能實現

1. 功能實現

1.1 頭文件定義

為了讓XML加載器能從字符串中實例化Pose2D,需提供convertFromString(BT::StringView str) 的模板類實現。如何將Pose2D序列化為字符串參考如下:

// 在BT命名空間中特化字符串轉換
namespace BT
{template <> inline Pose2D convertFromString(BT::StringView str){// 使用字符串流替代 splitStringstd::string input(str.data(), str.size());std::istringstream ss(input);Pose2D output;char delimiter;// 解析格式: "x;y;yaw"if (!(ss >> output.x >> delimiter >> output.y >> delimiter >> output.yaw) || delimiter != ';'){throw BT::RuntimeError("invalid input for Pose2D: " + input);}return output;}
} // end namespace BT

接著按照慣例,就是頭文件定義操作了。

#ifndef BEHAVIOR_TREE_NODES_H
#define BEHAVIOR_TREE_NODES_H#include "behaviortree_cpp/bt_factory.h"
#include <iostream>
#include <sstream> // 添加 sstream 頭文件// 自定義二維位姿類型
struct Pose2D 
{ double x;double y; double yaw; 
};// 在BT命名空間中特化字符串轉換
namespace BT
{template <> inline Pose2D convertFromString(BT::StringView str){// 使用字符串流替代 splitStringstd::string input(str.data(), str.size());std::istringstream ss(input);Pose2D output;char delimiter;// 解析格式: "x;y;yaw"if (!(ss >> output.x >> delimiter >> output.y >> delimiter >> output.yaw) || delimiter != ';'){throw BT::RuntimeError("invalid input for Pose2D: " + input);}return output;}
} // end namespace BTnamespace BTNodes
{// 寫入端口 "goal"
class CalculateGoal : public BT::SyncActionNode
{
public:CalculateGoal(const std::string& name, const BT::NodeConfig& config);static BT::PortsList providedPorts();BT::NodeStatus tick() override;
};// 讀取端口
class PrintTarget : public BT::SyncActionNode
{
public:PrintTarget(const std::string& name, const BT::NodeConfig& config);static BT::PortsList providedPorts();BT::NodeStatus tick() override;
};} // namespace BTNodes#endif // BEHAVIOR_TREE_NODES_H

1.2 源文件實現

#include "behavior_tree_nodes.h"using namespace BTNodes;// CalculateGoal 實現
CalculateGoal::CalculateGoal(const std::string& name, const BT::NodeConfig& config) : BT::SyncActionNode(name, config)
{}BT::PortsList CalculateGoal::providedPorts()
{return { BT::OutputPort<Pose2D>("goal") };
}BT::NodeStatus CalculateGoal::tick()
{// 設置目標位置Pose2D mygoal = {1.1, 2.3, 0.0};setOutput<Pose2D>("goal", mygoal);return BT::NodeStatus::SUCCESS;
}// PrintTarget 實現
PrintTarget::PrintTarget(const std::string& name, const BT::NodeConfig& config) : BT::SyncActionNode(name, config)
{}BT::PortsList PrintTarget::providedPorts()
{// 可選:添加人類可讀的描述const char* description = "打印目標位置到控制臺";return { BT::InputPort<Pose2D>("target", description) };
}BT::NodeStatus PrintTarget::tick()
{auto res = getInput<Pose2D>("target");if (!res){throw BT::RuntimeError("error reading port [target]: " + res.error());}Pose2D target = res.value();printf("目標位置: [%.1f, %.1f, %.1f]\n", target.x, target.y, target.yaw);return BT::NodeStatus::SUCCESS;
}

1.3 main文件實現

#include "behavior_tree_nodes.h"
#include "behaviortree_cpp/bt_factory.h"
#include "behaviortree_cpp/loggers/bt_cout_logger.h"int main()
{BT::BehaviorTreeFactory factory;// 注冊自定義節點factory.registerNodeType<BTNodes::CalculateGoal>("CalculateGoal");factory.registerNodeType<BTNodes::PrintTarget>("PrintTarget");// 內聯 XML 定義const std::string xml_text = R"(
<root BTCPP_format="4" main_tree_to_execute="MainTree"><BehaviorTree ID="MainTree"><Sequence name="root"><CalculateGoal goal="{GoalPosition}" /><PrintTarget   target="{GoalPosition}" /><Script        code=" OtherGoal:='-1;3' " /><PrintTarget   target="{OtherGoal}" /></Sequence></BehaviorTree>
</root>
)";try {
#if 0// 從文本創建行為樹const std::string tree_xml_path = xml_text;auto tree = factory.createTreeFromText(tree_xml_path);#else// 從XML文件 創建行為樹const std::string tree_xml_path = "../trees/tree.xml";auto tree = factory.createTreeFromFile(tree_xml_path);
#endif// 添加日志記錄器(可選)BT::StdCoutLogger logger(tree);// 打印樹結構std::cout << "------ Behavior Tree Structure ------" << std::endl;BT::printTreeRecursively(tree.rootNode());std::cout << "------------------------------------" << std::endl;// 執行行為樹tree.tickWhileRunning();} catch (const std::exception& e) {std::cerr << "Error: " << e.what() << std::endl;return 1;}return 0;
}

1.4 tree.xml 實現

在這里插入圖片描述
行為樹實現邏輯如上,xml文件定義如下:

<root BTCPP_format="4" main_tree_to_execute="MainTree"><BehaviorTree ID="MainTree"><Sequence name="root"><CalculateGoal goal="{GoalPosition}" /><PrintTarget   target="{GoalPosition}" /><Script        code=" OtherGoal:='-1;3;3.14' " /><PrintTarget   target="{OtherGoal}" /></Sequence></BehaviorTree>
</root>

2. 執行結果

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93072.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93072.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93072.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DataDome反爬蟲驗證技術深度解析:無感、滑塊與設備驗證全攻略

DataDome反爬蟲驗證技術深度解析&#xff1a;無感、滑塊與設備驗證全攻略 隨著網絡安全威脅的不斷演進&#xff0c;企業對數據保護的需求日益增強。DataDome作為業界領先的反爬蟲解決方案&#xff0c;以其三層防護機制在眾多知名網站中得到廣泛應用。本文將深入解析DataDome的…

RabbitMQ 消息轉換器詳解

RabbitMQ 消息轉換器詳解 一、為什么需要消息轉換器&#xff1f; RabbitMQ 的消息傳輸協議只識別字節流&#xff1a; 發送對象時&#xff0c;需要序列化成字節數組接收消息時&#xff0c;需要將字節數組反序列化成對象 如果不使用消息轉換器&#xff1a; 需要手動序列化和反序列…

內網穿透的應用-告別“現場救火”!用 cpolar遠程調試讓內網故障排查進入“云時代”

文章目錄前言**常見困境與解決方案****實際應用價值**1. Remote JVM Debug2. 系統要求與環境準備2.1 服務器環境2.2 本地開發環境3. 內網服務器準備及開始3.1 安裝cpolar配置支持遠程ssh登錄3.1.1 什么是cpolar&#xff1f;3.1.2 安裝cpolar3.1.3 注冊及配置cpolar系統服務3.1.…

Cherryusb UAC例程對接STM32內置ADC和PWM播放音樂和錄音(下)=>UAC+STM32 ADC+PWM實現錄音和播放

1. 程序基本框架整個程序框架, 與之前的一篇文章《Cherryusb UAC例程對接STM32內置ADC和DAC播放音樂和錄音(中)>UACSTM32 ADCDAC實現錄音和播放》基本一致, 只是這次將DAC替換成了PWM。因此這里不再贅述了。 2. audio_v1_mic_speaker_multichan_template.c的修改說明(略) 參…

1 JQ6500語音播報模塊詳解(STM32)

系列文章目錄 文章目錄系列文章目錄前言1 JQ6500簡介2 基本參數說明2.1 硬件參數2.2 模塊管腳說明3 控制方式3.1 通信格式3.2 通信指令4 硬件設計5 軟件設計5.1 main.c5.2 board_config5.2.1board_config.h5.2.2 board_config.c5.3 module_config5.3.1 module_config.h5.3.2 mo…

常用數據分析工具

Tableau丨Power BI丨FineBI丨SQL丨影刀丨Excel丨Python丨 參考視頻&#xff1a;【戴師兄】數據分析有哪些必學工具&#xff1f;2023最新版&#xff01;Tableau丨Power BI丨FineBI丨SQL丨影刀丨Excel丨Python丨課程教程自學攻略_嗶哩嗶哩_bilibili 文檔資料&#xff1a; 【戴師兄…

OBOO鷗柏丨智能會議平板教學查詢一體機交互式觸摸終端招標投標核心標底參數要求

整機參數要求&#xff1a;55寸/65寸/75寸/85-86寸/98寸/100寸/110寸/115寸智能會議平板教學觸控一體機/智慧黑板觸摸屏招標投標核心標底參數要求1、整機屏幕采用≥采用超高清原廠原包原裝工業LCD液晶屏面板&#xff1b;具有高色域&#xff0c;顯示動態視頻、web及3D動畫時&…

無人機在環保監測中的應用:低空經濟發展的智能監測與高效治理

一、行業背景與技術革新 隨著全球環境問題日益嚴峻&#xff0c;傳統環保監測手段已難以滿足現代環境管理的需求。固定監測站點建設成本高、覆蓋范圍有限&#xff0c;地面巡查效率低下且存在安全風險。在此背景下&#xff0c;無人機技術憑借其獨特的空間優勢和技術特性&#xff…

PO、BO、VO、DTO、POJO、DAO、DO基本概念

一、圖解二、相關概念 1、PO&#xff08;Persistant Object - 持久化對象&#xff09; 核心定位&#xff1a; 直接與數據庫表結構一一映射的對象&#xff0c;通常用于 ORM&#xff08;對象關系映射&#xff09;框架&#xff08;如 MyBatis、Hibernate&#xff09;中。 特點&…

todoList清單(HTML+CSS+JavaScript)

&#x1f30f;個人博客主頁&#xff1a; 前言&#xff1a; 前段時間學習了JavaScript&#xff0c;然后寫了一個todoList小項目&#xff0c;現在和大家分享一下我的清單以及如何實現的&#xff0c;希望對大家有所幫助 &#x1f525;&#x1f525;&#x1f525;文章專題&#xff…

Mac M1探索AnythingLLM+Ollama+知識庫問答

AnythingLLM內置 RAG、AI Agent、可視化/無代碼的 Agent 編排&#xff0c;支持多家模型與本地/云端向量庫&#xff0c;并提供多用戶與可嵌入的聊天組件&#xff0c;用來快速驗證“知識 模型 工具”拼成的 AI 應用。 1 AnythingLLM、Ollama準備 1&#xff09;AnythingLLM 打…

【 Navicat Premium 17 完全圖形化新手指南(從零開始)】

Navicat Premium 17 完全圖形化新手指南&#xff08;從零開始&#xff09; 一、準備階段&#xff1a;清理現有環境 1. 刪除已創建的測試數據庫&#xff08;如需重新開始&#xff09;打開Navicat Premium 17 雙擊桌面圖標啟動程序在左側連接面板中找到你的MySQL連接&#xff08;…

Web學習筆記5

Javascript概述1、JS簡介JS是運行在瀏覽器的腳本編程語言&#xff0c;最初用于Web表單的校驗。現在的作用主要有三個&#xff1a;網頁特效、表單驗證、數據交互JS由三部分組成&#xff0c;分別是ECMAscript、DOM、BOM&#xff0c;其中ECMAscript規定了JS的基本語法和規則&#…

部署一個開源的證件照系統

以下數據來自官方網站,記錄下來,方便自己 項目簡介 &#x1f680; 謝謝你對我們的工作感興趣。您可能還想查看我們在圖像領域的其他成果&#xff0c;歡迎來信:zeyi.linswanhub.co. HivisionIDPhoto 旨在開發一種實用、系統性的證件照智能制作算法。 它利用一套完善的AI模型工作…

Linux客戶端利用MinIO對服務器數據進行同步

接上篇 Windows客戶端利用MinIO對服務器數據進行同步 本篇為Linux下 操作&#xff0c;先看下我本地的系統版本 所以我這里下載的話&#xff0c;是AMD64 文檔在這 因為我這里只是需要用到客戶端&#xff0c;獲取數據而已&#xff0c;所以我只需要下載個MC工具用來數據獲取就可以…

Docker 中部署 MySQL 5.7 并遠程連接 Navicat 的完整指南

個人名片 &#x1f393;作者簡介&#xff1a;java領域優質創作者 &#x1f310;個人主頁&#xff1a;碼農阿豪 &#x1f4de;工作室&#xff1a;新空間代碼工作室&#xff08;提供各種軟件服務&#xff09; &#x1f48c;個人郵箱&#xff1a;[2435024119qq.com] &#x1f4f1…

自己動手造個球平衡機器人

你是否曾對那些能夠精妙地保持平衡的機器設備感到好奇&#xff1f; 從無人機到獨輪平衡車&#xff0c;背后都蘊藏著復雜的控制系統。 今天&#xff0c;我們來介紹一個充滿挑戰與樂趣的項目——制作一個球平衡機器人。這不僅是一個酷炫的擺件&#xff0c;更是一次深入學習機器…

21.Linux HTTPS服務

Linux : HTTPS服務協議傳輸方式端口安全性HTTP明文傳輸80無加密&#xff0c;可被竊聽HTTPS加密傳輸443HTTP SSL/TLS 數據加密&#xff08;防竊聽&#xff09;身份認證&#xff08;防偽裝&#xff09;完整性校驗&#xff08;防篡改&#xff09;OpenSSL 證書操作核心命令命令選項…

SqlSugar 跨方法 操作臨時表

.net項目中時長會有用到臨時表的操作結果如下所示但是在SqlSugar中可能因為會話問題導致臨時表訪問受限 搜索到的方式var conn (SqlConnection)sugarClient.Ado.Connection;if (conn.State ! System.Data.ConnectionState.Open) {conn.Open();}using (var cmd new SqlCommand…

怎么用飛算javaAI實現視頻逐幀截圖并保存

相信很多朋友都遇到過這樣的需求&#xff1a;想從視頻中截取特定幀作為素材&#xff0c;卻苦于沒有簡單易用的工具&#xff0c;要么操作復雜難以精準定位&#xff0c;要么導出的圖片質量不佳。市面上的視頻處理軟件要么功能冗余&#xff0c;要么需要付費才能使用逐幀截取功能&a…