1. 程式人生 > 實用技巧 >模組化生成SDF模型: xacro4sdf的簡單介紹

模組化生成SDF模型: xacro4sdf的簡單介紹

1. SDF建模簡介

在使用ROS進行機器人開發的時候,模擬是非常重要的一個環境,而Gazebo是與ROS相容性最好的模擬器之一。在使用Gazebo模擬的時候,需要先對環境和機器人進行建模,而Gazebo模擬建模的標準格式就是SDF(sdformat),ROS中機器人的描述標準格式為URDF,兩者均採用xml語言,在一定程度上具有一定相似性,但是是不相容的。至於SDF與URDF的選擇,以及為什麼選擇SDF,可以參考 小明工坊 的文章,總結的非常好,這裡不再重複。

SDF檔案採用xml語言編寫,直接編寫sdf檔案非常不友好。

URDF也是採用xml語言編寫,但是採用xacro工具,可以定義巨集變數與巨集模組,然後複用這些變數和巨集模組,基於巨集的方式的使得編寫xml變得相對友好,既減少了程式碼量,又節省了建模時間。

  • 先編寫robot.xacro,然後使用xacro工具,解析生成robot.urdf檔案。

不幸的是xacro不支援sdf檔案的巨集定義的書寫,小明工坊 提到的ERB:模組化生成SDF模型的方法是基於ERB的方案,明顯感覺不如xacro使用方便,然後目前網上也沒發現有為sdf開發出一個類似於xacro的外掛,於是,自己動手,豐衣足食,便由此產生了xacro4sdf外掛。

2 xacro4sdf的安裝

pip安裝方式

#install by pip
pip install xacro4sdf 

原始碼安裝方式

# install from source code
git clone https://github.com/gezp/xacro4sdf.git
cd xacro4sdf && sudo python3 setup.py install

3 xacro4sdf的簡單介紹

xacro4sdf支援類似於xacro的Properties和Macros的功能,通過定義巨集,然後使用巨集,極大複用了程式碼,即減少了程式碼量,又節省了建模時間。雖然xacro4sdf開發靈感來源於xacro,但是使用API完全不同於xacro,一方面功能相對更加少,不支援block引數等,另一方面使用相對也更加簡單。<br />xacro4sdf支援tag

  • <xacro_define_property> :變數定義
  • <xacro_define_macro> :巨集模組定義
  • <xacro_macro> :巨集模組使用
  • <xacro_include_definition> :引用其他檔案中的<xacro_define_property><xacro_define_macro>
  • <xacro_include_model> :引用其他檔案中的model,即<model>...</model>之間的內容。(不推薦使用)

xacro4sdf支援${xxx}方式的數學表示式

  • 與xacro使用方式類似。

xacro4sdf還提供了一些預定義的巨集,可直接使用

<!--macro defination:inertia-->
<xacro_define_macro name="inertia_cylinder" params="m r l">
<xacro_define_macro name="inertia_box" params="m x y z">
<xacro_define_macro name="inertia_sphere" params="m r">
<!--macro defination:geometry-->
<xacro_define_macro name="geometry_cylinder" params="r l">
<xacro_define_macro name="geometry_box" params="x y z">
<xacro_define_macro name="geometry_sphere" params="r">
<xacro_define_macro name="geometry_mesh" params="uri">
<!--macro defination:visual_collision_with_mesh-->
<xacro_define_macro name="visual_collision_with_mesh" params="prefix uri">

4 xacro4sdf的簡單使用

首先編寫一個sdf.model.xacro檔案(必須.xacro結尾)

<?xml version="1.0"?>
<sdf version="1.7">
    <!--definition of property-->
    <xacro_define_property name="h" value="0.2" />
    <xacro_define_property name="mass" value="0.2" />
    <!--definition of macro-->
        <xacro_define_macro macro_name="inertia_box" params="m x y z">
        <mass>${m}</mass>
        <inertia>
            <ixx>${m*(y*y+z*z)/12}</ixx>
            <ixy>0</ixy>
            <ixz>0</ixz>
            <iyy>${m*(x*x+z*z)/12}</iyy>
            <iyz>0</iyz>
            <izz>${m*(x*x+y*y)/12}</izz>
        </inertia>
        </xacro_define_macro>
    <!--rplidar a2-->
    <model name='rplidar_a2'>
        <link name="link">
            <inertial>
                <pose>0 0 0.02 0 0 0</pose>
                <xacro_macro name="inertia_box" m="0.5" x="${h}" y="${h+0.1}" z="${2*h}"/>
            </inertial>
            <collision name="collision">
                <xacro_macro name="geometry_mesh" uri="model://rplidar_a2/meshes/rplidar_a2.dae"/>
            </collision>
            <visual name="visual">
                <xacro_macro name="geometry_mesh" uri="model://rplidar_a2/meshes/rplidar_a2.dae"/>
            </visual>
        </link>
    </model>
</sdf>      
  • 其中inertia_boxgeometry_mesh 為預定義好的巨集,可直接使用,這裡重新定義了巨集inertia_box ( 即覆蓋了預定義的巨集,這裡只是為了演示<xacro_define_macro>的使用)

使用xacro4sdf進行轉化

xacro4sdf model.sdf.xacro

生成的model.sdf結果如下

<?xml version="1.0" encoding="UTF-8"?>
<!-- =================================================================================== -->
<!-- |    This document was autogenerated by xacro4sdf from model.sdf.xacro            | -->
<!-- |    EDITING THIS FILE BY HAND IS NOT RECOMMENDED                                 | -->
<!-- =================================================================================== -->
<sdf version="1.7">
  <!--definition of property-->
  <!--definition of macro-->
    <!--rplidar a2-->
    <model name="rplidar_a2">
        <link name="link">
            <inertial>
                <pose>0 0 0.02 0 0 0</pose>
                <mass>0.5</mass>
                <inertia>
                    <ixx>0.01041666666666667</ixx>
                    <ixy>0</ixy>
                    <ixz>0</ixz>
                    <iyy>0.008333333333333335</iyy>
                    <iyz>0</iyz>
                    <izz>0.005416666666666668</izz>
                </inertia>
            </inertial>
            <collision name="collision">
                <geometry>
                    <mesh>
                        <uri>model://rplidar_a2/meshes/rplidar_a2.dae</uri>
                    </mesh>
                </geometry>
            </collision>
            <visual name="visual">
                <geometry>
                    <mesh>
                        <uri>model://rplidar_a2/meshes/rplidar_a2.dae</uri>
                    </mesh>
                </geometry>
            </visual>
        </link>
    </model>
</sdf>

5. 最後

SDF建模小Tip:

  • 先使用SW,blender等3D建模工具進行建模,然後再把各個模組(依照可活動關節分離)匯出STL或dea檔案。
  • 然後編寫SDF檔案(採用xacro4sdf 巨集工具可簡化SDF檔案編寫),使用xacro4sdf可輕鬆採用模組化的建模方式,可分成幾個檔案分別構建模組,然後再進行組裝。



如果你覺得xacro4sdf工具對你有用的話,希望可以在GitHub上給一個star. (●'◡'●)