ROS-UDRF robot model optimization (xacro)

The deficiencies of the UDRF robot model

Reference link for the realization of UDRF robot model:
https://blog.csdn.net/qq_43279579/article/details/114991696

  • Long model with too much repetition
  • Parameter modification is troublesome and not convenient for secondary development
  • No parameter calculation function

Optimized realization of UDRF robot model

Advantages of xacro model

  • Streamline model code
    • Create macro definition
    • File contains
  • Provide programmable interface
    • constant
    • variable
    • Mathematical calculation
    • Conditional statements

How to use xacro

1. Constant definition

<!--name是定义的常量名,value是常量的值-->
<xacro:property name="M_PI" value="3.14159"/>

2. Constant use

<!--常量 ${ } 在括号里使用常量 在括号里面可以进行运算-->
<origin xyz="0 0 0" rpy="${M_PI/2} 0 0"/>

3. Mathematical calculation

<!--括号里面可以进行运算-->
<origin xyz="0 ${(motor_length+wheel_length)/2} 0" rpy="0 0 0"/>

注意:
All mathematical operations will be converted into floating point numbers to ensure the accuracy of the operations

4. Macro definition

<!--name是宏定义的名字类似函数名,params是类似函数参数,可以是字符串-->
<xacro:macro name="name" params="A B C">
   ......具体模型定义(类似函数内容)
</xacro:macro>

5. Macro call

<!--A_value,B_value,C_value是宏的名称-->
<name A="A_value" B="B_value" C="C_value" />

6. File contains

<!--$(find+功能包)=包的具体路径-->
<xacro:include filename="$(find mbot_descripiton)/urdf/xacro/mbot_base.xacro" />

xacro creates a car robot

Edit xacro robot model

1.xacro robot model related settings

cd ~/catkin_ws/src/mbot_description/urdf
mkdir xacro
cd xacro
sudo gedit mbot_base.xacro 

mbot_base.xacro file content

<!--声明xml文件及版本-->
<?xml version="1.0"?>
<robot name="mbot" xmlns:xacro="http://www.ros.org/wiki/xacro">
	<!--定义相关机器人常量-->
    <xacro:property name="M_PI" value="3.1415926"/>
    <xacro:property name="base_radius" value="0.20"/>
    <xacro:property name="base_length" value="0.16"/>

    <xacro:property name="wheel_radius" value="0.06"/>
    <xacro:property name="wheel_length" value="0.025"/>
    <xacro:property name="wheel_joint_y" value="0.19"/>
    <xacro:property name="wheel_joint_z" value="0.05"/>

    <xacro:property name="caster_radius" value="0.015"/> 
    <xacro:property name="caster_joint_x" value="0.18"/>
   <!--定义相关机器人颜色常量-->
    <material name="yellow">
        <color rgba="1 0.4 0 1"/>
    </material>
    <material name="black">
        <color rgba="0 0 0 0.95"/>
    </material>
    <material name="gray">
        <color rgba="0.75 0.75 0.75 1"/>
    </material>
    <!--定义驱动轮的宏定义--> 
    <!--prefix(左轮还是右轮) reflect(镜像关系)-->
    <xacro:macro name="wheel" params="prefix reflect">
        <joint name="${prefix}_wheel_joint" type="fixed">
            <origin xyz="0 ${reflect*wheel_joint_y} ${-wheel_joint_z}" rpy="0 0 0"/>
            <parent link="base_link"/>
            <child link="${prefix}_wheel_link"/>
            <axis xyz="0 1 0"/>
        </joint>

        <link name="${prefix}_wheel_link">
            <visual>
                <origin xyz="0 0 0" rpy="${M_PI/2} 0 0" />
                <geometry>
                    <cylinder radius="${wheel_radius}"  length = "${wheel_length}"/>
                </geometry>
                <material name="gray" />
            </visual>
        </link>
    </xacro:macro>
   <!--定义支撑轮的宏定义-->
   <!--prefix(前轮还是后轮) reflect(镜像关系)-->
    <xacro:macro name="caster" params="prefix reflect">
        <joint name="${prefix}_caster_joint" type="fixed">
            <origin xyz="${reflect*caster_joint_x} 0 ${-(base_length/2 + caster_radius)}" rpy="0 0 0"/>
            <parent link="base_link"/>
            <child link="${prefix}_caster_link"/>
            <axis xyz="0 1 0"/>
        </joint>

        <link name="${prefix}_caster_link">
            <visual>
                <origin xyz="0 0 0" rpy="0 0 0"/>
                <geometry>
                    <sphere radius="${caster_radius}" />
                </geometry>
                <material name="black" />
            </visual>
        </link>
    </xacro:macro>
    <!--定义主体base -->
        <xacro:macro name="mbot_base">  <!-- 宏定义 -->
        <link name="base_footprint">   <!-- 主要作用可以修改机器人主体的整体位置 -->
            <visual>
                <origin xyz="0 0 0" rpy="0 0 0" />
                <geometry>
                    <box size="0.001 0.001 0.001" />
                </geometry>
            </visual>
        </link>

        <joint name="base_footprint_joint" type="fixed"><!-- 让机器人的base_link上移,至车轮与水平线平齐 -->
            <origin xyz="0 0 ${base_length/2 + caster_radius*2}" rpy="0 0 0" />        
            <parent link="base_footprint"/>
            <child link="base_link" />
        </joint>

        <link name="base_link">
            <visual>
                <origin xyz=" 0 0 0" rpy="0 0 0" />
                <geometry>
                    <cylinder length="${base_length}" radius="${base_radius}"/>
                </geometry>
                <material name="yellow" />
            </visual>
        </link>

        <wheel prefix="left" reflect="-1"/> <!-- 调用驱动轮子宏定义 -->
        <wheel prefix="right" reflect="1"/> <!-- 调用驱动轮子宏定义 -->

        <caster prefix="front" reflect="-1"/> <!-- 调用支撑轮子宏定义 -->
        <caster prefix="back" reflect="1"/> <!-- 调用支撑轮子宏定义 -->
    </xacro:macro>
</robot>
sudo gedit mbot.xacro

mbot.xacro file content

<?xml version="1.0"?>
<robot name="arm" xmlns:xacro="http://www.ros.org/wiki/xacro">
    <xacro:include filename="$(find mbot_description)/urdf/xacro/mbot_base.xacro" /> <!-- 包含文件 -->
    <mbot_base/>    <!-- 调用宏定义 -->
</robot>
cd ~/catkin_ws/src/mbot_description/launch
mkdir xacro
cd xacro
sudo gedit display_mbot_base_xacro.launch

display_mbot_base_xacro.launch file content

<launch>
	<arg name="model" default="$(find xacro)/xacro --inorder '$(find mbot_description)/urdf/xacro/mbot.xacro'" />
	<arg name="gui" default="true" />
	<param name="robot_description" command="$(arg model)" />
    <!-- 设置GUI参数,显示关节控制插件 -->
	<param name="use_gui" value="$(arg gui)"/>
    <!-- 运行joint_state_publisher节点,发布机器人的关节状态  -->
	<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
	<!-- 运行robot_state_publisher节点,发布tf  -->
	<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
    <!-- 运行rviz可视化界面 -->
	<node name="rviz" pkg="rviz" type="rviz" args="-d $(find mbot_description)/config/mbot.rviz" required="true" />
</launch>

问题说明
The problem in the picture appear Insert picture description here
Solution:
The mbot_base.xacrofile jointlabel typerevised tofixed

Startup model is displayed in rviz

Check the display

roslaunch mbot_description display_mbot_base_xacro.launch

Insert picture description here

summary

By optimizing the URDF model through xacro, it is found that this greatly simplifies the amount of code and makes it easier to modify the code. In addition, the code will be more specific and organized.

Reference link

1. UDRF optimization—XACRO
2. The namespace problem leads to No transform from […_link] to [base_link]

Guess you like

Origin blog.csdn.net/qq_43279579/article/details/115012425