无人机避障——Mid360+Fast-lio感知建图+Ego-planner运动规划(胎教级教程)

电脑配置:Xavier-nx、ubuntu 18.04、ros melodic

激光雷达:Livox_Mid-360

结果展示:左边Mid360+Fast-lio感知建图,右边Ego-planner运动规划

1、读取雷达数据并显示

无人机避障——感知篇(采用Livox-Mid360激光雷达获取点云数据显示)-CSDN博客

看看雷达数据话题imu以及lidar两个话题 

2、读取雷达数据并复现fast-lio 

无人机避障——感知篇(采用Mid360复现Fast-lio)-CSDN博客

启动fast-lio,确保话题有输出 

 由于此处不需要建图,因此不打开rviz,launch文件如下修改:

<launch>
<!-- Launch file for Livox MID360 LiDAR -->

	<arg name="rviz" default="true" />

	<rosparam command="load" file="$(find fast_lio)/config/mid360.yaml" />

	<param name="feature_extract_enable" type="bool" value="0"/>
	 <!-- 100HZ的bag  point_filter_num建议设置为1;   10HZ的bag建议设置为2或3 -->
	<param name="point_filter_num" type="int" value="3"/>
	<param name="max_iteration" type="int" value="3" />
	<param name="filter_size_surf" type="double" value="0.5" />
	<param name="filter_size_map" type="double" value="0.5" />
	<param name="cube_side_length" type="double" value="1000" />
	<param name="runtime_pos_log_enable" type="bool" value="0" />
    <node pkg="fast_lio" type="fastlio_mapping" name="laserMapping" output="screen" /> 

	<!-- <group if="$(arg rviz)">
	<node launch-prefix="nice" pkg="rviz" type="rviz" name="rviz" args="-d $(find fast_lio)/rviz_cfg/loam_livox.rviz" />
	</group> -->

</launch>

然后运行:

roslaunch fast_lio mapping_mid360.launch

看一下话题:

rostopic list

[100%] Built target ego_planner_node /usr/bin/ld: CMakeFiles/random_forest.dir/src/random_forest_sensing.cpp.o: in function `RandomMapGenerate()': /home/dxinl/Fast-Drone-250/src/uav_simulator/map_generator/src/random_forest_sensing.cpp:152: undefined reference to `pcl::KdTreeFLANN<pcl::PointXYZ, flann::L2_Simple<float> >::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ> const> const&, boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&)' /usr/bin/ld: CMakeFiles/random_forest.dir/src/random_forest_sensing.cpp.o: in function `RandomMapGenerateCylinder()': /home/dxinl/Fast-Drone-250/src/uav_simulator/map_generator/src/random_forest_sensing.cpp:269: undefined reference to `pcl::KdTreeFLANN<pcl::PointXYZ, flann::L2_Simple<float> >::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ> const> const&, boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&)' /usr/bin/ld: CMakeFiles/random_forest.dir/src/random_forest_sensing.cpp.o:(.data.rel.ro._ZTVN3pcl11KdTreeFLANNINS_8PointXYZEN5flann9L2_SimpleIfEEEE[_ZTVN3pcl11KdTreeFLANNINS_8PointXYZEN5flann9L2_SimpleIfEEEE]+0x10): undefined reference to `pcl::KdTreeFLANN<pcl::PointXYZ, flann::L2_Simple<float> >::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ> const> const&, boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&)' /usr/bin/ld: CMakeFiles/random_forest.dir/src/random_forest_sensing.cpp.o:(.data.rel.ro._ZTVN3pcl11KdTreeFLANNINS_8PointXYZEN5flann9L2_SimpleIfEEEE[_ZTVN3pcl11KdTreeFLANNINS_8PointXYZEN5flann9L2_SimpleIfEEEE]+0x28): undefined reference to `pcl::KdTreeFLANN<pcl::PointXYZ, flann::L2_Simple<float> >::nearestKSearch(pcl::PointXYZ const&, int, std::vector<int, std::allocator<int> >&, std::vector<float, std::allocator<float> >&) const' collect2: error: ld returned 1 exit status make[2]: *** [uav_simulator/map_generator/CMakeFiles/random_forest.dir/build.make:329:/home/dxinl/Fast-Drone-250/devel/lib/map_generator/random_forest]
03-13
<think>好的,我现在需要解决用户在编译时遇到的undefined reference to 'pcl::KdTreeFLANN'链接错误。用户提到在调用setInputCloud函数时报错。首先,我应该回忆一下PCL库的使用和常见的链接错误原因。 根据用户提供的引用内容,特别是引用[1]和[3],可能的问题有几个方面。首先,用户可能没有正确链接PCL库中的相关模块。因为PCL是模块化的,每个模块需要单独链接。例如,KdTreeFLANN属于pcl_kdtree模块,所以编译时需要链接这个库。 另外,引用[1]提到PCL与OpenCV可能存在命名空间冲突,导致编译器找到错误的定义。这可以通过调整包含路径的顺序来解决,确保PCL的头文件在OpenCV之前被包含。用户可能需要检查项目的include目录顺序,把PCL的路径放在前面。 引用[3]指出,自定义点云类型时可能没有包含必要的实现文件。虽然用户的问题不是自定义点云,但类似的情况可能适用。例如,某些PCL模板类的实现可能分布在不同的头文件中,需要显式包含。例如,KdTreeFLANN可能在pcl/kdtree/kdtree_flann.h中声明,但实现需要包含特定的头文件或者链接对应的库。 接下来,用户的具体错误是链接阶段找不到pcl::KdTreeFLANN的成员函数,特别是setInputCloud。这可能意味着: 1. 没有正确链接pcl_kdtree库。在编译命令中需要加上-lpcl_kdtree。 2. 编译器没有找到模板的实现,可能需要显式实例化或者包含实现文件。 3. 头文件包含顺序问题,导致某些宏或命名空间被覆盖。 解决方案步骤可能包括: 1. 确保安装了正确版本的PCL库,并且开发环境配置正确。 2. 检查编译器的链接选项,确认是否链接了所有必需的PCL模块,如pcl_common, pcl_kdtree等。 3. 调整包含路径的顺序,让PCL的头文件优先于其他可能冲突的库,如OpenCV。 4. 检查代码中是否包含了必要的头文件,例如#include <pcl/kdtree/kdtree_flann.h>。 5. 对于模板类,可能需要显式实例化,或者确保实现文件被正确包含。例如,某些情况下需要包含对应的.hpp文件。 此外,用户提到在调用setInputCloud时报错,这个函数属于pcl::KdTreeFLANN类。所以需要确认是否正确地创了KdTreeFLANN对象,并且输入的点云类型正确。例如,如果点云类型是自定义的,可能需要更多的处理,但用户的问题可能不是自定义点云,而是常使用中的链接问题。 另外,查看引用[3]中的情况,自定义点云类型时由于未包含实现文件导致链接错误。虽然用户的问题可能不是自定义点云,但可能需要检查是否遗漏了某些实现头文件的包含,例如pcl/impl/pcl_base.hpp,但具体到KdTreeFLANN,可能需要不同的处理。 总结可能的解决步骤: 1. 确保CMakeLists.txt或编译命令正确链接了pcl_kdtree和其他相关库。 2. 调整头文件包含顺序,优先包含PCL头文件。 3. 检查是否遗漏了必要的头文件包含。 4. 确认PCL库的安装是否完整,特别是相关模块是否存在。 例如,在CMake中,需要找到PCL的组件并链接: find_package(PCL REQUIRED COMPONENTS common kdtree) target_link_libraries(my_target ${PCL_LIBRARIES}) 如果用户没有正确指定COMPONENTS,可能导致某些库没有被链接。此外,如果使用自定义点云类型,可能需要更多的步骤,但根据用户的问题描述,可能只是常链接问题。</think>要解决C++项目中使用PCL库时遇到的`undefined reference to 'pcl::KdTreeFLANN'`链接错误,需按以下步骤排查和修复: --- ### 1. **检查库依赖与链接顺序** PCL库采用模块化设计,`KdTreeFLANN`属于`pcl_kdtree`模块。若未正确链接该模块,会导致符号未定义错误。 - **在CMake中配置**:确保`CMakeLists.txt`包含以下内容: ```cmake find_package(PCL REQUIRED COMPONENTS common kdtree) target_link_libraries(你的项目名称 ${PCL_LIBRARIES}) ``` - **手动编译命令**:需添加`-lpcl_kdtree -lpcl_common`等依赖库,例如: ```bash g++ main.cpp -lpcl_kdtree -lpcl_common -lboost_system ``` --- ### 2. **调整头文件包含顺序** 若项目中同时使用OpenCV,可能因命名冲突导致编译器误解析函数定义[^1]。 - **解决方案**:在IDE(如Visual Studio)的包含目录中,将PCL的头文件路径置于OpenCV之前。 --- ### 3. **验证头文件包含** 确保代码中正确包含`KdTreeFLANN`的头文件: ```cpp #include <pcl/kdtree/kdtree_flann.h> ``` --- ### 4. **检查模板实例化** 对于模板类`KdTreeFLANN`,若使用自定义点云类型(如`CustomPoint`),需显式实例化模板或包含实现文件: ```cpp #include <pcl/impl/kdtree_flann.hpp> // 显式包含实现文件 ``` --- ### 5. **验证PCL安装完整性** 若上述步骤无效,可能是PCL库安装不完整。尝试重新安装PCL并确保包含`libpcl-kdtree`组件: ```bash sudo apt install libpcl-dev libpcl-kdtree-dev # Ubuntu/Debian ``` --- ### 示例代码验证 以下为正确使用`KdTreeFLANN`的最小示例: ```cpp #include <pcl/point_cloud.h> #include <pcl/kdtree/kdtree_flann.h> int main() { pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); pcl::KdTreeFLANN<pcl::PointXYZ> kdtree; kdtree.setInputCloud(cloud); // 此处应无报错 return 0; } ``` ---
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Perishell

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值