URDF模型
xacro优化后的URDF模型
1.精简模型代码(创建宏定义,文件包含)
2.提供可编程接口(常量,变量,数学计算,条件语句)
常量定义:
name:base_length的值value定义为0.16,之后被使用:$(base_length/2 + caster_radius*2)。
数学计算:
宏定义:
其中宏定义params = "prefix reflect",宏调用prefix = "left" reflect = "-1"。
文件包含:
xacro文件支持文件包含。
优化后的xacro文件(mbot_base.xacro)
<?xml version="1.0"?> <robot name="mbot" xmlns:xacro="http://www.ros.org/wiki/xacro"> <!-- PROPERTY LIST --> <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"/> <!-- wheel_radius - ( base_length/2 - wheel_joint_z) --> <xacro:property name="caster_joint_x" value="0.18"/> <!-- Defining the colors used in this robot --> <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> <!-- Macro for robot wheel --> <xacro:macro name="wheel" params="prefix reflect"> <joint name="${prefix}_wheel_joint" type="continuous"> <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> <!-- Macro for robot caster --> <xacro:macro name="caster" params="prefix reflect"><!-- 宏定义 --> <joint name="${prefix}_caster_joint" type="continuous"> <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> <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"> <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>
不过还需要一个上层文件(mbot.xacro),以上文件只相当于一个类文件。
<?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>
为什么要有上层文件?可将机器人底盘作为一个零部件,一个宏定义。
模型显示:
1.将xacro文件转换为URDF文件
生成mbot.urdf文件。
2.直接调用xacro文件解析器
在display_mbot_base_xacro.launch文件中直接写入解析器
将mbot.xacro 的解析结果放入robot_description参数中去。
<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>
运行