ros2调用transform时遇到的奇怪错误

当我进行点的坐标系转换时,遇到了下面的奇怪错误:

Starting >>> normal_estimation
--- stderr: normal_estimation                                
In file included from /home/raoshuncai/ros2moveforplanning/src/normal_estimation/include/normal_estimation/normal_estimation_core.h:30,
                 from /home/raoshuncai/ros2moveforplanning/src/normal_estimation/src/normal_estimation_core.cpp:1:
/opt/ros/foxy/include/image_transport/image_transport.h:41:89: note: #pragma message: Warning: This header is deprecated. Use 'image_transport.hpp' instead
   41 | #pragma message ("Warning: This header is deprecated. Use 'image_transport.hpp' instead")
      |                                                                                         ^
/home/raoshuncai/ros2moveforplanning/src/normal_estimation/src/normal_estimation_core.cpp: In member functionvoid Normal_estimation::serial_cb(sensor_msgs::msg::PointCloud2_<std::allocator<void> >::SharedPtr):
/home/raoshuncai/ros2moveforplanning/src/normal_estimation/src/normal_estimation_core.cpp:45:37: warning: unused variable ‘cluster_indices’ [-Wunused-variable]
   45 |     std::vector<pcl::PointIndices>* cluster_indices = nullptr;//多个聚类结果的索引
      |                                     ^~~~~~~~~~~~~~~
/home/raoshuncai/ros2moveforplanning/src/normal_estimation/src/normal_estimation_core.cpp: In member functionvoid Normal_estimation::extract_box(std::vector<pcl::PointIndices>*, pcl::PointCloud<pcl::PointXYZ>::Ptr, pcl::PointCloud<pcl::PointXYZ>::Ptr, std::vector<Normal_estimation::Detected_Obj>&, geometry_msgs::msg::PoseStamped&, pcl::IndicesPtr):
/home/raoshuncai/ros2moveforplanning/src/normal_estimation/src/normal_estimation_core.cpp:129:29: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<pcl::PointIndices>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
  129 |         for (int it = 0; it < cluster_indices->size(); it++)
      |                          ~~~^~~~~~~~~~~~~~~~~~~~~~~~~
/home/raoshuncai/ros2moveforplanning/src/normal_estimation/src/normal_estimation_core.cpp:454:44: warning: unused variable ‘z’ [-Wunused-variable]
  454 |                                     double z = point_normal->at(0).normal_z;
      |                                            ^
/usr/bin/ld: CMakeFiles/normal_estimation_node_A.dir/src/normal_estimation_core.cpp.o: in function `geometry_msgs::msg::PoseStamped_ >& tf2_ros::BufferInterface::transform > >(geometry_msgs::msg::PoseStamped_ > const&, geometry_msgs::msg::PoseStamped_ >&, std::__cxx11::basic_string, std::allocator > const&, std::chrono::duration >) const':
normal_estimation_core.cpp:(.text._ZNK7tf2_ros15BufferInterface9transformIN13geometry_msgs3msg12PoseStamped_ISaIvEEEEERT_RKS7_S8_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENSt6chrono8durationIlSt5ratioILl1ELl1000000000EEEE[_ZNK7tf2_ros15BufferInterface9transformIN13geometry_msgs3msg12PoseStamped_ISaIvEEEEERT_RKS7_S8_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENSt6chrono8durationIlSt5ratioILl1ELl1000000000EEEE]+0x5a): undefined reference to `std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > tf2::getTimestamp<geometry_msgs::msg::PoseStamped_<std::allocator<void> > >(geometry_msgs::msg::PoseStamped_<std::allocator<void> > const&)'
/usr/bin/ld: normal_estimation_core.cpp:(.text._ZNK7tf2_ros15BufferInterface9transformIN13geometry_msgs3msg12PoseStamped_ISaIvEEEEERT_RKS7_S8_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENSt6chrono8durationIlSt5ratioILl1ELl1000000000EEEE[_ZNK7tf2_ros15BufferInterface9transformIN13geometry_msgs3msg12PoseStamped_ISaIvEEEEERT_RKS7_S8_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENSt6chrono8durationIlSt5ratioILl1ELl1000000000EEEE]+0x7a): undefined reference to `std::__cxx11::basic_string, std::allocator > tf2::getFrameId > >(geometry_msgs::msg::PoseStamped_ > const&)'
/usr/bin/ld: normal_estimation_core.cpp:(.text._ZNK7tf2_ros15BufferInterface9transformIN13geometry_msgs3msg12PoseStamped_ISaIvEEEEERT_RKS7_S8_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENSt6chrono8durationIlSt5ratioILl1ELl1000000000EEEE[_ZNK7tf2_ros15BufferInterface9transformIN13geometry_msgs3msg12PoseStamped_ISaIvEEEEERT_RKS7_S8_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENSt6chrono8durationIlSt5ratioILl1ELl1000000000EEEE]+0xcf): undefined reference to `void tf2::doTransform<geometry_msgs::msg::PoseStamped_<std::allocator<void> > >(geometry_msgs::msg::PoseStamped_<std::allocator<void> > const&, geometry_msgs::msg::PoseStamped_<std::allocator<void> >&, geometry_msgs::msg::TransformStamped_<std::allocator<void> > const&)'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/normal_estimation_node_A.dir/build.make:386: normal_estimation_node_A] Error 1
make[1]: *** [CMakeFiles/Makefile2:131: CMakeFiles/normal_estimation_node_A.dir/all] Error 2
make: *** [Makefile:141: all] Error 2
---
Failed   <<< normal_estimation [16.3s, exited with code 2]

Summary: 0 packages finished [16.4s]
  1 package failed: normal_estimation
  1 package had stderr output: normal_estimation

这就感觉很无奈,查来查去,终于在这篇博客中找到了问题的答案:
ROS入门教程-理论与实践(5.1.2 静态坐标变换)
原来必须加入下面的头文件才能调用transform函数:

#include <tf2_geometry_msgs/tf2_geometry_msgs.h> 

这样使用下面的代码就和ros1版本的plistener->transformPoint(“odom”,laser_point,base_point)函数一样了:

geometry_msgs::msg::PoseStamped base_point;
base_point = tf_buffer_->transform(laser_point,"odom");  

你可能感兴趣的:(ros2,foxy,ubuntu)