実際のところ
パッケージの導入
$ sudo apt update $ sudo apt install ros-$ROS_DISTRO-behaviortree-cpp-v3
ROS2パッケージの作成
作業ディレクトリは"|/dev_ws"とし、サブディレクトリsrcもあるとします。
$ cd ~/dev_ws/src $ ros2 pkg create --build-type ament_cmake your_behavior_tree_package
ソース類の用意
公式を読んでもサッパリ
$ cd ~/dev_ws/src/your_behavior_tree_package $ tree . | -- CMakeLists.txt | include | | -- your_behavior_tree_package | package.xml | src 3 directories, 2 files
必要なディレクトリとファイルを用意
$ mkdir config $ mkdir launch $ touch src/simple_action_node.cpp $ touch config/my_tree.xml $ touch launch/behavior_tree.launch.py
"src/simple_action_node.cpp"。
treeファイルは"/home/user/dev_ws/src/your_behavior_tree/config/my_tree.xml";にあるとします。
#include <behaviortree_cpp_v3/behavior_tree.h> #include <behaviortree_cpp_v3/bt_factory.h> #include <iostream> #include <string> using namespace BT; // Simple function that return a NodeStatus BT::NodeStatus CheckBattery() { std::cout << "[ Battery: OK ]" << std::endl; return BT::NodeStatus::SUCCESS; } int main() { BehaviorTreeFactory factory; factory.registerSimpleCondition("CheckBattery", [&](TreeNode&) { return CheckBattery(); }); //indicate the path to the file containing the tree std::string xml_file = "/home/tsukarm/dev_ws/src/your_behavior_tree_package/config/my_tree.xml"; //auto tree = factory.createTreeFromFile(xml_file); auto tree = factory.createTreeFromFile( "/home/tsukarm/dev_ws/src/your_behavior_tree_package/config/my_tree.xml"); tree.tickRootWhileRunning(); return 0; }
" launch/behavior_tree.launch.py"
from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( package='your_behavior_tree_package', executable='simple_action_node', name='simple_action_node' ) ])
"config/my_tree.xml"
<root main_tree_to_execute = "MainTree" > <BehaviorTree ID="MainTree"> <Sequence name="root_sequence"> <CheckBattery name="check_battery"/> <!-- 追加はここに --> </Sequence> </BehaviorTree> </root>
"CMakeLists.txt"を以下の様に
cmake_minimum_required(VERSION 3.8)
project(your_behavior_tree_package)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# find dependencies
find_package(ament_cmake REQUIRED)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
# the following line skips the linter which checks for copyrights
# comment the line when a copyright and license is added to all source files
set(ament_cmake_copyright_FOUND TRUE)
# the following line skips cpplint (only works in a git repo)
# comment the line when this package is in a git repo and when
# a copyright and license is added to all source files
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
##追加ここから
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(behaviortree_cpp_v3 REQUIRED)
add_executable(simple_action_node src/simple_action_node.cpp)
ament_target_dependencies(simple_action_node rclcpp behaviortree_cpp_v3)
install(TARGETS
simple_action_node
DESTINATION lib/${PROJECT_NAME}
)
##ここまで
ament_package()
ビルド
$ cd ~/dev_ws $ colcon build $ source ~/dev_ws/install/setup.bash