使用gazebo仿真.xacro文件编写步骤

参考古月老师ROS机器人开发实践
这本书还是挺适合初学者的
1、step1
文件开头

<?xml version="1.0"?> 第一行是本文件的版本 第二行别的都不用管,唯一要注意的是name的赋值,取名字为mrobt,这个名字对其他部分有什么影响暂时不知,但其与调用这个文件的另一个.xacro名字一样。不知道是不是有什么内在联系。 2、step2 定义该机器人所用到的颜色,这里是一个宏定义,为了减少代码量
<material name="White">
    <color rgba="1 1 1 1"/>
</material>

<material name="Blue">
    <color rgba="0 0 1 1"/>
</material>

<material name="Red">
    <color rgba="1 0 0 1"/>
</material>

name指的就是颜色的名字,rgba分别是红绿蓝和透明度的值。
3、step3

<!--All units in m-kg-s-radians unit system -->
<xacro:property name="M_PI" value="3.1415926535897931" />

<!-- Main body length, width, height and mass -->
<xacro:property name="base_mass"        value="0.5" /> 
<xacro:property name="base_link_radius" value="0.13"/>
<xacro:property name="base_link_length" value="0.005"/>
<xacro:property name="motor_x" value="-0.05"/>

<!-- Caster radius and mass -->
<xacro:property name="caster_radius"          value="0.016" /> 
<xacro:property name="caster_mass"            value="0.01" /> 
<xacro:property name="caster_joint_origin_x"  value="-0.12" />

<!-- Wheel radius, height and mass -->
<xacro:property name="wheel_radius" value="0.033" /> 
<xacro:property name="wheel_height" value="0.017" />
<xacro:property name="wheel_mass"   value="0.1" />

文件所适用的参数值,本文作了简化。
4、step4 惯性矩阵求取

<xacro:macro name="sphere_inertial_matrix" params="m r">
    <inertial>
        <mass value="${m}" />
        <inertia ixx="${2*m*r*r/5}" ixy="0" ixz="0"
            iyy="${2*m*r*r/5}" iyz="0" 
            izz="${2*m*r*r/5}" />
    </inertial>
</xacro:macro>

<xacro:macro name="cylinder_inertial_matrix" params="m r h">
    <inertial>
        <mass value="${m}" />
        <inertia ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0"
            iyy="${m*(3*r*r+h*h)/12}" iyz = "0"
            izz="${m*r*r/2}" /> 
    </inertial>
</xacro:macro>

<xacro:macro name="box_inertial_matrix" params="m w h d">
    <inertial>
        <mass value="${m}" />
        <inertia ixx="${m*(h*h+d*d)/12}" ixy = "0" ixz = "0"
            iyy="${m*(w*w+d*d)/12}" iyz = "0"
            izz="${m*(w*w+h*h)/12}" /> 
    </inertial>
</xacro:macro>

简单的圆柱、球、长方体可利用公式求解,上述便是公式求解。复杂的模型可以在solidworks等三维软件中建模后利用软件本身功能计算得到。
5、step5轮子宏定义

<xacro:macro name=“wheel” params=“lr translateY”>















<cylinder_inertial_matrix m=" w h e e l m a s s " r = " {wheel_mass}" r=" wheelmass"r="{wheel_radius}" h="${wheel_height}" />

    <gazebo reference="wheel_${lr}_link">
        <material>Gazebo/Black</material>
    </gazebo>

    <joint name="base_to_wheel_${lr}_joint" type="continuous">
        <parent link="base_link"/>
        <child link="wheel_${lr}_link"/>
        <origin xyz="${motor_x} ${translateY * base_link_radius} 0" rpy="0 0 0" /> 
        <axis xyz="0 1 0" rpy="0  0" />
    </joint>

    <!-- Transmission is important to link the joints and the controller -->
    <transmission name="wheel_${lr}_joint_trans">
        <type>transmission_interface/SimpleTransmission</type>
        <joint name="base_to_wheel_${lr}_joint" />
        <actuator name="wheel_${lr}_joint_motor">
            <hardwareInterface>VelocityJointInterface</hardwareInterface>
            <mechanicalReduction>1</mechanicalReduction>
        </actuator>
    </transmission>
</xacro:macro>

具体参数含义不介绍,最后一项是机器人轮子传动模型
6、

<xacro:macro name=“mrobot_body”>







    <joint name="base_footprint_joint" type="fixed">
        <origin xyz="0 0 ${wheel_radius}" rpy="0 0 0" />
        <parent link="base_footprint"/>
        <child link="base_link" />
    </joint>

    <!-- BASE-LINK -->
    <!--Actual body/chassis of the robot-->
    <link name="base_link">
        <cylinder_inertial_matrix  m="${base_mass}" r="${base_link_radius}" h="${base_link_length}" />
        <visual>
            <origin xyz=" 0 0 0" rpy="0 0 0" />
            <geometry>
                <cylinder length="${base_link_length}" radius="${base_link_radius}"/>
            </geometry>
            <material name="yellow" />
        </visual>

        <collision>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <geometry>
                <cylinder length="${base_link_length}" radius="${base_link_radius}"/>
            </geometry>
        </collision>   
    </link>
    <gazebo reference="base_link">
        <material>Gazebo/Blue</material>
    </gazebo>

    <!-- Wheel Definitions -->
    <wheel lr="right"  translateY="1" />
    <wheel lr="left"  translateY="-1" />

    <!-- Casters Definitions -->
    <caster fb="front"  translateX="-1" />

    <!-- plates and standoff Definitions -->
    <mrobot_standoff_2in parent="base_link" number="1" x_loc="-${standoff_x/2 + 0.03}" y_loc="-${standoff_y - 0.03}" z_loc="${plate_height/2}"/>
    <mrobot_standoff_2in parent="base_link" number="2" x_loc="-${standoff_x/2 + 0.03}" y_loc="${standoff_y - 0.03}" z_loc="${plate_height/2}"/>
    <mrobot_standoff_2in parent="base_link" number="3" x_loc="${standoff_x/2}" y_loc="-${standoff_y}" z_loc="${plate_height/2}"/>
    <mrobot_standoff_2in parent="base_link" number="4" x_loc="${standoff_x/2}" y_loc="${standoff_y}" z_loc="${plate_height/2}"/>
    <mrobot_standoff_2in parent="standoff_2in_1_link" number="5" x_loc="0" y_loc="0" z_loc="${plate_height}"/>
    <mrobot_standoff_2in parent="standoff_2in_2_link" number="6" x_loc="0" y_loc="0" z_loc="${plate_height}"/>
    <mrobot_standoff_2in parent="standoff_2in_3_link" number="7" x_loc="0" y_loc="0" z_loc="${plate_height}"/>
    <mrobot_standoff_2in parent="standoff_2in_4_link" number="8" x_loc="0" y_loc="0" z_loc="${plate_height}"/>

    <!-- plate Definitions -->
    <plate num="1"  parent="base_link" />
    <plate num="2"  parent="plate_1_link" />

    <!-- controller -->
    <gazebo>
        <plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so">
            <rosDebugLevel>Debug</rosDebugLevel>
            <publishWheelTF>true</publishWheelTF>
            <robotNamespace>/</robotNamespace>
            <publishTf>1</publishTf>
            <publishWheelJointState>true</publishWheelJointState>
            <alwaysOn>true</alwaysOn>
            <updateRate>100.0</updateRate>
            <legacyMode>true</legacyMode>
            <leftJoint>base_to_wheel_left_joint</leftJoint>
            <rightJoint>base_to_wheel_right_joint</rightJoint>
            <wheelSeparation>${base_link_radius*2}</wheelSeparation>
            <wheelDiameter>${2*wheel_radius}</wheelDiameter>
            <broadcastTF>1</broadcastTF>
            <wheelTorque>30</wheelTorque>
            <wheelAcceleration>1.8</wheelAcceleration>
            <commandTopic>cmd_vel</commandTopic>
            <odometryFrame>odom</odometryFrame> 
            <odometryTopic>odom</odometryTopic> 
            <robotBaseFrame>base_footprint</robotBaseFrame>
        </plugin>
    </gazebo> 

</xacro:macro>

这才是主体,最后一项有不明白的可以看看机器人底盘差分运动模型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值