ROS2中编译RS16激光扫描器驱动包rslidar_sdk时报错error: ‘variant’ in namespace ‘std’ does not name a template type

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的通用解决方法,无效

error: “xxx“ in namespace “std‘ does not name a typeicon-default.png?t=M85Bhttps://blog.csdn.net/u010420283/article/details/112787685

2)【成功】可能是编译器的版本太低尝试修改rslidar_sdk驱动包里的CMakeList.txt,重新将原来的add_definitions(-std=c++14)改成如下形式。

add_definitions(-std=c++17)

修改之后,可正常编译。结果如下:

3. 最后的话

经过这件事后,有两点启发:

1)在编程调试阶段,先从错误提示开始,能有效地锁定问题点。注意不要产生畏难情绪!

2)在自己编程的时候,也要尽量提供详细的错误提示或信息导引,提高软件质量。

猜你喜欢

转载自blog.csdn.net/slampai/article/details/127734152
今日推荐