鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    有偿求救,ros2 cartographer建图失败问题

    已定时 已固定 已锁定 已移动
    ROS 2相关问题
    cartographer建图 实机操作
    3
    11
    738
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 小伊小
      机器人小伊
      最后由 编辑

      针对您使用ROS2 Humble和RealSense D435i相机配合Cartographer进行建图时遇到的问题,这里有几个可能的解决方案和检查步骤。由于您提到在网上没有找到解决办法,我们可以从配置和日志分析入手,逐步排查问题。

      1. 检查TF树

      TF树是机器人系统中非常重要的一个部分,它负责不同坐标系之间的转换。您的TF树看起来需要仔细检查以下几点:

      • 确保map到odom和odom到base_link(或您的机器人基础框架)的转换存在。通常,Cartographer会发布map到odom的转换,而您的机器人应该发布odom到基础框架的转换(可能是通过里程计或轮式编码器)。
      • 检查published_frame在lua配置文件中是否正确。您设置的是sn036222070655_color_optical_frame,这通常是颜色相机的光学框架。如果Cartographer依赖于激光雷达或深度相机的框架,可能需要调整为深度相机的框架(如/realsense_camera_node/sn036222070655/xyz/optical_frame,具体取决于您的相机驱动如何命名这些框架)。

      2. 验证输入数据

      • 确保点云数据(/realsense_camera_node/sn036222070655/xyz/pointcloud)是有效的。您可以使用ros2 topic echo来查看点云数据是否正常发布。
      • 检查IMU数据(/imu)。确保IMU数据被正确发布且格式符合Cartographer的要求。

      3. 调试Cartographer

      • 查看Cartographer的日志。启动Cartographer节点后,使用ros2 node info和ros2 topic list -v查看节点的状态和发布的主题。同时,检查终端中的输出和错误消息。
      • 尝试简化配置。开始时,使用Cartographer的默认配置,逐步添加和修改参数,以确定哪些配置可能导致问题。
      • 使用RViz可视化。确保RViz正确配置以显示地图、机器人位置和其他相关TF信息。

      4. 检查参数配置

      • use_sim_time:如果您不是在仿真环境中运行,确保所有节点的use_sim_time都设置为false。
      • 重映射:在launch.py中,您已经为重映射设置了参数,但请确保这些重映射正确无误,并且与您的TF树和主题命名一致。

      5. 硬件和驱动

      • 确保RealSense驱动正常工作。使用realsense-viewer或其他工具验证相机和IMU数据是否按预期工作。

      6. 尝试不同的配置和版本

      • 尝试使用不同的Cartographer配置。有时,配置中的小更改(如增加子图数量或调整扫描匹配参数)可以显著提高性能。
      • 考虑使用不同版本的ROS2或Cartographer。虽然这通常不是首选方法,但有时软件更新可能包含重要的修复。

      有偿帮助

      如果您在尝试上述步骤后仍然遇到问题,并且愿意寻求有偿帮助,可以考虑联系专业的ROS开发者或咨询机构。在联系他们之前,准备好详细的日志、配置和您的硬件信息,这将有助于他们更快地诊断问题。同时,确保您有权分享这些信息,并遵守任何相关的隐私和许可协议。


      以上为生成回答,仅供参考~

      我是小伊,已接入ChatGpt,所有回复,仅供参考~

      C 3 2 条回复 最后回复 回复 引用 0
      • C
        cheesecaek @小伊
        最后由 编辑

        @小伊 imu和点云图数据都是有效的
        odom到基础框架的转换应该是在哪里发布呢,是/odom里的一部分信息吗

        1 条回复 最后回复 回复 引用 0
        • 小伊小
          机器人小伊
          最后由 编辑

          IMU(惯性测量单元)和点云图数据在定位与导航系统中都是至关重要的。关于odom(里程计)到基础框架的转换以及发布位置的问题,这通常涉及到SLAM(即时定位与地图构建)系统或相关的机器人导航系统。

          首先,IMU数据提供了关于设备运动(包括加速度和角速度)的实时信息,这对于确定设备的当前位置和姿态至关重要。在SLAM系统中,IMU数据常被用于辅助或增强视觉或激光数据的处理,以提高定位的准确性和鲁棒性。

          点云图数据则是由激光扫描仪或深度相机等设备生成的,它表示了环境中物体的三维形状和位置。在SLAM系统中,点云图数据被用于构建环境地图,并帮助机器人在未知环境中进行导航。

          至于odom到基础框架的转换,这通常是在SLAM系统的后端处理中完成的。后端处理负责整合来自不同传感器(如IMU和激光扫描仪)的数据,以估计机器人的全局位置和姿态。在这个过程中,odom信息(表示机器人相对于起始位置的移动)被转换为相对于基础框架(通常是全局坐标系)的位置和姿态。

          关于odom信息的发布位置,这取决于具体的SLAM系统实现和所使用的软件框架。在一些系统中,odom信息可能被发布到一个特定的ROS(机器人操作系统)主题上,如/odom。然而,这并不是一个固定的规则,因为不同的系统和框架可能有不同的命名约定和数据结构。

          因此,要确定odom到基础框架的转换是在哪里发布的,以及它是否是/odom主题的一部分信息,你需要查阅你所使用的SLAM系统或机器人导航系统的文档。这些文档通常会提供关于数据发布、接收和处理的详细信息。

          总的来说,IMU和点云图数据在SLAM系统和机器人导航中都扮演着重要角色。它们共同为机器人提供了关于其环境和自身运动状态的准确信息,从而实现了精确的定位和导航。而odom到基础框架的转换则是这些系统中的一个关键步骤,它确保了机器人能够在全局坐标系中准确地定位自己。


          以上为生成回答,仅供参考~

          我是小伊,已接入ChatGpt,所有回复,仅供参考~

          C 1 条回复 最后回复 回复 引用 0
          • C
            cheesecaek @小伊
            最后由 编辑

            @小伊 我现在添加了/scan
            但是出现了这样的错误
            [cartographer_node-1] [WARN] [1731389704.922721691] [cartographer logger]: W1112 13:35:04.000000 9809 sensor_bridge.cpp:211] Ignored subdivision of a LaserScan message from sensor scan because previous subdivision time 621355968017313897 is not before current subdivision time 621355968017313897

            这是/scan信息
            header:
            stamp:
            sec: 1
            nanosec: 731389761
            frame_id: sn036222070655_color_optical_frame
            angle_min: -3.1415927410125732
            angle_max: 3.1415927410125732
            angle_increment: 0.01745329238474369
            time_increment: 0.0
            scan_time: 0.03333333507180214
            range_min: 0.0
            range_max: .inf
            ranges:

            • 0.060172129422426224
            • 0.060187626630067825
            • 0.16551685333251953
            • 0.17524026334285736
            • 0.17530372738838196
            • 0.17934346199035645
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • 0.05927778407931328
            • 0.016912968829274178
            • 0.016490917652845383
            • 0.01663563959300518
            • 0.015802869573235512
            • 0.015388795174658298
            • 0.0145117761567235
            • 0.014104803092777729
            • 0.01370001956820488
            • 0.013886692933738232
            • 0.014478813856840134
            • 0.01408478245139122
            • 0.013693698681890965
            • 0.01330582145601511
            • 0.012921440415084362
            • 0.013148977421224117
            • 0.013758635148406029
            • 0.01338726095855236
            • 0.013635726645588875
            • 0.014252007938921452
            • 0.01327565312385559
            • 0.013540619984269142
            • 0.01478188019245863
            • 0.01381466444581747
            • 0.01409725658595562
            • 0.014387893490493298
            • 0.01569528691470623
            • 0.014686097390949726
            • 0.015047354623675346
            • 0.015988286584615707
            • 1.256740927696228
            • 1.236456036567688
            • 1.2584118843078613
            • 1.3163059949874878
            • 1.3377922773361206
            • 1.3172674179077148
            • 1.3428338766098022
            • 1.3686951398849487
            • 1.3494243621826172
            • 1.3588370084762573
            • 1.341367483139038
            • 1.3678548336029053
            • 1.3244167566299438
            • 1.3933404684066772
            • 1.3438928127288818
            • 1.3443493843078613
            • 1.266227126121521
            • 1.2149559259414673
            • 1.0956717729568481
            • 1.1414600610733032
            • 1.1310813426971436
            • 0.9774243235588074
            • 1.0198127031326294
            • 0.9605922698974609
            • 1.0036917924880981
            • 0.9597606062889099
            • 0.8668673038482666
            • 0.9069702625274658
            • 0.9116668701171875
            • 0.8550470471382141
            • 0.8989764451980591
            • 0.8451510667800903
            • 0.8862372636795044
            • 0.8610127568244934
            • 0.9344863891601562
            • 0.854889988899231
            • 0.8918543457984924
            • 0.9670906662940979
            • 0.9246839284896851
            • 0.9990550875663757
            • 1.1380897760391235
            • 0.9220139980316162
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • .inf
            • 0.10156688839197159
            • 0.09941650182008743
            • 0.09989584237337112
            • .inf
            • .inf
            • .inf
            • '...'
              intensities: []

            1 条回复 最后回复 回复 引用 0
            • 小伊小
              机器人小伊
              最后由 编辑

              错误信息显示Cartographer(一个用于机器人SLAM的库)在处理来自/scan话题的激光扫描数据时遇到了问题。具体来说,错误是关于激光扫描消息的细分时间戳,即Cartographer期望每个新的扫描数据的时间戳要晚于前一个数据的时间戳,但在这个情况下,时间戳没有正确递增。

              错误分析

              错误消息:

              [cartographer_node-1] [WARN] [1731389704.922721691] [cartographer logger]: W1112 13:35:04.000000  9809 sensor_bridge.cpp:211] Ignored subdivision of a LaserScan message from sensor scan because previous subdivision time 621355968017313897 is not before current subdivision time 621355968017313897
              

              这表明Cartographer试图处理一个激光扫描消息,但发现该消息的时间戳(或细分时间)与上一个消息的时间戳相同,这是不符合预期的。这可能是由于多种原因造成的,包括但不限于:

              1. 时间戳未正确更新:发送/scan消息的系统或节点可能没有正确更新时间戳。
              2. 数据发送频率:如果/scan数据的发送频率非常低,或者由于某种原因暂停发送,然后突然恢复,可能会导致时间戳未正确递增。
              3. 系统时间问题:系统时间的不一致或错误也可能导致此类问题。

              解决步骤

              1. 检查时间戳:

                • 确保每个/scan消息的时间戳(header.stamp)是递增的。你可以通过订阅/scan话题并打印时间戳来检查这一点。
              2. 检查数据发送频率:

                • 确认激光扫描数据的发送频率。如果频率非常低,尝试调整以提供更频繁的数据。
              3. 检查系统时间:

                • 确保运行Cartographer和发布/scan消息的节点的系统时间是同步的。
              4. 查看Cartographer配置:

                • 检查Cartographer的配置文件,确保关于激光扫描的处理设置是正确的。特别是与时间相关的设置,如tracking_from_tracking_odometry_frame、tracking_frame等。
              5. 调试和日志:

                • 增加日志记录的详细级别,以便更深入地了解问题发生的上下文。
                • 使用ROS的工具如rostopic echo和rqt_plot来监控/scan话题的数据和频率。
              6. 软件更新和兼容性:

                • 确保你使用的Cartographer版本与ROS发行版兼容。
                • 查看是否有关于此问题的已知bug或修复。

              通过上述步骤,你应该能够诊断并解决导致这个警告的问题。如果问题仍然存在,可能需要更深入地检查Cartographer的源代码或寻求社区的帮助。


              以上为生成回答,仅供参考~

              我是小伊,已接入ChatGpt,所有回复,仅供参考~

              C 1 条回复 最后回复 回复 引用 0
              • C
                cheesecaek @小伊
                最后由 编辑

                @小伊 发布的时间戳不递增是为什么呢

                1 条回复 最后回复 回复 引用 0
                • 小伊小
                  机器人小伊
                  最后由 编辑

                  发布的时间戳不递增可能由多种原因造成,以下是一些可能的原因:

                  1. 时间戳生成机制问题:

                    • 在某些系统或应用中,时间戳的生成可能依赖于特定的算法或逻辑。如果这些算法或逻辑存在缺陷或配置不当,可能导致生成的时间戳不递增。
                    • 例如,在某些版本控制系统中(如Git),时间戳可能不会随着每次提交而递增,而是仅在文件内容发生变化时更新。
                  2. 系统时间同步问题:

                    • 如果系统时间没有正确同步,例如由于网络时间协议(NTP)故障或手动更改系统时间,可能导致生成的时间戳不递增。
                    • 在分布式系统中,如果各个节点的时间没有同步,也可能导致时间戳不一致。
                  3. 并发操作导致的时间戳冲突:

                    • 在高并发环境中,多个操作可能同时尝试生成时间戳。如果生成时间戳的机制不够精细,可能会导致多个操作生成相同的时间戳。
                    • 这种情况在数据库操作中尤为常见,特别是当多个事务在极短的时间内启动时。
                  4. 缓存机制导致的时间戳未更新:

                    • 在某些应用或系统中,为了提高性能,可能会采用缓存机制来存储时间戳。如果缓存没有正确更新或清除,可能导致显示的时间戳与实际时间不符。
                    • 例如,在高德地图的家人地图功能中,如果缓存机制导致时间戳没有更新,即使有新的信息,也不会显示最新的时间戳。
                  5. 人为干预或错误:

                    • 人为更改时间戳或系统配置错误也可能导致时间戳不递增。
                    • 例如,在Laravel框架中,如果模型中没有设置时间戳字段或数据库表中缺少时间戳字段,或者手动更新了时间戳字段的值,都可能导致时间戳不自动更新。
                  6. 时间戳精度问题:

                    • 如果时间戳的精度不够高(例如只精确到秒),在极短的时间内(如毫秒或微秒级)可能无法区分不同的时间戳。
                    • 这种情况在数据库操作中尤为明显,特别是当使用微秒级时间戳时,可能存在多个记录具有相同时间戳的情况。

                  为了解决这个问题,可以采取以下措施:

                  • 确保系统时间正确同步,避免由于时间同步问题导致的时间戳错误。
                  • 在高并发环境中,采用更精细的时间戳生成机制,如使用毫秒级或更高精度的时间戳。
                  • 定期检查并更新缓存机制,确保缓存中的时间戳是最新的。
                  • 在应用中正确配置时间戳字段和更新逻辑,避免人为干预或错误导致的时间戳问题。
                  • 如果需要更高的时间戳精度,可以考虑使用更高精度的时间戳类型或算法。

                  总之,发布的时间戳不递增可能由多种原因造成,需要根据具体情况进行分析和解决。


                  以上为生成回答,仅供参考~

                  我是小伊,已接入ChatGpt,所有回复,仅供参考~

                  C 1 条回复 最后回复 回复 引用 0
                  • C
                    cheesecaek @小伊
                    最后由 编辑

                    @小伊 请告诉我timestamp中每个变量的含义

                    1 条回复 最后回复 回复 引用 0
                    • 小伊小
                      机器人小伊
                      最后由 编辑

                      在数据库、编程和计算机科学中,"timestamp"(时间戳)是一个表示特定日期和时间点的值。时间戳通常以数字或字符串的形式出现,包含多个部分,每个部分代表不同的时间单位。虽然时间戳的具体格式可能因系统和应用程序而异,但以下是一些常见的时间戳变量及其含义:

                      1. 年(Year):

                        • 表示事件发生的具体年份。例如,2023。
                      2. 月(Month):

                        • 表示事件发生的月份。通常,月份用数字表示,从1(一月)到12(十二月)。例如,03 表示三月。
                      3. 日(Day):

                        • 表示事件发生在该月的哪一天。例如,15 表示十五日。
                      4. 时(Hour):

                        • 表示事件发生的时间点的小时数。通常使用24小时制(00到23)。例如,14 表示下午2点。
                      5. 分(Minute):

                        • 表示事件发生的时间点的分钟数。例如,30 表示30分钟。
                      6. 秒(Second):

                        • 表示事件发生的时间点的秒数。例如,45 表示45秒。
                      7. 毫秒(Millisecond)(可选):

                        • 表示事件发生的时间点的毫秒数。通常用于需要更高精度的时间记录。例如,123 表示123毫秒。
                      8. 微秒(Microsecond)(可选):

                        • 表示事件发生的时间点的微秒数。进一步提高了时间精度。例如,456789 表示456,789微秒。
                      9. 纳秒(Nanosecond)(可选):

                        • 表示事件发生的时间点的纳秒数。提供了极高的时间精度。例如,123456789 表示123,456,789纳秒。
                      10. 时区(Timezone)(可选):

                        • 表示事件发生时的地理位置时区。例如,UTC(协调世界时),PST(太平洋标准时间),CET(中欧时间)等。
                      11. 日期时间偏移(Date-Time Offset)(可选):

                        • 以小时和分钟的形式表示相对于UTC的时间偏移。例如,+02:00 表示东二区时间。

                      一个典型的时间戳例子可能是 "2023-03-15T14:30:45.123Z",其中:

                      • 2023 是年
                      • 03 是月
                      • 15 是日
                      • T 是日期和时间的分隔符(ISO 8601格式)
                      • 14 是小时
                      • 30 是分钟
                      • 45 是秒
                      • .123 是毫秒
                      • Z 表示这是UTC时间(零时区)

                      注意,时间戳的具体格式和包含的信息取决于使用的系统和标准。例如,UNIX时间戳通常只表示自1970年1月1日以来的秒数或毫秒数,不包含日期和时间的各个部分。


                      以上为生成回答,仅供参考~

                      我是小伊,已接入ChatGpt,所有回复,仅供参考~

                      1 条回复 最后回复 回复 引用 0
                      • 3
                        318497032 @小伊
                        最后由 编辑

                        @小伊 通常,Cartographer会发布map到odom的转换,而您的机器人应该发布odom到基础框架的转换(可能是通过里程计或轮式编码器) 我想把odom改为odom_combined应该修改cartographer的那些文件 我想要把它和nav2融合起来 应为我所有的nav2都是odom_combined已经配置好了 现在是配置cartographer

                        1 条回复 最后回复 回复 引用 0
                        • 第一个帖子
                          最后一个帖子
                        皖ICP备16016415号-7
                        Powered by NodeBB | 鱼香ROS