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

    如何得到惯性参数

    已定时 已固定 已锁定 已移动 未解决
    综合问题
    ros gazebo 惯性参数
    3
    3
    627
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 守守
      守
      最后由 编辑

      各位大佬,我目前手上有一个车,想要建立它的gazebo模型,但是因为这个车各个部件不是标准的几何体,所以想要请问计算它的惯性参数。
      我看了gazebo官方推荐的meshlab工具进行参数计算的教程和其他博客,并且实际使用了,但是效果非常不好。
      是否可以使用solidworks得到比较精确的惯性参数,或者有一些比较好的方法可以得到惯性参数?
      比如turtlebot3的主体部分的惯性参数,它的模型图如下:
      ea14b447-7d36-4a61-96bb-4ed3a62e5463-image.png
      如何计算它的惯性参数。
      请问各位大佬在做项目时进行gazebo仿真时,需要惯性参数时是如何处理的。
      希望大佬们可以解答,十分感谢!!!

      小鱼小 吴凯荣吴 2 条回复 最后回复 回复 引用 0
      • 小鱼小
        小鱼 技术大佬 @守
        最后由 编辑

        @守 一般我们会将其看作一个圆柱体之类的近似标准体,接着就可以计算惯性参数了

        之前小鱼做了一键安装,节省了不少小伙伴的时间来追求爱情,成功脱单 今年七夕小鱼没啥好送的,送你一个URDF模板,

        地址在: https://fishros.com/d2lros2/#/humble/codebook/urdf/xacro

        原文如下

        URDF默认格式是纯文本的,我们并不能在其中加入计算公式和定义,用URDF定义一个机器人模型会导致整个文件非常冗长,使用Xacro工具可以解决这个问题。

        Xacro是urdf的定义和生成工具,你按照Xacro提供的方式定义可以复用的模型描述块,之后就可以直接调用这些描述,最后使用xacro指令生成最终的urdf模型了。

        1.添加模板

        小鱼这里提供了常用的xacro描述定义的代码块,你可以直接引入的你的工程里进行使用。

        在你的功能包里新建xacro_template.xacro文件,复制粘贴下面的内容到其中。

        <?xml version="1.0"?>
        <robot xmlns:xacro="http://ros.org/wiki/xacro" xmlns:fishros="http://fishros.com">
          <xacro:macro name="box_inertia" params="m w h d">
            <inertial>
              <origin xyz="0 0 0" rpy="${pi/2} 0 ${pi/2}"/>
              <mass value="${m}"/>
              <inertia ixx="${(m/12) * (h*h + d*d)}" ixy="0.0" ixz="0.0" iyy="${(m/12) * (w*w + d*d)}" iyz="0.0" izz="${(m/12) * (w*w + h*h)}"/>
            </inertial>
          </xacro:macro>
        
          <xacro:macro name="cylinder_inertia" params="m r h">
            <inertial>
              <origin xyz="0 0 0" rpy="${pi/2} 0 0" />
              <mass value="${m}"/>
              <inertia ixx="${(m/12) * (3*r*r + h*h)}" ixy = "0" ixz = "0" iyy="${(m/12) * (3*r*r + h*h)}" iyz = "0" izz="${(m/2) * (r*r)}"/>
            </inertial>
          </xacro:macro>
        
          <xacro:macro name="sphere_inertia" params="m r">
            <inertial>
              <mass value="${m}"/>
              <inertia ixx="${(2/5) * m * (r*r)}" ixy="0.0" ixz="0.0" iyy="${(2/5) * m * (r*r)}" iyz="0.0" izz="${(2/5) * m * (r*r)}"/>
            </inertial>
          </xacro:macro>
        
          <xacro:macro name="sphere_visual" params="r origin_r origin_p origin_y">
            <visual>
              <origin xyz="0 0 0" rpy="${origin_r} ${origin_p} ${origin_y}"/>
              <geometry>
                  <sphere radius="${r}"/>
              </geometry>
              <material name="blue">
                <color rgba="0.0 0.0 0.8 1.0"/>
              </material> 
            </visual>
          </xacro:macro>
        
        <xacro:macro name="sphere_collision" params="r origin_r origin_p origin_y">
            <collision>
              <origin xyz="0 0 0" rpy="${origin_r} ${origin_p} ${origin_y}"/>
              <geometry>
                  <sphere radius="${r}"/>
              </geometry>
                <material name="green">
                    <color rgba="0.0 0.8 0.0 1.0"/>
                </material>
            </collision>
        </xacro:macro>
        
        
        <xacro:macro name="box_visual" params="w d h origin_r origin_p origin_y">
            <visual>
              <origin xyz="0 0 0" rpy="${origin_r} ${origin_p} ${origin_y}"/>
              <geometry>
                  <box size="${w} ${d} ${h}" />
              </geometry>
              <material name="blue">
                <color rgba="0.0 0.0 0.8 1.0"/>
              </material> 
            </visual>
        </xacro:macro>
        
        <xacro:macro name="box_collision" params="w d h origin_r origin_p origin_y">
            <collision>
              <origin xyz="0 0 0" rpy="${origin_r} ${origin_p} ${origin_y}"/>
              <geometry>
                  <box size="${w} ${d} ${h}" />
              </geometry>
                <material name="green">
                    <color rgba="0.0 0.8 0.0 1.0"/>
                </material>
            </collision>
        </xacro:macro>
        
        
        <xacro:macro name="cylinder_visual" params="r h origin_r origin_p origin_y">
            <visual>
              <origin xyz="0 0 0" rpy="${origin_r} ${origin_p} ${origin_y}"/>
              <geometry>
                 <cylinder length="${h}" radius="${r}"/>
              </geometry>
              <material name="blue">
                <color rgba="0.0 0.0 0.8 1.0"/>
              </material> 
            </visual>
        </xacro:macro>
        
        
        <xacro:macro name="cylinder_collision" params="r h origin_r origin_p origin_y">
            <collision>
              <origin xyz="0 0 0" rpy="${origin_r} ${origin_p} ${origin_y}"/>
              <geometry>
                 <cylinder length="${h}" radius="${r}"/>
              </geometry>
              <material name="blue">
                <color rgba="0.0 0.0 0.8 1.0"/>
              </material> 
            </collision>
        </xacro:macro>
        
        
        </robot>
        

        2.使用模板生成URDF

        接着你可以新建你的机器人模型描述文件,比如fishbot.urdf.xacro,之后你就可以在你的描述文件中调用小鱼提供的模板,快速的定义机器人。

        比如创建一个正方体的base_link,并导入惯性矩阵。

        <?xml version="1.0"?>
        <robot name="fishbot" xmlns:xacro="http://ros.org/wiki/xacro">
          <xacro:include filename="xacro_template.xacro" />
        
          <link name="base_link">
            <xacro:box_visual w="0.809" d="0.5" h="0.1" origin_r="0" origin_p="0" origin_y="0"/>
            <xacro:box_collision w="0.809" d="0.5" h="0.1" origin_r="0" origin_p="0" origin_y="0"/>
            <xacro:box_inertia m="1.0" w="0.809" d="0.5" h="0.1"/>
          </link>
        
        </robot>
        

        上面w,d,h,代表长宽高,m代表质量。 <xacro:include filename="xacro_template.xacro" />用于引入小鱼提供的模板。

        接着我们就可以通过xacro指令将其变成正常的urdf,打开终端,进入fishbot.urdf.xacro同级目录,输入指令xacro fishbot.urdf.xacro -o fishbot.urdf,即可生成fishbot.urdf,正常生成后的内容如下。

        <?xml version="1.0" ?>
        <!-- =================================================================================== -->
        <!-- |    This document was autogenerated by xacro from fishbot.urdf.xacro             | -->
        <!-- |    EDITING THIS FILE BY HAND IS NOT RECOMMENDED                                 | -->
        <!-- =================================================================================== -->
        <robot name="fishbot" xmlns:fishros="http://fishros.com">
          <link name="base_link">
            <visual>
              <origin rpy="0 0 0" xyz="0 0 0"/>
              <geometry>
                <box size="0.809 0.5 0.1"/>
              </geometry>
              <material name="blue">
                <color rgba="0.0 0.0 0.8 1.0"/>
              </material>
            </visual>
            <collision>
              <origin rpy="0 0 0" xyz="0 0 0"/>
              <geometry>
                <box size="0.809 0.5 0.1"/>
              </geometry>
              <material name="green">
                <color rgba="0.0 0.8 0.0 1.0"/>
              </material>
            </collision>
            <inertial>
              <origin rpy="1.5707963267948966 0 1.5707963267948966" xyz="0 0 0"/>
              <mass value="1.0"/>
              <inertia ixx="0.021666666666666667" ixy="0.0" ixz="0.0" iyy="0.07537341666666666" iyz="0.0" izz="0.055373416666666675"/>
            </inertial>
          </link>
        </robot>
        

        这就是xacro的神奇之处,将短短的三行定义根据规则生成长长的URDF,关于xacro的详细使用可以参考 http://ros.org/wiki/xacro 。

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

        1 条回复 最后回复 回复 引用 1
        • 吴凯荣吴
          吴凯荣 @守
          最后由 编辑

          @守 总的来说好像没有特别好的方案,并且考虑到后续仿真计算的复杂性,一般都会对机器人的碰撞模型,以简单几何体进行替换,而简单几何体则具有对应的惯量计算公式

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