nav2 单独编译遇到的问题
本文总结了在编译nav2导航包时遇到的问题,主要包括下列参数:nav2_constrained_smoother包中prelast_dirnav_2d_utils库中valuebehavior_server中transform_toleranceinput_at_waypoint插件中timeoutnav2_smoother中transform_toleranceplanner_server中ex
问题汇总
前言
在使用 nav2 包的时候,直接 apt install 命令安装的库是在/opt/ros/humble目录下,不方便本地修改编译,因此采用 git clone 下载再编译的方式。

问题一
在编译 nav2_mppi_controller 包的时候
依赖的nav2_constrained_smoother包编译出现问题
问题根源分析
错误信息的核心是:error: ... ‘prelast_dir’ may be used uninitialized [-Werror=maybe-uninitialized]
1.变量未初始化: 在 nav2_constrained_smoother的代码中(具体在 smoother.hpp第295行),定义了一个 Eigen::Vector2d类型的变量 prelast_dir。
解决方法
初始化变量(推荐,最根本的修复):这是最正确、最根本的解决方法。你需要修改源代码,在定义 prelast_dir时就给它一个初始值,通常是零向量。
1.找到源文件:
根据错误信息,文件路径是:
/home/gg/xcg/sim_nav_ws/src/nav2/src/nav2_constrained_smoother/include/nav2_constrained_smoother/smoother.hpp
2.修改代码:
找到第295行左右的代码:
Eigen::Vector2d prelast_dir;
将其修改为:
Eigen::Vector2d prelast_dir = Eigen::Vector2d::Zero(); // 初始化为 (0, 0)
或者更简洁的 C++11 写法:
Eigen::Vector2d prelast_dir {0.0, 0.0};
报错截图


问题二
问题根源分析
错误的核心信息是:error: ‘value’ may be used uninitialized [-Werror=maybe-uninitialized]
1.位置: 错误发生在 nav_2d_utils库的 parameters.hpp头文件中(第67行),该头文件被 dwb_plugins包中的 limited_accel_generator.cpp文件所包含。
2.具体代码: 在函数 nav_2d_utils::searchAndGetParam中,声明了一个 double类型的变量 value,但没有初始化。随后,这个未初始化的 value被传递给 node->get_parameter(…)方法。
3.编译器逻辑: 编译器无法百分百确定 get_parameter函数一定会成功地为 value赋值。如果 get_parameter因某种原因失败(例如参数不存在且没有默认值处理逻辑),那么 value就会保持未初始化的状态,后续的使用就会导致未定义行为。因此,编译器发出了“可能未初始化”的警告,并被 -Werror升级为错误。
解决方法
修复源代码(推荐)这是最根本的解决方法。我们需要修改 nav_2d_utils库中的代码。
1.找到源文件:
错误信息给出了文件路径:
/home/gg/xcg/sim_nav_ws/src/nav2/src/nav2_dwb_controller/nav_2d_utils/include/nav_2d_utils/parameters.hpp
2.修改代码:
打开 parameters.hpp,找到第67行左右的函数模板 searchAndGetParam。对于 double类型特化的版本,或者通用的实现中,你会看到类似这样的代码:
param_t value; // 这就是未初始化的变量
node->get_parameter(name, value);
将其修改为:
param_t value = default_value; // 或者 param_t value {}; 初始化为0
node->get_parameter(name, value)
报错截图


问题三
问题分析
错误信息明确指出:error: ‘transform_tolerance’ may be used uninitialized [-Werror=maybe-uninitialized]
1.位置: nav2_behaviors/src/behavior_server.cpp第80行
2.变量: double transform_tolerance;声明但未初始化
3.使用: 在第83行,这个未初始化的变量被传递给 get_parameter()方法
解决方法
修复源代码(推荐)
1.找到并编辑文件:
/home/gg/xcg/sim_nav_ws/src/nav2/src/nav2_behaviors/src/behavior_server.cpp
2.修改代码:
找到第80行左右的代码:
double transform_tolerance;
将其修改为:
double transform_tolerance = 0.1; // 或者一个合理的默认值,如 0.1
或者更保守地初始化为0:
double transform_tolerance = 0.0;
报错截图


问题四
问题分析
错误信息明确指出:error: 'timeout' may be used uninitialized [-Werror=maybe-uninitialized]
1.位置: nav2_waypoint_follower/plugins/input_at_waypoint.cpp第52行
2.变量: double timeout;声明但未初始化
3.使用: 在第63行,这个未初始化的变量被传递给 get_parameter()方法
解决方法
1.找到并编辑文件:
/home/gg/xcg/sim_nav_ws/src/nav2/src/nav2_waypoint_follower/plugins/input_at_waypoint.cpp
2.修改代码:
找到第52行左右的代码:
double timeout;
将其修改为:
double timeout = 10.0; // 设置一个合理的默认超时值,如10秒
报错截图


问题五
问题分析
错误信息明确指出:error: ‘transform_tolerance’ may be used uninitialized [-Werror=maybe-uninitialized]
1.位置: nav2_smoother/src/nav2_smoother.cpp第88行
2.变量: double transform_tolerance;声明但未初始化
3.使用: 在第91行,这个未初始化的变量被传递给 get_parameter()方法
解决方法
1.找到并编辑文件:
/home/gg/xcg/sim_nav_ws/src/nav2/src/nav2_smoother/src/nav2_smoother.cpp
2.修改代码:
找到第88行左右的代码:
double transform_tolerance;
将其修改为:
double transform_tolerance = 0.1; // 设置一个合理的默认值


问题六
问题分析
错误信息明确指出:error: 'expected_planner_frequency' may be used uninitialized [-Werror=maybe-uninitialized]
1.位置: nav2_planner/src/planner_server.cpp第126行
2.变量: double expected_planner_frequency;声明但未初始化
3.使用: 在第127行,这个未初始化的变量被传递给 get_parameter()方法
解决方法
1.找到并编辑文件:
/home/gg/xcg/sim_nav_ws/src/nav2/src/nav2_planner/src/planner_server.cpp
2.修改代码:
找到第126行左右的代码:
double expected_planner_frequency;
将其修改为:
double expected_planner_frequency = 1.0; // 设置一个合理的默认频率值,如1.0Hz
报错截图

总结
全都是参数定义的时候没进行初始化的问题,c++编译要求严格导致!!
最终解决方案
鉴于您已经遇到六个完全相同的编译错误,我强烈建议您使用以下命令来完成整个项目的编译:
colcon build --cmake-args -DCMAKE_CXX_FLAGS="-Wno-error=maybe-uninitialized"
这个命令会:
1.一次性解决所有类似的"可能未初始化"警告导致的编译错误
2.允许编译过程继续完成
3.不会影响代码的实际功能
更多推荐



所有评论(0)