0. 实验环境
1)PC:虚拟机
2)OS:ubuntu22.04
2) ROS:ros2, humble
3)激光扫描器:速腾聚创RS16,16线
1. 问题描述:
在ROS2中,为了使用速腾聚创RS16激光扫描器进行rviz2的点云展示。使用了速腾聚创官网提供的驱动包driver,然后,使用如下命令进行编译。
colcon build --packages-select rslidar-sdk rslidar-msg
其中rslidar_msg能正常编译,而rslidar_sdk报错,如下所示:
部分输出结果如下:
Starting >>> rslidar_msg
Finished <<< rslidar_msg [0.76s]
Starting >>> rslidar_sdk
--- stderr: rslidar_sdk
=============================================================
-- POINT_TYPE is XYZI
=============================================================
=============================================================
-- ROS Not Found. ROS Support is turned Off.
=============================================================
=============================================================
-- ROS2 Found. ROS2 Support is turned On.
=============================================================
=============================================================
-- CMake run for UNIX GNU Compiler
=============================================================
=============================================================
-- rs_driver Version : v1.5.7
=============================================================
In file included from /opt/ros/humble/include/rclcpp/rclcpp/callback_group.hpp:23,
from /opt/ros/humble/include/rclcpp/rclcpp/any_executable.hpp:20,
from /opt/ros/humble/include/rclcpp/rclcpp/memory_strategy.hpp:25,
from /opt/ros/humble/include/rclcpp/rclcpp/memory_strategies.hpp:18,
from /opt/ros/humble/include/rclcpp/rclcpp/executor_options.hpp:20,
from /opt/ros/humble/include/rclcpp/rclcpp/executor.hpp:37,
from /opt/ros/humble/include/rclcpp/rclcpp/executors/multi_threaded_executor.hpp:25,
from /opt/ros/humble/include/rclcpp/rclcpp/executors.hpp:21,
from /opt/ros/humble/include/rclcpp/rclcpp/rclcpp.hpp:155,
from /home/xiao/ros2_ws/src/rslidar_sdk/node/rslidar_sdk_node.cpp:42:
/opt/ros/humble/include/rclcpp/rclcpp/client.hpp:786:36: error: ‘variant’ in namespace ‘std’ does not name a template type
786 | using CallbackInfoVariant = std::variant<
| ^~~~~~~
/opt/ros/humble/include/rclcpp/rclcpp/client.hpp:786:31: note: ‘std::variant’ is only available from C++17 onwards
786 | using CallbackInfoVariant = std::variant<
| ^~~
/opt/ros/humble/include/rclcpp/rclcpp/client.hpp:792:52: error: ‘CallbackInfoVariant’ has not been declared
792 | async_send_request_impl(const Request & request, CallbackInfoVariant value)
| ^~~~~~~~~~~~~~~~~~~
/opt/ros/humble/include/rclcpp/rclcpp/client.hpp:808:8: error: ‘optional’ in namespace ‘std’ does not name a template type
808 | std::optional<CallbackInfoVariant>
| ^~~~~~~~
2. 解决问题的思路
我们发现有大量关于std命名空间不存在的变量冒出来,第一反应是程序中未正确引用头文件。这与下面方法1的思路相同,但是并没有解决问题。后来仔细看错误提示,有一句“note: ‘std::variant’ is only available from C++17 onwards”才想到方法2。
扫描二维码关注公众号,回复:
15380357 查看本文章
1)【无效】搜索“xxx“ in namespace “std‘ does not name a type的通用解决方法,无效。
2)【成功】可能是编译器的版本太低,尝试修改rslidar_sdk驱动包里的CMakeList.txt,重新将原来的add_definitions(-std=c++14)改成如下形式。
add_definitions(-std=c++17)
修改之后,可正常编译。结果如下:
3. 最后的话
经过这件事后,有两点启发:
1)在编程调试阶段,先从错误提示开始,能有效地锁定问题点。注意不要产生畏难情绪!
2)在自己编程的时候,也要尽量提供详细的错误提示或信息导引,提高软件质量。