<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
    <xacro:macro name="generic_link" params="link_name mesh_file mass 
                                            inertia_ixx inertia_ixy inertia_ixz
                                            inertia_iyy inertia_iyz inertia_izz
                                            origin_xyz origin_rpy color_rgba enable_collision">
        <link name="${link_name}">
        <!-- 惯性参数 -->
        <inertial>
            <origin xyz="${origin_xyz}" rpy="${origin_rpy}" />
            <mass value="${mass}" />
            <inertia ixx="${inertia_ixx}" ixy="${inertia_ixy}" ixz="${inertia_ixz}"
                    iyy="${inertia_iyy}" iyz="${inertia_iyz}" izz="${inertia_izz}" />
        </inertial>
        <!-- 可视化模型 -->
        <visual>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <geometry>
            <mesh filename="${mesh_file}" />
            </geometry>
            <material name="${link_name}_material">
            <color rgba="${color_rgba}" />
            </material>
        </visual>
        <!-- 碰撞模型（与可视化模型一致） -->
        <!-- 条件生成碰撞体：仅当enable_collision=true时添加 -->
        <xacro:if value="${enable_collision}">
            <collision>
                <origin xyz="0 0 0" rpy="0 0 0" />
                <geometry>
                    <cylinder radius="0.05" length="0.03"/>
                </geometry>
                <material name="blue">
                    <color rgba="0.1 0.1 1.0 0.5" />
                </material>
            </collision>
        </xacro:if>

        </link>

        <!-- 仅当启用碰撞时，添加碰撞物理参数 -->
        <xacro:if value="${enable_collision}">
            <gazebo reference="${link_name}">
                <collision>
                    <surface>
                        <contact>
                            <ode>
                                <kp>1e3</kp>          <!-- 刚度：1e6~1e8（根据质量调整） -->
                                <kd>1e2</kd>          <!-- 阻尼：与kp比例1:100左右 -->
                                <mu1>0.8</mu1>        <!-- 静摩擦系数：0.5~1.0 -->
                                <mu2>0.8</mu2>        <!-- 动摩擦系数：与mu1接近 -->
                                <min_depth>0.001</min_depth>  <!-- 允许微小穿透，减少抖动 -->
                            </ode>
                        </contact>
                        <bounce>
                            <restitution_coefficient>0.0</restitution_coefficient>  <!-- 反弹系数0 -->
                            <threshold>10000.0</threshold>  <!-- 阈值设大，确保所有碰撞都不反弹 -->
                        </bounce>
                    </surface>
                </collision>
            </gazebo>
        </xacro:if>

    </xacro:macro>
</robot>