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

    6.4.4章节导入的小车模型的左右轮没有TF

    已定时 已固定 已锁定 已移动
    ROS2机器人开发:从入门到实践
    gazebo tf异常
    6
    9
    883
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 1
      DDD
      最后由 编辑

      导入的其他部件都正常,但是左右两轮没有TF
      2fa96309d270b8f5218ff95a862db207.png
      查询发布的话题发现 joint_states有一个发布,但是gazebo_sim.launch.py文件里并没有定义joint_states_publisher
      33576008191b7edb93a647c3fd55961f.png

      gazebo_sim.launch.py代码如下:

      import launch
      import launch_ros
      from ament_index_python.packages import get_package_share_directory
      from launch.launch_description_sources import PythonLaunchDescriptionSource
      
      
      def generate_launch_description():
          # 获取默认路径
          robot_name_in_model="fishbot"
          urdf_tutorial_path = get_package_share_directory('dyhbot_description')
          default_model_path = urdf_tutorial_path + '/urdf/fishbot/fishbot.urdf.xacro'
          default_world_path = urdf_tutorial_path + '/world/custom_room.world'
          # 为 Launch 声明参数
          action_declare_arg_mode_path = launch.actions.DeclareLaunchArgument(
              name='model', default_value=str(default_model_path),description='URDF 的绝对路径')
          
          # 获取文件内容生成新的参数
          robot_description = launch_ros.parameter_descriptions.ParameterValue(
              launch.substitutions.Command(
                  ['xacro ', launch.substitutions.LaunchConfiguration('model')]),
              value_type=str)
          # 状态发布节点
          robot_state_publisher_node = launch_ros.actions.Node(
              package='robot_state_publisher',
              executable='robot_state_publisher',
              parameters=[{'robot_description': robot_description}]
          )
           # 通过 IncludeLaunchDescription 包含另外一个 launch 文件
          launch_gazebo = launch.actions.IncludeLaunchDescription(
              PythonLaunchDescriptionSource([get_package_share_directory('gazebo_ros'), '/launch', '/gazebo.launch.py']),
            	# 传递参数
              launch_arguments=[('world', default_world_path),('verbose','true')]
          )
          # 请求 Gazebo 加载机器人
          spawn_entity_node = launch_ros.actions.Node(
              package='gazebo_ros',
              executable='spawn_entity.py',
              arguments=['-topic', '/robot_description',
                         '-entity', robot_name_in_model, ])
          
          return launch.LaunchDescription([
              action_declare_arg_mode_path,
              robot_state_publisher_node,
              launch_gazebo,
              spawn_entity_node
          ])
      
      小鱼小 1 条回复 最后回复 回复 引用 0
      • 小伊小
        机器人小伊
        最后由 编辑

        问题出在您的 gazebo_sim.launch.py 文件中没有包含用于发布 joint_states 的组件。在 ROS 和 Gazebo 环境中,joint_states 通常是由 robot_state_publisher 节点和 Gazebo 插件(如 libgazebo_ros_joint_state_publisher.so)共同发布的。确保这两部分都正确配置是解决问题的关键。

        1. 确保 URDF 中正确配置了关节(Joints)

        首先,确保您的 URDF 文件(在这个例子中是 fishbot.urdf.xacro)中正确定义了所有的关节。joint_states 发布依赖于 URDF 中定义的关节信息。

        2. 确保 Gazebo 插件正确加载

        在 Gazebo 中,通常需要一个特定的插件来发布 joint_states。这个插件通常是 libgazebo_ros_joint_state_publisher.so。您需要在您的 Gazebo 配置文件(如 .world 文件或 .sdf 文件)中确保这个插件被正确加载。例如,在您的 .world 文件中的机器人模型部分,您应该看到类似这样的配置:

        <model name="fishbot">
            <!-- Other model configurations -->
            <plugin name="joint_state_controller" filename="libgazebo_ros_joint_state_publisher.so">
                <robotNamespace>/</robotNamespace>
            </plugin>
        </model>
        

        注意:这里的 <robotNamespace> 应该与您在 ROS 中使用的命名空间相匹配。

        3. 检查 robot_state_publisher 配置

        robot_state_publisher 节点依赖于 robot_description 参数来获取 URDF 信息。在您的 gazebo_sim.launch.py 文件中,您已经设置了 robot_state_publisher,并传递了 robot_description 参数。这部分看起来是正确的。

        4. 验证 Gazebo 和 ROS 的集成

        • 确保您的 Gazebo 版本与 ROS 版本兼容。
        • 检查 Gazebo 是否正确加载了所有必要的插件。
        • 检查 ROS 控制台输出,看是否有任何错误或警告信息关于 joint_states 或 robot_state_publisher。

        5. 调试

        如果以上步骤都正确无误,但问题仍然存在,您可以尝试以下调试步骤:

        • 在 Gazebo 中手动添加 joint_state_publisher 插件,看看是否有输出。
        • 使用 rostopic list 和 rostopic echo /joint_states 来检查 joint_states 话题是否被发布。
        • 查看 Gazebo 的日志文件,看是否有任何错误或警告。

        通过以上步骤,您应该能够诊断并解决 joint_states 未发布的问题。如果问题依然存在,可能需要更深入地检查您的 URDF 文件、Gazebo 配置文件以及 ROS 的启动文件。


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

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

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

          @小伊 在gazebo里模型显示正常,但是在rviz里左右轮显示异常:

          ee68acf0abf4a0551fba967d085b3e32.png
          a1df750e2ef20a43601a99fc7b26c63b.png

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

            在Gazebo中模型显示正常,但在RViz中左右轮显示异常的问题,通常与模型的TF(Transform)变换信息、URDF文件配置以及RViz的显示设置有关。以下是一些可能的解决步骤:

            1. 检查URDF文件

            • 中文问题:确保URDF文件中没有中文,因为某些ROS版本(如ROS Melodic在Ubuntu 18.04上)可能由于Python版本和编码问题,导致无法正确处理包含中文的URDF文件。
            • TF信息:检查URDF文件中是否正确定义了所有必要的TF变换信息,特别是与左右轮相关的部分。确保每个关节(link)都有正确的父关节(parent link)和变换(transform)。

            2. 启动必要的节点

            • robot_state_publisher:这个节点负责从参数服务器读取URDF文件,并发布机器人的状态和关节状态。确保在launch文件中正确启动了该节点。
            • joint_state_publisher:这个节点负责发布关节的状态信息,包括位置、速度和力矩等。同样,确保在launch文件中正确启动了该节点。

            3. 检查RViz设置

            • Fixed Frame:在RViz中,确保选择了正确的固定坐标系(Fixed Frame),这通常是TF树的最上层坐标系,如“world”或“map”。
            • RobotModel显示:在RViz中添加RobotModel显示项,并确保在“Robot Description”字段中正确设置了URDF文件的参数。如果使用了命名空间,需要在URDF文件路径前加上相应的命名空间。

            4. 检查Gazebo插件设置

            • 如果在Gazebo中使用了自定义插件来生成模型或发布TF信息,请确保这些插件正确配置并正常工作。特别是与左右轮相关的插件,检查它们是否发布了必要的TF变换信息。

            5. 调试和错误处理

            • 查看终端输出:运行RViz和Gazebo时,注意查看终端输出中的错误信息。这些信息通常可以提供关于问题所在的线索。
            • 使用tf_echo工具:使用tf_echo工具来检查两个坐标系之间的变换关系是否存在和正确。例如,可以使用rosrun tf tf_echo /world /robot1/wheel_left_link来检查从“world”坐标系到“robot1/wheel_left_link”坐标系的变换。

            6. 修改模型文件

            • 在某些情况下,可能需要在模型的XACRO文件中修改Gazebo插件的设置。例如,确保<publishWheelTF>设置为true以发布轮子的TF变换信息。这有助于RViz正确显示左右轮。

            综上所述,解决RViz中左右轮显示异常的问题需要综合考虑URDF文件的配置、必要节点的启动、RViz的设置、Gazebo插件的设置以及调试和错误处理等多个方面。通过逐步排查和修改,通常可以找到并解决问题。


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

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

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

              @1908739846 提供详细运行日志

              https://fishros.org.cn/forum/topic/151/提问前必看-不符合要求的问题拒绝回答

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

              1 条回复 最后回复 回复 引用 0
              • 2
                2861790776
                最后由 编辑

                @1908739846 请问解决了吗?我也是同样问题。跟小鱼源码一样出现了这个问题

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

                  @1908739846 node list 和 rqt graph 看一下

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

                  1 条回复 最后回复 回复 引用 0
                  • L
                    liuchang_t
                    最后由 编辑

                    我用的gazebo harmonic,也遇到类似的问题,后来发现是仿真没有运行起来,要手动把仿真启动运行才会有动态的tf发布出来

                    2 1 条回复 最后回复 回复 引用 0
                    • 2
                      2903547414 @liuchang_t
                      最后由 编辑

                      @liuchang_t 重启一下虚拟机解决了

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