前言

在使用 nav2 包的时候,直接 apt install 命令安装的库是在/opt/ros/humble目录下,不方便本地修改编译,因此采用 git clone 下载再编译的方式。

navigation2 中文文档链接

在这里插入图片描述

问题一

在编译 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.不会影响代码的实际功能

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐