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

    xacro简化urdf

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

      按照b站鱼香ros ros2仿真教程进行学习时,遇到报错。

      <?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">
              <!--机器人的IMU部件,惯性测量传感器-->
              <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 1.0 0.5"/>
                      </material>
                  </visual>    
              </link>
      
          </xacro:macro>
         
          <!--机器人的关节,用于组合机器人的部件-->
          <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: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>
      

      849a5235-eab6-4a3b-bb91-c795df2fced3-图片.png

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

        在你提供的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