diff --git a/CMakeLists.txt b/CMakeLists.txt index 6ff7ae3..f6e69bc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,8 +37,6 @@ add_library(${PROJECT_NAME} src/get_mtc_raw_stage.cpp src/initialize_mtc_task.cpp src/moveit_msgs.cpp - src/move_mtc_stage_to_container.cpp - src/move_mtc_container_to_parent_container.cpp src/plan_mtc_task.cpp ) @@ -52,51 +50,56 @@ ament_target_dependencies(${PROJECT_NAME} ) add_executable(bt_allow_collisions examples/bt_allow_collisions.cpp) -target_link_libraries(bt_allow_collisions ${PROJECT_NAME} ) - -add_executable(bt_create_collision_object examples/bt_create_collision_object.cpp) -target_link_libraries(bt_create_collision_object ${PROJECT_NAME} ) - add_executable(bt_compute_ik examples/bt_compute_ik.cpp) -target_link_libraries(bt_compute_ik ${PROJECT_NAME} ) - +add_executable(bt_create_collision_object examples/bt_create_collision_object.cpp) add_executable(bt_demo examples/bt_demo.cpp) -target_link_libraries(bt_demo ${PROJECT_NAME} ) - add_executable(bt_generate_place_pose examples/bt_generate_place_pose.cpp) -target_link_libraries(bt_generate_place_pose ${PROJECT_NAME} ) - add_executable(bt_joint_interpolation_solver examples/bt_joint_interpolation_solver.cpp) -target_link_libraries(bt_joint_interpolation_solver ${PROJECT_NAME} ) - add_executable(bt_move_relative examples/bt_move_relative.cpp) -target_link_libraries(bt_move_relative ${PROJECT_NAME} ) - add_executable(bt_move_to examples/bt_move_to.cpp) -target_link_libraries(bt_move_to ${PROJECT_NAME} ) - +add_executable(bt_pick_place examples/bt_pick_place.cpp) add_executable(bt_serial_container examples/bt_serial_container.cpp) -target_link_libraries(bt_serial_container ${PROJECT_NAME} ) +add_executable(generate_xml_model src/generate_xml_model.cpp) + +target_link_libraries(bt_allow_collisions ${PROJECT_NAME}) +target_link_libraries(bt_compute_ik ${PROJECT_NAME}) +target_link_libraries(bt_create_collision_object ${PROJECT_NAME}) +target_link_libraries(bt_demo ${PROJECT_NAME}) +target_link_libraries(bt_generate_place_pose ${PROJECT_NAME} ) +target_link_libraries(bt_joint_interpolation_solver ${PROJECT_NAME}) +target_link_libraries(bt_move_relative ${PROJECT_NAME}) +target_link_libraries(bt_move_to ${PROJECT_NAME}) +target_link_libraries(bt_pick_place ${PROJECT_NAME}) +target_link_libraries(bt_serial_container ${PROJECT_NAME}) +target_link_libraries(generate_xml_model ${PROJECT_NAME}) + + +add_subdirectory(tests) -if(BUILD_TESTING) - add_subdirectory(tests) -endif() install( DIRECTORY include/${PROJECT_NAME} DESTINATION include ) +install(DIRECTORY + config + launch + DESTINATION share/${PROJECT_NAME}/ +) + install(TARGETS bt_allow_collisions - bt_create_collision_object bt_compute_ik + bt_create_collision_object bt_demo bt_generate_place_pose bt_joint_interpolation_solver bt_move_relative bt_move_to + bt_pick_place bt_serial_container + generate_xml_model DESTINATION lib/${PROJECT_NAME} ) diff --git a/README.md b/README.md index 384da12..4ff5e48 100644 --- a/README.md +++ b/README.md @@ -4,5 +4,26 @@ This project is compatible with version 4.X of [BehaviorTree.CPP](https://github.com/BehaviorTree/BehaviorTree.CPP). +It is recommanded that the [Moveit Task Constructor](https://github.com/moveit/moveit_task_constructor) library commit version `>=` [fdc06c3](https://github.com/moveit/moveit_task_constructor/commit/fdc06c3b9105dadec2f44ee3e4b3133986945e86). This is to ensure that one can preempt a plan gracefully. + +## Demo +Check the available [examples](./examples). + +Running the Pick and Place MTC demo using BT's: + +``` sh +# In one terminal +$ ros2 launch moveit_task_constructor_demo demo.launch.py +# ALTERNATE: Use the one supplied with MTC +# Don't forget to change the task solution topic + +# In another terminal +$ ros2 launch behaviortree_mtc run.launch.py + + +# OPTIONAL: Connect from Groot2 to visualize the BT's on port 1667 +$ ros2 launch behaviortree_mtc run.launch.py delay_ms:=5000 +``` + ## Roadmap -We plan to release version `1.0.0` by the end of summer 2024. Check the [roadmap](https://github.com/captain-yoshi/BehaviorTree.MTC/issues/15) for more details. +We plan to release version `1.0.0` by the end of Christmas 2024. Check the [roadmap](https://github.com/captain-yoshi/BehaviorTree.MTC/issues/15) for more details. diff --git a/config/bt_mtc_model.xml b/config/bt_mtc_model.xml new file mode 100644 index 0000000..c6a8e09 --- /dev/null +++ b/config/bt_mtc_model.xml @@ -0,0 +1,269 @@ + + + + + + + + allow/forbid all collisions for given object/s + + ModifyPlanningScene stage + + + second object of collision pair + first object of collision pair + + ModifyPlanningScene stage + + + joint model group name + allow/forbid collisions with joint model group links + + MTC task + ModifyPlanningScene stage + + + + + Name for property initialization sources. {DEFAULT, MANUAL, PARENT, INTERFACE} + + + step size between consecutive waypoints + Planner interface using pipeline motion solver + linear and rotational precision + fraction of motion required for success + scale down max acceleration by this factor + scale down max velocity by this factor + + + + minimum distance between seperate IK solutions for the same target + + + max ik solutions + ignore collisions, true or false + name of active group (derived from eef if not provided) + name of end-effector + + + + 0 = SEQUENTIAL, 1 = WAYPOINTS + + connect + + maximally accepted joint configuration distance between trajectory endpoint and goal state + timeout + Connect stage + + + MoveIt Task Constructor stage. + + + GenerateGraspPose Stage + + + pregrasp posture + object on which we generate the grasp poses + angular steps (rad) + rotate object pose about given axis + name of end-effector + + + GenerateGraspPose Stage + target pose to pass on in spawned states + allow placing objects upside down + + + object on which we generate the place poses + + + plan using simple interpolation in joint-space + max joint step + scale down max acceleration by this factor + scale down max velocity by this factor + + + ModifyPlanningScene stage + list of object names/id's. + attach or detach a list of objects to the given link + + + + ModifyPlanningScene stage + list of object names/id's. + attach or detach a list of objects to the given link + + + + MoveRelative stage + planner interface + move specified joint variables by given amount + maximum distance to move + frame to be moved in Cartesian direction + minimum distance to move + + name of planning group + stage name + + + MoveRelative stage + planner interface + translate link along given direction + maximum distance to move + frame to be moved in Cartesian direction + minimum distance to move + + name of planning group + stage name + + + MoveRelative stage + planner interface + perform twist motion on specified link + maximum distance to move + frame to be moved in Cartesian direction + minimum distance to move + + name of planning group + stage name + + + move joints by name to their mapped target value + stage name + name of planning group + + planner interface + MoveTo stage + + + move joint model group to given named pose + stage name + name of planning group + + planner interface + MoveTo stage + + + move link to given point, keeping current orientation + frame to be moved in Cartesian direction + stage name + name of planning group + + planner interface + MoveTo stage + + + move link to a given pose + frame to be moved in Cartesian direction + stage name + name of planning group + + planner interface + MoveTo stage + + + scale down max acceleration by this factor + number of planning attempts + + scale down max velocity by this factor + + publish generated solutions on topic display_planned_path + tolerance for reaching orientation goals + tolerance for reaching position goals + tolerance for reaching joint goals + publish motion planning requests on topic motion_plan_request + Planner interface using pipeline motion solver + + + serial container + serial container name + + + {planning_scene_interface} + + + allow/forbid all collisions for given object/s + + ModifyPlanningScene stage + + + second object of collision pair + first object of collision pair + + ModifyPlanningScene stage + + + joint model group name + allow/forbid collisions with joint model group links + + MTC task + ModifyPlanningScene stage + + + + + + + + + + + + + + + + + + + + + + + + + MTC stage raw pointer + MTC stage + + + MoveIt Task Constructor task. + + + Box's size along Z axis (m) + Box's size along X axis (m) + + + + Box's size along Y axis (m) + + + + cylinder height (m) + + + + cylinder radius (m) + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/bt_allow_collisions.cpp b/examples/bt_allow_collisions.cpp index d52ab61..076c2e2 100644 --- a/examples/bt_allow_collisions.cpp +++ b/examples/bt_allow_collisions.cpp @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include #include @@ -62,23 +62,23 @@ static const char* xml_text = R"( collision_object="{cylinder}" /> - + - + - + - + @@ -95,19 +95,18 @@ int main(int argc, char** argv) // Declare parameters passed by a launch file options.automatically_declare_parameters_from_overrides(true); - auto node = rclcpp::Node::make_shared("test_behavior_tree", options); + auto node = rclcpp::Node::make_shared("bt_mtc_demo", options); BehaviorTreeFactory factory; - factory.registerNodeType("GeometryMsgsPose"); factory.registerNodeType("MoveItMsgsCollisionObjectCylinder"); factory.registerNodeType("MoveItMsgsCollisionObjectBox"); factory.registerNodeType("CreatePlanningSceneInterface"); factory.registerNodeType("AddObjectToPlanningScene"); - factory.registerNodeType("MoveMTCStageToContainer"); factory.registerNodeType("InitializeMTCTask", BT::RosNodeParams(node)); factory.registerNodeType("CreateMTCCurrentState"); factory.registerNodeType("CreateMTCPipelinePlanner", BT::RosNodeParams(node)); + factory.registerNodeType>("MoveMTCStageToTask"); factory.registerNodeType("PlanMTCTask"); factory.registerNodeType("AllowCollisionPairs"); factory.registerNodeType("ForbidAllCollisions"); @@ -127,12 +126,16 @@ int main(int argc, char** argv) BT::FileLogger2 logger2(tree, "t12_logger2.btlog"); // Gives the user time to connect to Groot2 - int wait_time = 5000; - std::cout << "Waiting " << wait_time << " msec for connection with Groot2...\n\n" - << std::endl; - std::cout << "======================" << std::endl; - std::this_thread::sleep_for(std::chrono::milliseconds(wait_time)); - + int delay_ms = node->get_parameter("delay_ms").as_int(); + if(delay_ms) + { + std::cout << "Waiting " << delay_ms << " msec for connection with Groot2...\n\n" + << std::endl; + std::cout << "======================" << std::endl; + std::this_thread::sleep_for(std::chrono::milliseconds(delay_ms)); + } + + // Start ticking the Tree std::cout << "Starting Behavior Tree" << std::endl; std::cout << "======================" << std::endl; diff --git a/examples/bt_compute_ik.cpp b/examples/bt_compute_ik.cpp index 0f75809..4f90af2 100644 --- a/examples/bt_compute_ik.cpp +++ b/examples/bt_compute_ik.cpp @@ -2,8 +2,7 @@ #include #include -#include -#include +#include #include #include #include @@ -69,33 +68,33 @@ static const char* xml_text = R"( collision_object="{cylinder}" /> - + - + - + - - + + - + @@ -107,7 +106,7 @@ static const char* xml_text = R"( direction="{tcp_translate}" min_distance="0.1" max_distance="0.15" /> - + - - + + @@ -144,10 +143,9 @@ int main(int argc, char** argv) // Declare parameters passed by a launch file options.automatically_declare_parameters_from_overrides(true); - auto node = rclcpp::Node::make_shared("test_behavior_tree", options); + auto node = rclcpp::Node::make_shared("bt_mtc_demo", options); BehaviorTreeFactory factory; - factory.registerNodeType("GeometryMsgsPose"); factory.registerNodeType("GeometryMsgsPoseStamped"); factory.registerNodeType("GeometryMsgsVector3Stamped"); @@ -156,7 +154,6 @@ int main(int argc, char** argv) factory.registerNodeType("CreatePlanningSceneInterface"); factory.registerNodeType("AddObjectToPlanningScene"); factory.registerNodeType("CreateMTCGenerateGraspPose"); - factory.registerNodeType("MoveMTCStageToContainer"); factory.registerNodeType("InitializeMTCTask", BT::RosNodeParams(node)); factory.registerNodeType("CreateMTCCurrentState"); factory.registerNodeType("CreateMTCPipelinePlanner", BT::RosNodeParams(node)); @@ -164,7 +161,9 @@ int main(int argc, char** argv) factory.registerNodeType("GetMTCRawStage"); factory.registerNodeType("CreateMTCMoveToNamedJointPose"); factory.registerNodeType("CreateMTCConnect"); - factory.registerNodeType("MoveMTCContainerToParentContainer"); + factory.registerNodeType>("MoveMTCStageToContainer"); + factory.registerNodeType>("MoveMTCStageToTask"); + factory.registerNodeType>("MoveMTCContainerToTask"); factory.registerNodeType("CreateMTCSerialContainer"); factory.registerNodeType("CreateMTCMoveRelativeTranslate"); factory.registerNodeType("CreateMTCComputeIK"); @@ -185,12 +184,16 @@ int main(int argc, char** argv) BT::FileLogger2 logger2(tree, "t12_logger2.btlog"); // Gives the user time to connect to Groot2 - int wait_time = 5000; - std::cout << "Waiting " << wait_time << " msec for connection with Groot2...\n\n" - << std::endl; - std::cout << "======================" << std::endl; - std::this_thread::sleep_for(std::chrono::milliseconds(wait_time)); - + int delay_ms = node->get_parameter("delay_ms").as_int(); + if(delay_ms) + { + std::cout << "Waiting " << delay_ms << " msec for connection with Groot2...\n\n" + << std::endl; + std::cout << "======================" << std::endl; + std::this_thread::sleep_for(std::chrono::milliseconds(delay_ms)); + } + + // Start ticking the Tree std::cout << "Starting Behavior Tree" << std::endl; std::cout << "======================" << std::endl; diff --git a/examples/bt_create_collision_object.cpp b/examples/bt_create_collision_object.cpp index 46a7cb4..5cb8fb5 100644 --- a/examples/bt_create_collision_object.cpp +++ b/examples/bt_create_collision_object.cpp @@ -1,9 +1,5 @@ #include -#include -#include -#include -#include #include #include #include @@ -65,10 +61,9 @@ int main(int argc, char** argv) // Declare parameters passed by a launch file options.automatically_declare_parameters_from_overrides(true); - auto node = rclcpp::Node::make_shared("test_behavior_tree", options); + auto node = rclcpp::Node::make_shared("bt_mtc_demo", options); BehaviorTreeFactory factory; - factory.registerNodeType("GeometryMsgsPose"); factory.registerNodeType("MoveItMsgsCollisionObjectCylinder"); factory.registerNodeType("MoveItMsgsCollisionObjectBox"); @@ -89,12 +84,16 @@ int main(int argc, char** argv) BT::FileLogger2 logger2(tree, "t12_logger2.btlog"); // Gives the user time to connect to Groot2 - int wait_time = 5000; - std::cout << "Waiting " << wait_time << " msec for connection with Groot2...\n\n" - << std::endl; - std::cout << "======================" << std::endl; - std::this_thread::sleep_for(std::chrono::milliseconds(wait_time)); - + int delay_ms = node->get_parameter("delay_ms").as_int(); + if(delay_ms) + { + std::cout << "Waiting " << delay_ms << " msec for connection with Groot2...\n\n" + << std::endl; + std::cout << "======================" << std::endl; + std::this_thread::sleep_for(std::chrono::milliseconds(delay_ms)); + } + + // Start ticking the Tree std::cout << "Starting Behavior Tree" << std::endl; std::cout << "======================" << std::endl; diff --git a/examples/bt_demo.cpp b/examples/bt_demo.cpp index e21ae25..f648804 100644 --- a/examples/bt_demo.cpp +++ b/examples/bt_demo.cpp @@ -1,8 +1,8 @@ #include -#include #include -#include +#include +#include #include #include "behaviortree_cpp/bt_factory.h" @@ -19,9 +19,9 @@ static const char* xml_text = R"( - + - + @@ -37,13 +37,13 @@ int main(int argc, char** argv) // Declare parameters passed by a launch file options.automatically_declare_parameters_from_overrides(true); - auto node = rclcpp::Node::make_shared("test_behavior_tree", options); + auto node = rclcpp::Node::make_shared("bt_mtc_demo", options); BehaviorTreeFactory factory; factory.registerNodeType("InitializeMTCTask", BT::RosNodeParams(node)); factory.registerNodeType("CreateMTCCurrentState"); - factory.registerNodeType("MoveMTCStageToContainer"); + factory.registerNodeType>("MoveMTCStageToTask"); factory.registerNodeType("PlanMTCTask"); auto tree = factory.createTreeFromText(xml_text); @@ -60,11 +60,14 @@ int main(int argc, char** argv) BT::FileLogger2 logger2(tree, "t12_logger2.btlog"); // Gives the user time to connect to Groot2 - int wait_time = 5000; - std::cout << "Waiting " << wait_time << " msec for connection with Groot2...\n\n" - << std::endl; - std::cout << "======================" << std::endl; - std::this_thread::sleep_for(std::chrono::milliseconds(wait_time)); + int delay_ms = node->get_parameter("delay_ms").as_int(); + if(delay_ms) + { + std::cout << "Waiting " << delay_ms << " msec for connection with Groot2...\n\n" + << std::endl; + std::cout << "======================" << std::endl; + std::this_thread::sleep_for(std::chrono::milliseconds(delay_ms)); + } NodeStatus status = NodeStatus::IDLE; diff --git a/examples/bt_generate_place_pose.cpp b/examples/bt_generate_place_pose.cpp index 3df58ce..8ff65c7 100644 --- a/examples/bt_generate_place_pose.cpp +++ b/examples/bt_generate_place_pose.cpp @@ -2,8 +2,7 @@ #include #include -#include -#include +#include #include #include #include @@ -72,7 +71,7 @@ static const char* xml_text = R"( collision_object="{cylinder}" /> - + - + - + - + @@ -107,7 +106,7 @@ static const char* xml_text = R"( direction="{tcp_translate}" min_distance="0.1" max_distance="0.15" /> - + - + - + - - + + - + - + - - + - - - - + + + - - - - + + + - + - - + + @@ -218,10 +217,9 @@ int main(int argc, char** argv) // Declare parameters passed by a launch file options.automatically_declare_parameters_from_overrides(true); - auto node = rclcpp::Node::make_shared("test_behavior_tree", options); + auto node = rclcpp::Node::make_shared("bt_mtc_demo", options); BehaviorTreeFactory factory; - factory.registerNodeType("GeometryMsgsPose"); factory.registerNodeType("GeometryMsgsPoseStamped"); factory.registerNodeType("GeometryMsgsVector3Stamped"); @@ -230,7 +228,6 @@ int main(int argc, char** argv) factory.registerNodeType("CreatePlanningSceneInterface"); factory.registerNodeType("AddObjectToPlanningScene"); factory.registerNodeType("CreateMTCGenerateGraspPose"); - factory.registerNodeType("MoveMTCStageToContainer"); factory.registerNodeType("InitializeMTCTask", BT::RosNodeParams(node)); factory.registerNodeType("CreateMTCCurrentState"); factory.registerNodeType("CreateMTCPipelinePlanner", BT::RosNodeParams(node)); @@ -238,7 +235,9 @@ int main(int argc, char** argv) factory.registerNodeType("GetMTCRawStage"); factory.registerNodeType("CreateMTCMoveToNamedJointPose"); factory.registerNodeType("CreateMTCConnect"); - factory.registerNodeType("MoveMTCContainerToParentContainer"); + factory.registerNodeType>("MoveMTCStageToContainer"); + factory.registerNodeType>("MoveMTCStageToTask"); + factory.registerNodeType>("MoveMTCContainerToTask"); factory.registerNodeType("CreateMTCSerialContainer"); factory.registerNodeType("CreateMTCMoveRelativeTranslate"); factory.registerNodeType("CreateMTCComputeIK"); @@ -266,12 +265,16 @@ int main(int argc, char** argv) BT::FileLogger2 logger2(tree, "t12_logger2.btlog"); // Gives the user time to connect to Groot2 - int wait_time = 5000; - std::cout << "Waiting " << wait_time << " msec for connection with Groot2...\n\n" - << std::endl; - std::cout << "======================" << std::endl; - std::this_thread::sleep_for(std::chrono::milliseconds(wait_time)); + int delay_ms = node->get_parameter("delay_ms").as_int(); + if(delay_ms) + { + std::cout << "Waiting " << delay_ms << " msec for connection with Groot2...\n\n" + << std::endl; + std::cout << "======================" << std::endl; + std::this_thread::sleep_for(std::chrono::milliseconds(delay_ms)); + } + // Start ticking the Tree std::cout << "Starting Behavior Tree" << std::endl; std::cout << "======================" << std::endl; @@ -297,70 +300,3 @@ int main(int argc, char** argv) return 0; } - -/** - * - - - - - - - - - - - - - - - - - - */ - -// - -// - -// -// -// -// -// diff --git a/examples/bt_joint_interpolation_solver.cpp b/examples/bt_joint_interpolation_solver.cpp index a5928cf..a364e64 100644 --- a/examples/bt_joint_interpolation_solver.cpp +++ b/examples/bt_joint_interpolation_solver.cpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include @@ -23,10 +23,10 @@ static const char* xml_text = R"( - + - + - - + + @@ -51,7 +51,7 @@ int main(int argc, char** argv) // Declare parameters passed by a launch file options.automatically_declare_parameters_from_overrides(true); - auto node = rclcpp::Node::make_shared("test_behavior_tree", options); + auto node = rclcpp::Node::make_shared("bt_mtc_demo", options); BehaviorTreeFactory factory; @@ -59,7 +59,7 @@ int main(int argc, char** argv) factory.registerNodeType("CreateMTCJointInterpolation"); factory.registerNodeType("CreateMTCCurrentState"); factory.registerNodeType("CreateMTCMoveRelativeJoint"); - factory.registerNodeType("MoveMTCStageToContainer"); + factory.registerNodeType>("MoveMTCStageToTask"); factory.registerNodeType("PlanMTCTask"); factory.registerNodeType("GeometryMsgsPoseStamped"); @@ -78,11 +78,16 @@ int main(int argc, char** argv) BT::FileLogger2 logger2(tree, "t12_logger2.btlog"); // Gives the user time to connect to Groot2 - int wait_time = 5000; - std::cout << "Waiting " << wait_time << " msec for connection with Groot2...\n\n" - << std::endl; - std::this_thread::sleep_for(std::chrono::milliseconds(wait_time)); - + int delay_ms = node->get_parameter("delay_ms").as_int(); + if(delay_ms) + { + std::cout << "Waiting " << delay_ms << " msec for connection with Groot2...\n\n" + << std::endl; + std::cout << "======================" << std::endl; + std::this_thread::sleep_for(std::chrono::milliseconds(delay_ms)); + } + + // Start ticking the Tree std::cout << "Starting Behavior Tree" << std::endl; std::cout << "======================" << std::endl; diff --git a/examples/bt_move_relative.cpp b/examples/bt_move_relative.cpp index 76b3d35..bab3807 100644 --- a/examples/bt_move_relative.cpp +++ b/examples/bt_move_relative.cpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include @@ -23,12 +23,12 @@ static const char* xml_text = R"( - + - + @@ -39,7 +39,7 @@ static const char* xml_text = R"( ik_frame="{ik_frame}" direction="{tcp_translate}" stage="{stage_move_rel_translate}" /> - + @@ -50,7 +50,7 @@ static const char* xml_text = R"( ik_frame="{ik_frame}" direction="{tcp_twist}" stage="{stage_move_rel_twist}" /> - + @@ -60,7 +60,7 @@ static const char* xml_text = R"( ik_frame="{ik_frame}" direction="panda_joint7:-1.57079632679" stage="{stage_move_rel_joint}" /> - + @@ -78,7 +78,7 @@ int main(int argc, char** argv) // Declare parameters passed by a launch file options.automatically_declare_parameters_from_overrides(true); - auto node = rclcpp::Node::make_shared("test_behavior_tree", options); + auto node = rclcpp::Node::make_shared("bt_mtc_demo", options); BehaviorTreeFactory factory; @@ -88,7 +88,7 @@ int main(int argc, char** argv) factory.registerNodeType("CreateMTCMoveRelativeTranslate"); factory.registerNodeType("CreateMTCMoveRelativeTwist"); factory.registerNodeType("CreateMTCMoveRelativeJoint"); - factory.registerNodeType("MoveMTCStageToContainer"); + factory.registerNodeType>("MoveMTCStageToTask"); factory.registerNodeType("PlanMTCTask"); factory.registerNodeType("GeometryMsgsPoseStamped"); @@ -109,11 +109,16 @@ int main(int argc, char** argv) BT::FileLogger2 logger2(tree, "t12_logger2.btlog"); // Gives the user time to connect to Groot2 - int wait_time = 5000; - std::cout << "Waiting " << wait_time << " msec for connection with Groot2...\n\n" - << std::endl; - std::this_thread::sleep_for(std::chrono::milliseconds(wait_time)); - + int delay_ms = node->get_parameter("delay_ms").as_int(); + if(delay_ms) + { + std::cout << "Waiting " << delay_ms << " msec for connection with Groot2...\n\n" + << std::endl; + std::cout << "======================" << std::endl; + std::this_thread::sleep_for(std::chrono::milliseconds(delay_ms)); + } + + // Start ticking the Tree std::cout << "Starting Behavior Tree" << std::endl; std::cout << "======================" << std::endl; diff --git a/examples/bt_move_to.cpp b/examples/bt_move_to.cpp index 3617440..d7ce64f 100644 --- a/examples/bt_move_to.cpp +++ b/examples/bt_move_to.cpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include @@ -23,12 +23,12 @@ static const char* xml_text = R"( - + - + - + + - + - + @@ -61,9 +62,9 @@ static const char* xml_text = R"( ik_frame="{ik_frame}" goal="{goal_pose}" stage="{stage_move_to_pose}" /> - + - + - + @@ -87,7 +88,7 @@ int main(int argc, char** argv) // Declare parameters passed by a launch file options.automatically_declare_parameters_from_overrides(true); - auto node = rclcpp::Node::make_shared("test_behavior_tree", options); + auto node = rclcpp::Node::make_shared("bt_mtc_demo", options); BehaviorTreeFactory factory; @@ -98,7 +99,7 @@ int main(int argc, char** argv) factory.registerNodeType("CreateMTCMoveToJoint"); factory.registerNodeType("CreateMTCMoveToPose"); factory.registerNodeType("CreateMTCMoveToPoint"); - factory.registerNodeType("MoveMTCStageToContainer"); + factory.registerNodeType>("MoveMTCStageToTask"); factory.registerNodeType("PlanMTCTask"); factory.registerNodeType("GeometryMsgsPoseStamped"); @@ -118,12 +119,16 @@ int main(int argc, char** argv) BT::FileLogger2 logger2(tree, "t12_logger2.btlog"); // Gives the user time to connect to Groot2 - int wait_time = 5000; - - std::cout << "Waiting " << wait_time << " msec for connection with Groot2...\n\n" - << std::endl; - std::this_thread::sleep_for(std::chrono::milliseconds(wait_time)); - + int delay_ms = node->get_parameter("delay_ms").as_int(); + if(delay_ms) + { + std::cout << "Waiting " << delay_ms << " msec for connection with Groot2...\n\n" + << std::endl; + std::cout << "======================" << std::endl; + std::this_thread::sleep_for(std::chrono::milliseconds(delay_ms)); + } + + // Start ticking the Tree std::cout << "Starting Behavior Tree" << std::endl; std::cout << "======================" << std::endl; diff --git a/examples/bt_pick_place.cpp b/examples/bt_pick_place.cpp new file mode 100644 index 0000000..81ceebc --- /dev/null +++ b/examples/bt_pick_place.cpp @@ -0,0 +1,395 @@ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "behaviortree_cpp/bt_factory.h" +#include "behaviortree_cpp/loggers/bt_file_logger_v2.h" +#include "behaviortree_cpp/loggers/groot2_publisher.h" + +using namespace BT; +using namespace BT::MTC; + +// clang-format off + +static const char* xml_text = R"( + + + + + + + +