环境:ubuntu18
源文件概览:
ubuntu@ubuntu-vpv:~/mybot_ws$ tree src/
src/
├── CMakeLists.txt -> /opt/ros/melodic/share/catkin/cmake/toplevel.cmake
└── mybot_description
├── CMakeLists.txt
├── config
│ └── mybot_urdf.rviz
├── launch
│ └── xacro
│ └── display_mybot_base_xacro.launch
├── package.xml
└── urdf
├── urdf
│ └── mybot_base.urdf
└── xacro
├── mybot_base.xacro
└── mybot.xacro
mybot
机器人描述功能包包catkin_creat_pkg mybot_description urdf xacro
catkin_make
source devel/setup.bash
mybot_base.xacro
:变量部分:
<xacro:property name="M_PI" value="3.14159"/>
<xacro:property name="wheel_radius" value="0.033"/>
<xacro:property name="wheel_length" value="0.017"/>
<xacro:property name="base_link_radius" value="0.13"/>
<xacro:property name="base_link_length" value="0.005"/>
<xacro:property name="motor_radius" value="0.02"/>
<xacro:property name="motor_length" value="0.08"/>
<xacro:property name="motor_x" value="-0.055"/>
<xacro:property name="motor_y" value="0.075"/>
<xacro:property name="plate_height" value="0.07"/>
<xacro:property name="standoff_x" value="0.12"/>
<xacro:property name="standoff_y" value="0.10"/>
颜色预定义:
<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>
<material name="white">
<color rgba="1 1 1 0.9"/>
material>
宏定义部分:
分别有电机、驱动轮、支撑轮、底盘、铜柱。
<xacro:macro name="motor" params="prefix reflect">
<joint name="${prefix}_motor_joint" type="fixed">
joint>
<link name="${prefix}_motor_link">
link>
xacro:macro>
<xacro:macro name="wheel" params="prefix reflect">
<joint name="${prefix}_wheel_joint" type="continuous">
joint>
<link name="${prefix}_wheel_link">
link>
xacro:macro>
<xacro:macro name="caster" params="prefix reflect">
<joint name="${prefix}_caster_joint" type="fixed">
joint>
<link name="${prefix}_caster_link">
link>
xacro:macro>
<xacro:macro name="plate" params="prefix">
<joint name="plate_${prefix}_joint" type="fixed">
joint>
<link name="plate_${prefix}_link">
link>
xacro:macro>
<xacro:macro name="mrobot_standoff_2in" params="parent number x_loc y_loc z_loc">
<joint name="standoff_2in_${number}_joint" type="fixed">
joint>
<link name="standoff_2in_${number}_link">
link>
xacro:macro>
通过宏定义出来需要的部件:
<motor prefix="left" reflect="-1"/>
<motor prefix="right" reflect="1"/>
<wheel prefix="left" reflect="-1"/>
<wheel prefix="right" reflect="1"/>
<caster prefix="front" reflect="1"/>
<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}"/>
<plate prefix="1"/>
<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 prefix="2"/>
完整的mybot_base.xacro
文件:
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
<xacro:property name="M_PI" value="3.14159"/>
<xacro:property name="wheel_radius" value="0.033"/>
<xacro:property name="wheel_length" value="0.017"/>
<xacro:property name="base_link_radius" value="0.13"/>
<xacro:property name="base_link_length" value="0.005"/>
<xacro:property name="motor_radius" value="0.02"/>
<xacro:property name="motor_length" value="0.08"/>
<xacro:property name="motor_x" value="-0.055"/>
<xacro:property name="motor_y" value="0.075"/>
<xacro:property name="plate_height" value="0.07"/>
<xacro:property name="standoff_x" value="0.12"/>
<xacro:property name="standoff_y" value="0.10"/>
<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>
<material name="white">
<color rgba="1 1 1 0.9"/>
material>
<xacro:macro name="motor" params="prefix reflect">
<joint name="${prefix}_motor_joint" type="fixed">
<origin xyz="${motor_x} ${reflect*motor_y} 0" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="${prefix}_motor_link"/>
<axis xyz="0 1 0"/>
joint>
<link name="${prefix}_motor_link">
<visual>
<origin xyz="0 0 0" rpy="${M_PI/2} 0 0" />
<geometry>
geometry>
<material name="gray" />
visual>
link>
xacro:macro>
<xacro:macro name="wheel" params="prefix reflect">
<joint name="${prefix}_wheel_joint" type="continuous">
<origin xyz="0 ${reflect*(motor_length+wheel_length)/2} 0" rpy="0 0 0"/>
<parent link="${prefix}_motor_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>
geometry>
<material name="while" />
visual>
link>
xacro:macro>
<xacro:macro name="caster" params="prefix reflect">
<joint name="${prefix}_caster_joint" type="fixed">
<origin xyz="${reflect*(base_link_radius-wheel_radius/2)} 0 -${wheel_radius/2}" 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="${M_PI/2} 0 0" />
<geometry>
<sphere radius="${wheel_radius/2}"/>
geometry>
<material name="black" />
visual>
link>
xacro:macro>
<xacro:macro name="plate" params="prefix">
<joint name="plate_${prefix}_joint" type="fixed">
<origin xyz="0 0 ${prefix*plate_height}" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="plate_${prefix}_link"/>
<axis xyz="0 1 0"/>
joint>
<link name="plate_${prefix}_link">
<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>
link>
xacro:macro>
<xacro:macro name="mrobot_standoff_2in" params="parent number x_loc y_loc z_loc">
<joint name="standoff_2in_${number}_joint" type="fixed">
<origin xyz="${x_loc} ${y_loc} ${z_loc}" rpy="0 0 0" />
<parent link="${parent}"/>
<child link="standoff_2in_${number}_link" />
joint>
<link name="standoff_2in_${number}_link">
<visual>
<origin xyz=" 0 0 0 " rpy="0 0 0" />
<geometry>
<box size="0.01 0.01 0.07" />
geometry>
<material name="black">
<color rgba="0.16 0.17 0.15 0.9"/>
material>
visual>
link>
xacro:macro>
<xacro:macro name="mybot_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 ${wheel_radius}" 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_link_length}" radius="${base_link_radius}"/>
geometry>
<material name="yellow" />
visual>
link>
<motor prefix="left" reflect="-1"/>
<motor prefix="right" reflect="1"/>
<wheel prefix="left" reflect="-1"/>
<wheel prefix="right" reflect="1"/>
<caster prefix="front" reflect="1"/>
<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}"/>
<plate prefix="1"/>
<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 prefix="2"/>
xacro:macro>
robot>
通过顶层文件mybot.xacro
调用:
<robot name="mybot" xmlns:xacro="http://www.ros.org/wiki/xacro">
<xacro:include filename="$(find mybot_description)/urdf/xacro/mybot_base.xacro" />
<mybot_base/>
robot>
验证编辑的描述文件
$ rosrun xacro xacro mybot.xacro >../urdf/mybot_base.urdf
Deprecated: xacro tag 'mybot_base' w/o 'xacro:' xml namespace prefix (will be forbidden in Noetic)
when processing file: mybot.xacro
Use the following command to fix incorrect tag usage:
find . -iname "*.xacro" | xargs sed -i 's#<\([/]\?\)\(if\|unless\|include\|arg\|property\|macro\|insert_block\)#<\1xacro:\2#g'
$ check_urdf ../urdf/mybot_base.urdf
robot name is: mybot
---------- Successfully Parsed XML ---------------
root Link: base_footprint has 1 child(ren)
child(1): base_link
child(1): front_caster_link
child(2): left_motor_link
child(1): left_wheel_link
child(3): plate_1_link
child(4): plate_2_link
child(5): right_motor_link
child(1): right_wheel_link
child(6): standoff_2in_1_link
child(1): standoff_2in_5_link
child(7): standoff_2in_2_link
child(1): standoff_2in_6_link
child(8): standoff_2in_3_link
child(1): standoff_2in_7_link
child(9): standoff_2in_4_link
child(1): standoff_2in_8_link
display_mybot_base_xacro.launch
文件:<launch>
<arg name="model" default="$(find xacro)/xacro --inorder '$(find mybot_description)/urdf/xacro/mybot.xacro'" />
<arg name="gui" default="true" />
<param name="robot_description" command="$(arg model)" />
<param name="use_gui" value="$(arg gui)"/>
<node name="joint_state_publisher_gui" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" />
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find mybot_description)/config/mybot_urdf.rviz" />
launch>
roslaunch mybot_description display_mybot_base_xacro.launch
rviz配置文件save config as >> config/mybot_urdf.rviz
新增4个文件:
laser.xacro
,
mybot_with_laser.xacro
,
mybot_with_laser.urdf
,
display_mybot_with_laser.launch
mybot_description/
├── CMakeLists.txt
├── config
│ └── mybot_urdf.rviz
├── launch
│ └── xacro
│ ├── display_mybot_base_xacro.launch
│ └── display_mybot_with_laser.launch
├── package.xml
└── urdf
├── urdf
│ ├── mybot_base.urdf
│ └── mybot_with_laser.urdf
└── xacro
├── laser.xacro
├── mybot_base.xacro
├── mybot_with_laser.xacro
└── mybot.xacro
laser.xacro
:
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="laser">
<xacro:macro name="laser" params="prefix:=laser">
<link name="${prefix}_link">
<visual>
<origin xyz=" 0 0 0 " rpy="0 0 0" />
<geometry>
<cylinder length="0.05" radius="0.05"/>
geometry>
<material name="black"/>
visual>
link>
xacro:macro>
robot>
mybot_with_laser.xacro
:
<robot name="mybot" xmlns:xacro="http://www.ros.org/wiki/xacro">
<xacro:include filename="$(find mybot_description)/urdf/xacro/mybot_base.xacro" />
<xacro:include filename="$(find mybot_description)/urdf/xacro/laser.xacro" />
<xacro:property name="rplidar_offset_x" value="0" />
<xacro:property name="rplidar_offset_y" value="0" />
<xacro:property name="rplidar_offset_z" value="0.028" />
<mybot_base/>
<joint name="laser_joint" type="fixed">
<origin xyz="${rplidar_offset_x} ${rplidar_offset_y} ${rplidar_offset_z}" rpy="0 0 0" />
<parent link="plate_2_link"/>
<child link="laser_link"/>
joint>
<xacro:laser prefix="laser"/>
robot>
mybot_with_laser.urdf
:这个文件是通过xacro自动生成的。
display_mybot_with_laser.launch
:这个文件与原来的内容相同,只需要修改相应文件的路径即可。