LeGo-LOAM源码篇:源码分析(3)

src/mapOptmization.cpp
整体功能分为回环检测、可视化以及位姿全局优化,核心是位姿优化。主体流程:订阅特征提取后的点云、里程计数据->计算当前姿态优化的初始值->提取局部关键帧->降采样->scan-to-map地图优化(线特征、面特征、L-M)->保存关键帧与因子图优化->闭环检测->发布TF变换、点云

int main(int argc, char** argv)
{
   
   
    ros::init(argc, argv, "lego_loam");
    ROS_INFO("\033[1;32m---->\033[0m Map Optimization Started.");
    mapOptimization MO;//订阅点云、里程计信息
    
    std::thread loopthread(&mapOptimization::loopClosureThread, &MO);//闭环检测线程
    std::thread visualizeMapThread(&mapOptimization::visualizeGlobalMapThread, &MO);//可视化线程

    ros::Rate rate(200);
    while (ros::ok())
    {
   
   
        ros::spinOnce();
        MO.run();//全局位姿优化
        rate.sleep();
    }
    
    loopthread.join();
    visualizeMapThread.join();
    
    return 0;
}

...
void run(){
   
   
    //三种点云、里程计信息时间戳一致
    if (newLaserCloudCornerLast  && std::abs(timeLaserCloudCornerLast  - timeLaserOdometry) < 0.005 &&
        newLaserCloudSurfLast    && std::abs(timeLaserCloudSurfLast    - timeLaserOdometry) < 0.005 &&
        newLaserCloudOutlierLast && std::abs(timeLaserCloudOutlierLast - timeLaserOdometry) < 0.005 &&
        newLaserOdometry)
    {
   
   

        newLaserCloudCornerLast = false; newLaserCloudSurfLast = false; newLaserCloudOutlierLast = false; newLaserOdometry = false;

        std::lock_guard<std::mutex> lock(mtx);
        //设置优化的间隔为0.3秒
        if (timeLaserOdometry - timeLastProcessing >= mappingProcessInterval) {
   
   

            timeLastProcessing = timeLaserOdometry;
            //将点云转换到世界坐标系
            //根据当前(transformSum)与上次全局优化时的里程计(transformBefMapped)、上次全局优化的结果(transformAftMapped),计算当前姿态优化(transformTobeMapped)的初始值
            transformAssociateToMap();                
            //根据当前位置,提取局部关键帧集合以及对应的点云集合
            extractSurroundingKeyFrames();
            //降采样
            downsampleCurrentScan();
            //scan-to-map配准优化,获得transformTobeMapped,参考IMU姿态获得最终位姿 transformAftMapped
            scan2MapOptimization();
            //保存关键帧与因子图优化
            saveKeyFramesAndFactor();
            //闭环检测
            correctPoses()
<think>嗯,用户遇到了CMake构建错误,提示“target pattern contains no &#39;%&#39;”,特别是在SC-LeGO-LOAM项目中。我需要先理解这个错误的常见原因。根据引用[3]和[4],这个问题通常与Makefile中的错误模式规则有关。可能的触发点包括路径中的空格或特殊字符,错误的变量引用,或者自定义构建规则中的错误。 首先,用户的项目涉及SC-LeGO-LOAM,这可能是一个ROS项目,使用catkin_make构建。用户提到的引用[1]和[2]中有关于编译步骤和文件修改的内容,比如修改utility.h中的话题名称,以及安装GTSAM。这些步骤是否可能引入错误呢? 比如,在引用[3]中,编译DBUS时出现同样的错误,问题出在CMakeLists.txt生成Makefile时,路径或规则中的错误。可能是在某些规则中使用了不正确的变量,比如缺少转义或者变量名错误,导致生成的目标模式缺少必要的%。 接下来,我需要考虑用户可能的操作步骤。用户可能按照引用[1]克隆了仓库,然后进行catkin_make,但在此过程中出现了错误。根据错误信息,检查CMakeLists.txt中的add_custom_command或add_custom_target是否有问题。比如,自定义命令中的输出或依赖路径可能包含空格,或者使用了不正确的语法,比如缺少$<TARGET_FILE_DIR:...>的变量引用。 另外,引用[4]提到在AURIX开发环境中,添加了错误的函数参数导致构建错误,这可能类比于用户在修改源码时(如修改pointCloudTopic或imuTopic)可能出现的配置错误,或者CMake文件中参数传递错误。 可能的解决方案包括检查CMakeLists.txt中的自定义规则,确保路径正确,转义特殊字符,尤其是处理空格。另外,确保所有变量正确展开,特别是在使用生成器表达式时。如果用户修改了某些文件路径,可能导致路径中包含空格,需要加上引号。 总结步骤:首先定位报错的CMakeLists.txt文件和具体行号,检查相关规则;处理路径中的特殊字符;验证自定义命令语法;更新CMake版本;清理构建目录后重新构建。同时,参考用户提供的引用中提到的utility.h修改是否影响了构建过程,或者是否在克隆仓库后有其他未注意的步骤导致路径问题。</think>针对CMake构建时出现的`target pattern contains no &#39;%&#39;`错误,该问题通常由Makefile生成过程中路径格式异常或自定义规则语法错误引发。以下是具体分析及解决方案: --- ### **错误原因分析** 1. **路径中的特殊字符或空格** CMake生成的Makefile若遇到包含空格或未转义特殊字符(如`#`、`%`)的路径,会导致模式规则解析失败。例如路径`/home/user/my project/`中的空格可能被误解析为多个参数[^3][^4]。 2. **自定义构建规则语法错误** 在`CMakeLists.txt`中使用`add_custom_command`或`add_custom_target`时,若输出文件路径未正确使用`$<TARGET_FILE_DIR:target>`变量,或缺少必要的转义符(如`$`需写为`$$`),会导致生成无效的Makefile规则[^3][^4]。 3. **变量未正确展开** 使用`${VAR}`格式引用变量时,若变量值为空或未正确定义,可能生成不完整的命令参数,进而破坏Makefile语法结构。 --- ### **解决方案步骤** 1. **定位错误位置** 通过错误日志中的行号(如`doc/CMakeFiles/dbus-test-plan.html.dir/build.make:51`)找到对应的`CMakeLists.txt`文件,检查相关自定义命令或目标定义。 2. **检查路径格式** - 确保所有路径变量(如`pointCloudTopic`)不包含空格或特殊字符 - 若路径必须包含空格,需用引号包裹路径: ```cmake add_custom_command( OUTPUT "${PROJECT_SOURCE_DIR}/output/file.txt" COMMAND ... ) ``` 3. **验证自定义命令语法** 修正`add_custom_command`中可能的语法错误,例如: ```cmake add_custom_command( OUTPUT $<TARGET_FILE_DIR:my_target>/generated_file.cpp # 正确使用生成器表达式 COMMAND ${PYTHON_EXECUTABLE} ${SCRIPT_PATH}/generate.py DEPENDS ${INPUT_FILES} ) ``` 4. **更新CMake版本** 低版本CMake(如<3.0)对路径处理存在缺陷,建议升级至最新稳定版: ```bash sudo apt-get update && sudo apt-get install cmake ``` 5. **清理并重建项目** 删除`build/`和`devel/`目录后重新编译: ```bash cd ~/catkin_ws rm -rf build/ devel/ catkin_make clean catkin_make ``` --- ### **SC-LeGO-LOAM项目注意事项** 1. **检查`utility.h`配置** 确保`pointCloudTopic`和`imuTopic`的字符串值不包含非法字符,例如: ```cpp extern const string pointCloudTopic = "/os1_points"; // 确认引号闭合且无多余符号[^2] ``` 2. **验证GTSAM依赖安装** 若项目依赖GTSAM,需按官方文档正确编译安装: ```bash git clone https://github.com/borglab/gtsam.git cd gtsam && mkdir build && cd build cmake .. && make -j4 sudo make install ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值