当前位置: 首页 > news >正文

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

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

相关文章:

  • Visual Studio C++ Hello World
  • 线程安全问题和多线程安全经典案例
  • IDEA2020创建JavaWeb项目并配置tomcat
  • Windows下小狼毫输入法(Rime)的安装与配置
  • java 调用C#语言写的dll文件代码 超详细过程
  • Java面试题11-ReentrantLock中的公平锁与非公平锁的底层实现
  • 股票行情查询易语言代码
  • STM32学习记录 -- 通用定时器的配置(TIM2-TIM5)
  • node搭建服务器
  • 域名解析信息易语言代码
  • 【GNN报告】蒙特利尔大学朱兆成:基于图神经网络的知识图谱推理
  • ATF启动(二):BL1
  • Nginx之正则表达式、location匹配简介以及rewrite重写
  • Kafka 集群安装及常用命令
  • C++变量和基本类型
  • [译]前端离线指南(上)
  • 【comparator, comparable】小总结
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Git同步原始仓库到Fork仓库中
  • JS专题之继承
  • Netty 4.1 源代码学习:线程模型
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • 给新手的新浪微博 SDK 集成教程【一】
  • 简析gRPC client 连接管理
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • python最赚钱的4个方向,你最心动的是哪个?
  • 阿里云移动端播放器高级功能介绍
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​决定德拉瓦州地区版图的关键历史事件
  • #define与typedef区别
  • #QT(串口助手-界面)
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (007)XHTML文档之标题——h1~h6
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (2)MFC+openGL单文档框架glFrame
  • (2)STM32单片机上位机
  • (附源码)php投票系统 毕业设计 121500
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (力扣)1314.矩阵区域和
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (排序详解之 堆排序)
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (十六)一篇文章学会Java的常用API
  • (小白学Java)Java简介和基本配置
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)scrum常见工具列表
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .Net 6.0 处理跨域的方式
  • .NET CLR基本术语
  • .Net 知识杂记
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .NET中GET与SET的用法
  • .NET中使用Redis (二)