BehaviorTree.CPP v3从动态库加载叶节点
文章目录
问题汇总
找不到生成的包含叶节点的动态库
terminate called after throwing an instance of 'BT::RuntimeError'
what(): could not load library: libWaitActionBtNode.so: cannot open shared object file: No such file or directory
问题原因:
传递到BT::BehaviorTreeFactory::registerFromPlugin()
函数中的路径并不是绝对路径。
解决办法:
- 传递动态库的绝对路径(推荐)
- 或使用相对于执行位置的相对路径。
无法定位其他第三方依赖库的符号
terminate called after throwing an instance of 'BT::RuntimeError'
what(): could not load library: libWaitActionBtNode.so: undefined symbol: _ZN13rclcpp_action10ClientBase33get_number_of_ready_subscriptionsEv
问题原因:
在我的工程中,实际依赖了ROS2包rclcpp_action,但却没有在CMakeLists.txt中标明,这虽然没有在生成libWaitActionBtNode.so的时候报错,但是却在动态加载时出错。
解决办法:
CMakeLists.txt增加以下内容
find_package(rclcpp REQUIRED)
find_package(rclcpp_action REQUIRED)
让cmake查找依赖包,然后在add_library(WaitActionBtNode Shared src/action/WaitAction.cpp)
后添加
ament_target_dependencies(WaitActionBtNode
rclcpp
rclcpp_action
)
找不到叶节点导出符号BT_RegisterNodesFromPlugin
ERROR loading library: can't find symbol [BT_RegisterNodesFromPlugin]
问题原因
BehaviorTree规定,定义叶节点so库,需要调用一个宏BT_REGISTER_NODES
,原型如下
#