ros创建xacro模型

29 篇文章 4 订阅

环境:ubuntu18

xacro编辑

源文件概览:

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:

变量部分:

    <!-- PROPERTY -->
    <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"/>

颜色预定义:

    <!-- COLORS -->
    <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>

宏定义部分:
分别有电机、驱动轮、支撑轮、底盘、铜柱。


    <!-- MOTOR -->
    <xacro:macro name="motor" params="prefix reflect">
        <joint name="${prefix}_motor_joint" type="fixed">

        </joint>

        <link name="${prefix}_motor_link">

        </link>
    </xacro:macro>

    <!-- WHEEL -->
    <xacro:macro name="wheel" params="prefix reflect">
        <joint name="${prefix}_wheel_joint" type="continuous">

        </joint>

        <link name="${prefix}_wheel_link">

        </link>
    </xacro:macro>

    <!-- CASTER -->
    <xacro:macro name="caster" params="prefix reflect">
        <joint name="${prefix}_caster_joint" type="fixed">

        </joint>

        <link name="${prefix}_caster_link">

        </link>
    </xacro:macro>

    <!-- PLATE -->
    <xacro:macro name="plate" params="prefix">
        <joint name="plate_${prefix}_joint" type="fixed">

        </joint>

        <link name="plate_${prefix}_link">

        </link>
    </xacro:macro>

    <!-- mrobot_standoff_2in -->
    <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文件:

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">

    <!-- PROPERTY -->
    <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"/>

    <!-- COLORS -->
    <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>


    <!-- MOTOR -->
    <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>
                    <cylinder radius="${motor_radius}" length = "${motor_length}"/>
                </geometry>
                <material name="gray" />
            </visual>
        </link>
    </xacro:macro>

    <!-- WHEEL -->
    <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>
                    <cylinder radius="${wheel_radius}" length = "${wheel_length}"/>
                </geometry>
                <material name="while" />
            </visual>
        </link>
    </xacro:macro>

    <!-- CASTER -->
    <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>

    <!-- PLATE -->
    <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>

    <!-- mrobot_standoff_2in -->
    <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>
    <!-- BASE -->
    <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调用:

<?xml version="1.0"?>
<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)" />

	<!-- 设置GUI参数,显示关节控制插件 -->
    <param name="use_gui" value="$(arg gui)"/>

    <!-- 运行joint_state_publisher节点,发布机器人的关节状态  -->
    <node name="joint_state_publisher_gui" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" />
    <!-- 运行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 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:

<?xml version="1.0"?>
<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:

<?xml version="1.0"?>
<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/>
    
	<!-- laser -->
	<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:这个文件与原来的内容相同,只需要修改相应文件的路径即可。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值