xacro搭建ros仿真机器人(待更新)

发布于:2023-01-03 ⋅ 阅读:(203) ⋅ 点赞:(0)

Rviz和Gazebo中的效果:

 


关于urdf和xacro的基于语法及使用可看之前的博客以及ros wiki上的教程:

ROS仿真机器人---URDF的XML格式描述学习笔记(wiki教程)_芃晟的博客-CSDN博客

urdf/XML - ROS Wiki


目录

一、具体的步骤:

二、搭建xacro模型


一、具体的步骤:

  1. 搭建xacro模型,并用rviz可视化
  2. 添加gazebo仿真所需要的碰撞属性、惯性矩阵和颜色等
  3. 给小车添加传感器
  4. ros小车在gazebo中的运动控制

二、搭建xacro模型

2.1 创建一个工作空间和仿真模型的功能包

mkdir -p myRobot_ws/src    # 创建工作空间
cd myRobot_ws/src
catkin_init_workspace
cd myRobot_ws
catkin_make
echo "source ~/myRobot_ws/devel/setup.bash --extend" >> ~/.bashrc
source ~/.bashrc
cd myRobot_ws/src
catkin_create_pkg model_description urdf xacro    # 创建功能包,并添加依赖
cd model_description
mkdir urdf        # 创建三个文件夹,urdf放置模型文件
mkdir launch      # 启动文件
mkdir config      # 配置文件

2.2 xacro文件

首先要明确自己的需求,即想要仿真出一个什么样的机器人

本文模型的尺寸是大致按照实验室在使用的机器人尺寸来仿真的,具体的可以自行修改设计

1. 主要框架:

<robot name="robot_base" xmlns:xacro="http://www.ros.org/wiki/xacro">
    
    <!-- 1. base_footprint -->
    <xacro:property name="footprint_radius" value="0.001" />
    <link name="base_footprint">
        <visual>
            <geometry>
                <sphere radius="${footprint_radius}"/>
            </geometry>
        </visual>
    </link>

    <!-- 2. 底盘 -->
    
    <!-- 3. 驱动轮 -->

    <!-- 4. 万向轮 -->

</robot>

默认情况下,底盘的中心点位于地图原点上,导致模型半沉在地下。为了解决这种问题可设置一个尺寸极小的初始link,例如半径为0.001m的球体,然后在初始 link 上添加底盘等刚体,虽然仍然存在初始link半沉的现象,但是基本可以忽略了。这个初始 link一般称之为base_footprint。

使用xacro时必须要在开头添加上:xmlns:xacro="http://www.ros.org/wiki/xacro"

xacro:property用于定义xacro的属性,具体可参考:

6.4.2 Xacro_语法详解 · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程

2. 底盘

    <xacro:property name="base_radius" value="0.2625" />
    <xacro:property name="base_height" value="0.2625" />
    <xacro:property name="base_mass" value="40" />
    <xacro:property name="earth_space" value="0.05" />
    <xacro:property name="base_joint_z" value="${base_height/2 + earth_space}" />
    <link name="base_link">
        <visual>
            <geometry>
                <cylinder radius="${base_radius}" length="${base_height}"/>
            </geometry>
            <material name="Orange"/>
        </visual>
        <!-- 碰撞属性(gazebo仿真必需项) -->
        <collision>
            <geometry>
                <cylinder radius="${base_radius}" length="${base_height}"/>
            </geometry>
        </collision>
        <!-- 调用惯性矩阵函数 -->
        <xacro:cylinder_inertial_matrix m="${base_mass}" r="${base_radius}" h="${base_height}" />
    </link>
    <!-- 设置base_footprint和base_link之间的joint -->
    <joint name="link2footprint" type="fixed">
        <parent link="base_footprint"/>
        <child link="base_link"/>
        <origin xyz="0.0 0.0 ${base_joint_z}" rpy="0.0 0.0 0.0"/>
    </joint>
    <!-- gazebo的颜色属性设置 -->
    <gazebo reference="base_link">
        <material>Gazebo/Orange</material>
    </gazebo>

3. 驱动轮

    <!-- 3. 两个驱动轮 -->
    <xacro:property name="wheel_radius" value="0.108" />
    <xacro:property name="wheel_width" value="0.05" />
    <xacro:property name="wheel_mass" value="0.7" />
    <xacro:property name="wheel_joint_y" value="0.2" />
    <xacro:property name="wheel_joint_z" value="${-1 * (base_height/2 + earth_space - wheel_radius)}" />
    <xacro:macro name="wheel" params="wheel_name flag"> 
        <link name="${wheel_name}_wheel">
            <visual>
                <geometry>
                    <cylinder radius="${wheel_radius}" length="${wheel_width}"/>
                </geometry>
                <origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0"/>
                <material name="Gray" />
            </visual>
            <collision>
                <geometry>
                    <cylinder radius="${wheel_radius}" length="${wheel_width}"/>
                </geometry>
                <origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0"/>
            </collision>
            <xacro:cylinder_inertial_matrix m="${wheel_mass}" r="${wheel_radius}" h="${wheel_width}" />            
        </link>
        <!-- wheel和base_link之间的joint -->
        <joint name="${wheel_name}2link" type="continuous">
            <parent link="base_link"/>
            <child link="${wheel_name}_wheel"/>
            <origin xyz="0.0 ${wheel_joint_y * flag} ${wheel_joint_z}" rpy="0.0 0.0 0.0"/>
            <axis xyz="0.0 1.0 0.0"/>
        </joint>
        <gazebo reference="${wheel_name}_wheel">
            <material>Gazebo/Gray</material>
        </gazebo>
        <!-- 为joint添加传动装置 -->
        <transmission name="${wheel_name}_wheel_joint_trans">
            <type>transmission_interface/SimpleTransmission</type>
            <joint name="${wheel_name}2link">
                <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
            </joint>
            <actuator name="${wheel_name}_wheel_joint_motor">
                <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
                <mechanicalReduction>1</mechanicalReduction>
            </actuator>
        </transmission>
    </xacro:macro>
    <!-- 调用驱动的宏 -->
    <xacro:wheel wheel_name="left" flag="1" />
    <xacro:wheel wheel_name="right" flag="-1" />

4. 万向轮

   <!-- 4. 四个支撑万向轮 -->
    <xacro:property name="caster_radius" value="0.04" />
    <xacro:property name="caster_mass" value="0.1" />
    <xacro:property name="caster_joint_x" value="0.15" /> 
    <xacro:property name="caster_joint_y" value="0.12" /> 
    <xacro:property name="caster_joint_z" value="${-1 * (base_height/2 + earth_space - caster_radius)}" /> 
    <xacro:macro name="caster" params="caster_name flag_x flag_y">
        <link name="${caster_name}_wheel">
            <visual>
                <geometry>
                    <sphere radius="${caster_radius}" />
                </geometry>
                <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
                <material name="Gray" />
            </visual>
            <collision>
                <geometry>
                    <sphere radius="${caster_radius}" />
                </geometry>
                <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
            </collision>
            <xacro:sphere_inertial_matrix m="${caster_mass}" r="${caster_radius}" /> 
        </link>
        <!-- caster和base_link之间的joint -->
        <joint name="${caster_name}2link" type="continuous">
            <parent link="base_link"/>
            <child link="${caster_name}_wheel"/>
            <origin xyz="${caster_joint_x * flag_x} ${caster_joint_y * flag_y} ${caster_joint_z}" rpy="0.0 0.0 0.0"/>
            <axis xyz="1.0 1.0 1.0"/>
        </joint>
        <gazebo reference="${caster_name}_wheel">
            <material>Gazebo/Gray</material>
        </gazebo>
    </xacro:macro>
    <!-- 调用万向轮的宏 -->
    <xacro:caster caster_name="front_l" flag_x="1" flag_y="1" />
    <xacro:caster caster_name="front_r" flag_x="1" flag_y="-1" />
    <xacro:caster caster_name="back_l" flag_x="-1" flag_y="1" />
    <xacro:caster caster_name="back_r" flag_x="-1" flag_y="-1" />


网站公告

今日签到

点亮在社区的每一天
去签到