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

    FishBot里程计和IMU传感器数据融合

    已定时 已固定 已锁定 已移动
    FishBot二驱机器人
    fishbot 里程计 imu 融合
    3
    4
    2.2k
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 小鱼小
      小鱼 技术大佬
      最后由 编辑

      FishBot里程计和IMU传感器数据融合

      需求描述

      大家好,我是小鱼。今天我将向大家介绍如何在ROS 2的humble版本上,为fishbot实现里程计和IMU数据的融合,以生成更稳定的里程计数据。

      实现步骤

      为了实现里程计和IMU数据的融合,我们可以使用一个名为robot_localization的开源库,它提供了ROS 2的humble版本的功能包,非常适用于我们的fishbot机器人平台。你可以在这里找到它的代码库:https://github.com/cra-ros-pkg/robot_localization。

      1. 安装robot_localization

      首先,我们需要在ROS 2的humble版本上安装robot_localization库。我们可以使用apt命令进行安装,确保安装了适用于ROS 2 humble版本的robot_localization包。让我们一起运行以下命令:

      sudo apt install ros-humble-robot-localization -y
      

      2. 发布静态TF变换

      在开始之前,我们需要发布一个静态TF变换,将base_link和IMU之间的坐标系关系告知robot_localization节点。我们可以使用以下命令行发布该静态TF变换:

      ros2 run tf2_ros static_transform_publisher 0.08 0.0 0.03 0 0 0 1 base_link imu
      

      其中,0.08、0.0和0.03分别表示x、y和z轴上的平移量。请根据实际情况进行调整。

      3. 创建和编写参数文件

      在进行数据融合之前,我们需要创建一个参数文件,用于配置robot_localization节点的参数。为了满足fishbot的需求,我会给出一个示例参数文件供参考。你可以使用任何文本编辑器创建一个.yaml文件,并根据自己的需求进行配置。让我们来看一下示例参数文件的内容:

      ### ekf config file ###
      ekf_filter_node:
          ros__parameters:
              debug: true
              frequency: 30.0
              two_d_mode: false
              publish_acceleration: false
              publish_tf: true
              map_frame: map              # 如果未指定,默认为"map"
              odom_frame: odom            # 如果未指定,默认为"odom"
              base_link_frame: base_link  # 如果未指定,默认为"base_link"
              world_frame: odom           # 如果未指定,默认为odom_frame的值
      
              odom0: /odom
              odom0_config: [true,  true,  true,
                             false, false, false,
                             false, false, false,
                             false, false, true,
                             false, false, false]
      
              imu0: /imu
              imu0_config: [false, false, false,
                            true,  true,  true,
                            false, false, false,
                            false, false, false,
                            false, false, false]
      

      在这

      个示例参数文件中,你可以根据自己的需求进行配置。例如,我们可以将debug参数设置为true以启用调试模式,将frequency参数设置为30.0以设置节点的频率。另外,我们需要指定里程计和IMU数据的话题,并相应地配置参数。

      4. 运行融合节点

      现在,我们可以通过命令行来启动robot_localization节点并加载参数文件。请打开终端,并运行以下命令:

      ros2 run robot_localization ekf_node --ros-args --params-file /path/to/your/params/file.yaml
      

      请将/path/to/your/params/file.yaml替换为你自己的参数文件的实际路径。

      运行上述命令后,robot_localization节点将会启动,并根据参数文件中的配置来执行里程计和IMU数据的融合。

      5. 使用launch文件配置和运行(可选)

      除了通过命令行启动节点,我们也可以使用launch文件来更方便地配置和运行robot_localization节点。我已经为你准备了一个示例的launch文件。你可以将以下内容保存为launch文件(例如robot_localization.launch.py):

      import os
      import launch
      import launch_ros
      
      def generate_launch_description():
          package_name = 'robot_localization'
          ld = launch.LaunchDescription()
          pkg_share = launch_ros.substitutions.FindPackageShare(package=package_name).find(package_name) 
      
          robot_localization_node = launch_ros.actions.Node(
              package='robot_localization',
              executable='ekf_node',
              name='ekf_filter_node',
              output='screen',
              parameters=[os.path.join(pkg_share, 'params/ekf_example.yaml'), {'use_sim_time': launch.substitutions.LaunchConfiguration('use_sim_time')}]
          )
      
          ld.add_action(launch.actions.DeclareLaunchArgument(name='use_sim_time', default_value='False',
                                                      description='Flag to enable use_sim_time'))
          ld.add_action(robot_localization_node) 
      
          return ld
      

      在这个示例的launch文件中,我们使用了launch_ros.actions.Node来创建一个节点,并设置了参数文件的路径。请根据实际情况修改参数文件的路径。

      要运行launch文件,请在终端中运行以下命令:

      ros2 launch your_package_name robot_localization.launch.py
      

      请将your_package_name替换为你自己的包的名称。

      通过使用launch文件,我们可以更加方便地配置和运行robot_localization节点。

      总结

      在本文中,我向大家介绍了如何在ROS 2的humble版本上使用robot_localization库,为fishbot机器人平台实现里程计和IMU数据的融合。通过这种融合方式,我们可以生成更稳定准确的里程计数据,从而提高机器人的导航性能。同时,我还展示了如何发布base_link到IMU的静态TF变换,以供robot_localization节点使用。最后,我介绍了使用launch文件来更方便地配置

      测试视频展示:

      新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

      25432986002 1 条回复 最后回复 回复 引用 0
      • 25432986002
        2543298600 @小鱼
        最后由 2543298600 编辑

        @小鱼 我融合odom和IMU时,机器人在rviz中晃动,这是为什么?已经用complementary_filter_node过滤IMU数据了,并且rostopic type /robot/odometry/filtered_odom :nav_msgs/Odometry,实在不知道哪里导致机器人晃动

        小鱼小 1 条回复 最后回复 回复 引用 0
        • 小鱼小
          小鱼 技术大佬 @2543298600
          最后由 编辑

          @2543298600 仔细检查数据源问题,各轴方向问题

          新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

          1 条回复 最后回复 回复 引用 0
          • 10145351851
            Tom
            最后由 编辑

            @小鱼 在 FishBot里程计和IMU传感器数据融合 中说:

            ros2 run robot_localization ekf_node --ros-args --params-file /path/to/your/params/file.yaml

            这边按照您的步骤执行发现没有执行成功,是什么原因吗
            701efe37-2e87-424a-af3c-8dbf4394ad1c-image.png
            改成launch文件执行也没运行起来
            list一下好像也没有这个节点
            baa386ac-4d31-4e2a-a5bf-55cb7e66cb3f-image.png
            然后用命令执行:
            ros2 run robot_localization ekf_node --ros-args --params-file /opt/ros/humble/share/robot_localization/params/ekf_example.yaml
            d9edb4cd-4c5f-4336-a54b-1ab0bae66b38-image.png
            也是啥都没有 请问是什么情况吗

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