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

    xacro简化urdf

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

      在你提供的URDF(通过XACRO简化)文件中,存在几个问题导致它无法正确解析和编译。这些问题主要与XACRO宏的使用和XML的规范有关。下面是详细的问题和解决方案:

      1. 宏定义和调用的位置问题:
        在XACRO中,宏的定义和调用必须遵守一定的结构。在你的代码中,joint 标签是直接在 robot 标签下定义的,而它依赖于 imu_link 宏中的参数 ${imu_name}。由于 joint 标签不在宏内部,它无法访问 imu_link 宏中定义的参数。

      2. 解决方案:

        • 你应该将 joint 的定义放入 imu_link 宏中,或者创建一个新的宏来封装 joint 的定义,并在调用 imu_link 宏时调用这个新的 joint 宏。
      3. 修改后的代码:
        这里我将提供一个修改后的版本,其中创建了一个新的宏 imu_joint 来定义关节,并在 imu_link 宏中调用它。

      <?xml version="1.0"?>
      <robot xmlns:xacro="http://wiki.ros.org/xacro" name="first_robot">
          <xacro:macro name="base_link" params="length radius">
              <link name="base_link">
                  <visual>
                      <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
                      <geometry>
                          <cylinder radius="${radius}" length="${length}"/>
                      </geometry>
                      <material name="white">
                          <color rgba="1.0 1.0 1.0 0.5"/>
                      </material>
                  </visual>    
              </link>
          </xacro:macro>
      
          <xacro:macro name="imu_link" params="imu_name xyz">
              <link name="${imu_name}_link">
                  <visual>
                      <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
                      <geometry>
                          <box size="0.02 0.0 0.0"/> 
                      </geometry>
                      <material name="black">
                          <color rgba="0.0 0.0 0.0 0.5"/>  <!-- 修正颜色值,原值为蓝色 -->
                      </material>
                  </visual>    
              </link>
              <xacro:macro name="imu_joint" params="imu_name xyz">
                  <joint name="${imu_name}_joint" type="fixed">
                      <parent link="base_link"/>
                      <child link="${imu_name}_link"/>
                      <origin xyz="${xyz}" rpy="0.0 0.0 0.0"/>
                  </joint>
              </xacro:macro>
              <xacro:imu_joint imu_name="${imu_name}" xyz="${xyz}"/>
          </xacro:macro>
      
          <xacro:base_link length="0.12" radius="0.1"/>
          <xacro:imu_link imu_name="imu_up" xyz="0.0 0.0 0.03"/>
          <xacro:imu_link imu_name="imu_down" xyz="0.0 0.0 -0.03"/>
      </robot>
      

      注意:

      • 我在 imu_link 宏内部定义了一个新的宏 imu_joint 并立即调用它。这不是最佳实践,因为它使得 imu_link 宏变得复杂且难以重用。更好的做法是将 imu_joint 作为一个独立的宏定义在 imu_link 外部,并在需要时分别调用它们。
      • 我修正了 imu_link 中材质颜色的 RGBA 值,原值实际上是蓝色的(rgba="0.0 0.0 1.0 0.5"),如果你想要黑色,应使用 rgba="0.0 0.0 0.0 0.5"。
      • 在实际应用中,建议将关节的定义作为一个独立的宏,以便更灵活地重用。

      希望这些修改能帮助你解决问题!


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

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

      8 1 条回复 最后回复 回复 引用 0
      • 8
        862524030 年度VIP @小伊
        最后由 编辑

        @小伊 用你生成的代码之后报错
        zmy@zmyTB:~/chapt6$ xacro /home/zmy/chapt6/chapt6_ws/src/fishbot_description/urdf/first_robot.xacro~
        Traceback (most recent call last):
        File "/opt/ros/humble/local/lib/python3.10/dist-packages/xacro/init.py", line 1012, in parse
        inp = f = open(filename)
        FileNotFoundError: [Errno 2] No such file or directory: '/home/zmy/chapt6/chapt6_ws/src/fishbot_description/urdf/first_robot.xacro~'

        During handling of the above exception, another exception occurred:

        Traceback (most recent call last):
        File "/opt/ros/humble/local/lib/python3.10/dist-packages/xacro/init.py", line 1119, in _process
        doc = process_file(input_file_name, **opts)
        File "/opt/ros/humble/local/lib/python3.10/dist-packages/xacro/init.py", line 1096, in process_file
        doc = parse(None, input_file_name)
        File "/opt/ros/humble/local/lib/python3.10/dist-packages/xacro/init.py", line 1016, in parse
        raise XacroException(e.strerror + ": " + e.filename, exc=e)
        xacro.XacroException: No such file or directory: /home/zmy/chapt6/chapt6_ws/src/fishbot_description/urdf/first_robot.xacro~ [Errno 2] No such file or directory: '/home/zmy/chapt6/chapt6_ws/src/fishbot_description/urdf/first_robot.xacro~'

        During handling of the above exception, another exception occurred:

        Traceback (most recent call last):
        File "/opt/ros/humble/bin/xacro", line 33, in <module>
        sys.exit(load_entry_point('xacro==2.0.8', 'console_scripts', 'xacro')())
        File "/opt/ros/humble/local/lib/python3.10/dist-packages/xacro/init.py", line 1171, in main
        _process(input_file_name, vars(opts))
        File "/opt/ros/humble/local/lib/python3.10/dist-packages/xacro/init.py", line 1124, in _process
        except xml.parsers.expat.ExpatError as e:
        AttributeError: module 'xml' has no attribute 'parsers'

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

          从您提供的错误信息中,可以看出存在几个问题:

          1. 文件路径错误:
            您尝试打开的文件路径是 /home/zmy/chapt6/chapt6_ws/src/fishbot_description/urdf/first_robot.xacro~,这个路径末尾有一个波浪号(~),这通常表示一个临时文件或备份文件。请检查您的文件是否确实是以 ~ 结尾,通常正确的文件扩展名应该是 .xacro 而不是 .xacro~。

            您应该检查文件是否正确命名并位于指定的目录中。如果文件名为 first_robot.xacro,则命令应该是:

            xacro /home/zmy/chapt6/chapt6_ws/src/fishbot_description/urdf/first_robot.xacro
            
          2. Python环境问题:
            错误信息中出现了 AttributeError: module 'xml' has no attribute 'parsers',这通常意味着Python环境中有一些不兼容或损坏的库。这可能是由于Python版本或某些库的更新导致的。

            在ROS Humble中,通常使用的是Python 3.10。确保您的环境中安装的库与ROS Humble兼容。您可以尝试重新安装 xacro 或相关依赖库,看是否能解决问题。使用以下命令尝试更新或重新安装 xacro:

            sudo apt-get update
            sudo apt-get install --reinstall ros-humble-xacro
            

            如果问题仍然存在,您可能需要检查您的Python环境,确保没有其他版本的Python或库冲突。

          3. 执行环境:
            确保您是在ROS的工作空间中执行这些命令,并且已经正确设置了环境变量。通常,您需要在执行 xacro 命令前激活ROS环境:

            source /opt/ros/humble/setup.bash
            

          综上所述,首先检查文件路径和名称是否正确,然后尝试解决Python环境问题。如果问题仍然存在,请考虑查看更详细的ROS社区或论坛寻求帮助。


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

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

          8 1 2 条回复 最后回复 回复 引用 0
          • 8
            862524030 年度VIP @小伊
            最后由 编辑

            @小伊
            该问题已经解决,我想询问你一个新问题。
            在urdf建模以及在rviz2中显示这个过程中,我跟着鱼香ros的b站教程操作,为什么我在保存config并且配置之后,config文件没有生效。

            import launch
            import launch_ros
            from ament_index_python.packages import get_package_share_directory
            import launch_ros.parameter_descriptions
            import os
            
            def generate_launch_description():
                # 获取默认的urdf路径
                urdf_package_path = get_package_share_directory('fishbot_description')
                default_urdf_path = os.path.join(urdf_package_path,'urdf','first_robot.urdf')
                default_rviz_config_path = os.path.join(urdf_package_path,'config','display_robot_model.rviz')
                # 声明一个urdf目录的参数,方便修改
                action_declare_arg_mode_path = launch.actions.DeclareLaunchArgument(
                    name='model',default_value=str(default_urdf_path),description='加载的模型文件路径'
                )
                # 通过文件路径,获取内容,并转换成参数值对象,以供传入 robot_state_publisher
                substitutions_command_result = launch.substitutions.Command(['xacro ',launch.substitutions.LaunchConfiguration('model')])
                robot_description_value = launch_ros.parameter_descriptions.ParameterValue(substitutions_command_result,value_type=str) 
             
                action_robot_state_publisher = launch_ros.actions.Node(
                    package='robot_state_publisher',
                    executable='robot_state_publisher',
                    parameters=[{'robot_description':robot_description_value}]
                )
            
                action_joint_state_publisher = launch_ros.actions.Node(
                    package='joint_state_publisher',
                    executable='joint_state_publisher',
                )
            
                action_rviz_node = launch_ros.actions.Node(
                    package='rviz2',
                    executable='rviz2',
                    arguments=['-d', default_rviz_config_path]
                )
            
                return launch.LaunchDescription(
                    [
                        action_declare_arg_mode_path,
                        action_robot_state_publisher,
                        action_joint_state_publisher,
                        action_rviz_node,
                    ]
                )
            

            3e6379e0-c7a2-46ff-8cac-7b2b73c2b1c4-图片.png

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

              在ROS 2中使用URDF模型和RViz配置时,如果config文件没有生效,可能有几个原因。以下是一些检查和调试的步骤,帮助你找出问题所在:

              1. 确认URDF文件路径和名称:

                • 确保first_robot.urdf文件确实存在于fishbot_description/urdf/目录下。
                • 检查URDF文件是否有语法错误,这可以通过使用xacro命令行工具来预处理URDF文件来验证(例如,运行xacro fishbot_description/urdf/first_robot.urdf看是否有错误输出)。
              2. 检查RViz配置文件:

                • 确保display_robot_model.rviz文件确实存在于fishbot_description/config/目录下。
                • 打开RViz并手动加载这个配置文件,看看是否能正确显示模型。这可以帮助确认配置文件本身是否有问题。
              3. 检查Launch文件:

                • 你的Launch文件看起来是正确的,但有几个地方可以进一步检查:
                  • 确保xacro命令在你的环境中是可用的,并且路径设置正确。
                  • 尝试在Launch文件中添加一些打印语句(虽然ROS 2的Launch系统不直接支持打印,但你可以通过日志输出或修改节点参数来间接实现)。
              4. 运行时的参数和配置:

                • 当你运行Launch文件时,确保没有覆盖默认的URDF路径或RViz配置路径。
                • 检查ROS 2的终端输出,看是否有任何错误或警告信息。
              5. 环境变量和依赖:

                • 确保所有相关的ROS 2包都已正确安装,并且环境变量(如ROS_DOMAIN_ID)设置正确。
                • 确保ament_index_python和其他相关工具在你的Python环境中是可用的。
              6. 使用绝对路径:

                • 尝试在Launch文件中使用绝对路径而不是相对路径,这有时可以解决路径解析的问题。
              7. 调试和日志:

                • 增加日志输出,特别是在处理文件和参数时。
                • 检查RViz和ROS 2节点的日志输出,看是否有更详细的错误信息。

              如果以上步骤都不能解决问题,你可能需要更详细地检查每个组件的配置和状态,或者考虑是否有可能是ROS 2或RViz的bug。在这种情况下,查看相关的GitHub仓库的issue页面或向社区求助可能是一个好主意。


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

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

              8 1 条回复 最后回复 回复 引用 0
              • 8
                862524030 年度VIP @小伊
                最后由 编辑

                @小伊 Rviz中,文件名后缀出现*是为什么

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

                  在Rviz中,文件名后缀出现星号(*)通常不是Rviz软件本身的一个特性或标准表示。在多数编程和文件编辑软件中,文件名后缀或文件名前的星号往往表示该文件存在未保存的更改。例如,在某些文本编辑器或IDE(集成开发环境)中,如果一个文件被打开并进行了编辑但尚未保存,文件名旁边或前缀可能会出现一个星号,作为提醒用户有未保存的更改的视觉标志。

                  然而,就Rviz而言,它主要用于机器人的可视化,特别是与ROS(Robot Operating System,机器人操作系统)一起使用时。Rviz本身并不直接处理文件名的显示或编辑状态的标记。如果在Rviz环境中看到文件名后缀有星号,这可能并不是Rviz直接造成的,而是可能与以下情况有关:

                  1. 外部编辑器或IDE:如果在使用Rviz的同时,也打开了同一个文件(例如URDF文件)在另一个编辑器或IDE中进行编辑,并且未保存更改,那么文件名前的星号可能是由该编辑器或IDE显示的。
                  2. 文件系统或操作系统的特性:某些文件系统或操作系统可能会以特定方式标记未保存的文件,尽管这种情况较为少见,并且通常与特定的软件或环境配置有关。
                  3. 自定义脚本或工具:在某些情况下,用户可能会使用自定义脚本或工具来监视文件更改,并通过在文件名后添加星号等方式来提供视觉反馈。

                  如果确定这个星号是与Rviz的使用相关的,并且不是由外部编辑器或IDE造成的,建议检查Rviz的配置和使用的环境,以确定是否有什么自定义的脚本或工具在影响文件名的显示。此外,也可以考虑查看Rviz的日志文件或输出信息,以获取更多关于此问题的线索。

                  总的来说,Rviz中文件名后缀出现星号通常不是Rviz的标准行为,而是可能与外部编辑器、文件系统特性或自定义脚本有关。


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

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

                  8 1 条回复 最后回复 回复 引用 0
                  • 8
                    862524030 年度VIP @小伊
                    最后由 编辑

                    @小伊

                    <?xml version="1.0"?>
                    <robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="fishbot">
                    
                    <xacro:include filename="$(find fishbot_description)/urdf/fishbot/base.urdf.xacro"/>
                    <!--传感器部分-->
                    <xacro:include filename="$(find fishbot_description)/urdf/sensor/imu.urdf.xacro"/>
                    <xacro:include filename="$(find fishbot_description)/urdf/sensor/camera.urdf.xacro"/>
                    <xacro:include filename="$(find fishbot_description)/urdf/sensor/laser.urdf.xacro"/>
                    
                    <xacro:base_xacro length="0.12" radius="0.10">
                    </robot>
                    

                    zmy@zmyTB:~/chapt6/chapt6_ws$ xacro /home/zmy/chapt6/chapt6_ws/src/fishbot_description/urdf/fishbot/fishbot.urdf.xacro
                    XML parsing error: mismatched tag: line 11, column 2
                    when processing file: /home/zmy/chapt6/chapt6_ws/src/fishbot_description/urdf/fishbot/fishbot.urdf.xacro

                    Check that:

                    • Your XML is well-formed
                    • You have the xacro xmlns declaration: xmlns:xacro="http://www.ros.org/wiki/xacro"
                    1 条回复 最后回复 回复 引用 0
                    • 小伊小
                      机器人小伊
                      最后由 编辑

                      XML解析错误提示“mismatched tag: line 11, column 2”表明在XML文件的第11行第2列处存在标签不匹配的问题。这通常意味着某个XML标签没有正确关闭,或者开启和关闭的标签不匹配。

                      在你的fishbot.urdf.xacro文件中,错误可能是由于<xacro:base_xacro>标签的使用不正确导致的。<xacro:base_xacro>不是一个标准的XACRO或XML标签,看起来像是试图调用一个宏或函数,但实际上在XACRO中并没有预定义的base_xacro宏。如果你的意图是调用一个自定义的宏来设置机器人的一些基本属性(如长度和半径),你需要确保这个宏在base.urdf.xacro文件中被正确定义。

                      解决步骤:

                      1. 检查base.urdf.xacro文件:

                        • 确保base.urdf.xacro文件中有一个名为base_xacro的宏定义,并且它接受length和radius作为参数。
                        • 如果base_xacro宏不存在,你需要创建它,或者如果这是一个错误,应该替换为正确的标签或宏调用。
                      2. 修改fishbot.urdf.xacro文件:

                        • 如果base_xacro是一个自定义宏,确保它的使用方式是正确的,并且所有参数都符合base.urdf.xacro中的定义。
                        • 如果base_xacro不应该是一个宏调用,请将其替换为正确的XML或XACRO结构。
                      3. 重新运行XACRO:

                        • 在修改完文件后,重新运行XACRO命令来生成URDF文件,看是否还会出现错误。
                      4. 检查其他潜在的XML错误:

                        • 确保所有的XML标签都正确关闭。
                        • 确保所有的XACRO宏调用都正确无误,并且所有引用的文件路径都是正确的。

                      如果上述步骤仍然无法解决问题,可能需要更详细地检查整个XML/XACRO文件的结构,或者考虑是否有其他软件或配置问题影响了XACRO的解析。


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

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

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

                        @小伊 Traceback (most recent call last):
                        File "/opt/ros/humble/local/lib/python3.10/dist-packages/xacro/init.py", line 1012, in parse
                        inp = f = open(filename)
                        FileNotFoundError: [Errno 2] No such file or directory: '/home/phx/chapt7/ros2bookcode/chapt6/chapt6_ws/src/fishbot_description/urdf/first_robot.xacro'

                        During handling of the above exception, another exception occurred:

                        Traceback (most recent call last):
                        File "/opt/ros/humble/local/lib/python3.10/dist-packages/xacro/init.py", line 1119, in _process
                        doc = process_file(input_file_name, **opts)
                        File "/opt/ros/humble/local/lib/python3.10/dist-packages/xacro/init.py", line 1096, in process_file
                        doc = parse(None, input_file_name)
                        File "/opt/ros/humble/local/lib/python3.10/dist-packages/xacro/init.py", line 1016, in parse
                        raise XacroException(e.strerror + ": " + e.filename, exc=e)
                        xacro.XacroException: No such file or directory: /home/phx/chapt7/ros2bookcode/chapt6/chapt6_ws/src/fishbot_description/urdf/first_robot.xacro [Errno 2] No such file or directory: '/home/phx/chapt7/ros2bookcode/chapt6/chapt6_ws/src/fishbot_description/urdf/first_robot.xacro'

                        During handling of the above exception, another exception occurred:

                        Traceback (most recent call last):
                        File "/opt/ros/humble/bin/xacro", line 33, in <module>
                        sys.exit(load_entry_point('xacro==2.0.8', 'console_scripts', 'xacro')())
                        File "/opt/ros/humble/local/lib/python3.10/dist-packages/xacro/init.py", line 1171, in main
                        _process(input_file_name, vars(opts))
                        File "/opt/ros/humble/local/lib/python3.10/dist-packages/xacro/init.py", line 1124, in _process
                        except xml.parsers.expat.ExpatError as e:
                        AttributeError: module 'xml' has no attribute 'parsers'

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