diff options
| -rw-r--r-- | as2-behaviors-perception.spec | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/as2-behaviors-perception.spec b/as2-behaviors-perception.spec index 7a7b31f..7d918c6 100644 --- a/as2-behaviors-perception.spec +++ b/as2-behaviors-perception.spec @@ -79,6 +79,97 @@ autonomous multi-aerial-robot systems. %prep %autosetup -n as2-behaviors-perception-%{version}-%{release_num} +# 兼容性修复:本地源码(main 分支)使用 as2::Node::getParameter<T>(...) 模板方法, +# 但已安装的 as2-core(旧版 tag)node.hpp 不含此方法。创建等价自由函数 +# as2_compat::getParameter 并替换所有调用点(3 文件 / 25 处)。 +python3 - << 'PYEOF' +import os, re + +base = "as2_behaviors/as2_behaviors_object_perception" + +# 1. 创建兼容头文件 +compat_path = os.path.join(base, "include/as2_behaviors_object_perception/as2_compat.hpp") +if not os.path.exists(compat_path): + with open(compat_path, 'w') as f: + f.write( + '#ifndef AS2_BEHAVIORS_OBJECT_PERCEPTION__AS2_COMPAT_HPP_\n' + '#define AS2_BEHAVIORS_OBJECT_PERCEPTION__AS2_COMPAT_HPP_\n' + '\n' + '#include <string>\n' + '#include <rclcpp/rclcpp.hpp>\n' + '\n' + 'namespace as2_compat {\n' + '\n' + 'template<typename T>\n' + 'T getParameter(rclcpp::Node * node, const std::string & name, const T & default_value)\n' + '{\n' + ' if (!node->has_parameter(name)) {\n' + ' node->declare_parameter<T>(name, default_value);\n' + ' }\n' + ' const rclcpp::Parameter parameter = node->get_parameter(name);\n' + ' return parameter.template get_value<T>();\n' + '}\n' + '\n' + 'template<typename T>\n' + 'T getParameter(rclcpp::Node * node, const std::string & name)\n' + '{\n' + ' if (!node->has_parameter(name)) {\n' + ' node->declare_parameter<T>(name);\n' + ' }\n' + ' const rclcpp::Parameter parameter = node->get_parameter(name);\n' + ' return parameter.template get_value<T>();\n' + '}\n' + '\n' + '} // namespace as2_compat\n' + '#endif // AS2_BEHAVIORS_OBJECT_PERCEPTION__AS2_COMPAT_HPP_\n' + ) + print("[fix] Created as2_compat.hpp") +else: + print("[fix] as2_compat.hpp already exists") + +# 2. 需要修改的文件 +patch_files = [ + os.path.join(base, "src/as2_behaviors_object_perception.cpp"), + os.path.join(base, "plugins/aruco/src/aruco.cpp"), + os.path.join(base, "include/as2_behaviors_object_perception/common/common.hpp"), +] + +# 3. 正则替换: <receiver>->getParameter<<type>>(<args>) +# => as2_compat::getParameter<<type>>(<receiver>, <args>) +pat = re.compile( + r'(\w+)->getParameter<((?:[^<>]|<[^<>]*>)*)>+\(([^)]*)\)' +) + +for fp in patch_files: + with open(fp) as f: + content = f.read() + + # 添加 include(在最后一个 #include 之后) + if 'as2_compat.hpp' not in content: + lines = content.split('\n') + last_inc = -1 + for i, ln in enumerate(lines): + if ln.strip().startswith('#include'): + last_inc = i + if last_inc >= 0: + lines.insert(last_inc + 1, '#include "as2_behaviors_object_perception/as2_compat.hpp"') + content = '\n'.join(lines) + + # 替换调用 + new_content, count = pat.subn( + lambda m: 'as2_compat::getParameter<' + m.group(2) + '>(' + m.group(1) + ', ' + m.group(3) + ')', + content + ) + + if count > 0: + with open(fp, 'w') as f: + f.write(new_content) + print("[fix] %s: replaced %d getParameter calls" % (fp, count)) + else: + print("[fix] %s: no getParameter calls found" % fp) + +PYEOF + %build # ROS 基座环境 [ -f /opt/ros/%{ros_distro}/setup.sh ] && source /opt/ros/%{ros_distro}/setup.sh || true |
