ROS机器人小车建模仿真

news/2024/9/23 9:33:06/

ROS机器人小车建模仿真

引言:

​ 在机器人技术的迅速发展中,仿真技术已成为研究和教育领域的重要工具。通过仿真,我们可以在虚拟环境中测试和验证机器人的设计和行为,无需承担高昂的成本和潜在的风险。本实验从零开始,逐步掌握使用URDF(统一机器人描述格式)构建机器人模型,以及如何将这些模型与Gazebo仿真环境集成的技能。我们将从搭建一个简单的小车模型开始,探索如何在Gazebo中为其创建逼真的仿真环境,并最终实现对小车的模拟控制和运动。

希望你在本次学习过后,能够有一定的收获!!!

​ 冲啊!!!! ٩(͡๏̯͡๏)۶ ٩(͡๏̯͡๏)۶ ٩(͡๏̯͡๏)۶

文章目录

    • ROS机器人小车建模仿真
    • 一、实验前言
      • 为什么要仿真?
      • 仿真对于开发有哪些优势?
    • 一、任务介绍
    • 二、URDF集成Rviz
      • 基本介绍
      • 需求描述
      • 结果演示
    • 三、URDF集成Gazebo
      • 需求描述
      • 实现流程
      • 结果演示
    • 四、Gazebo 环境搭建
    • 五、模拟小车运动
        • 1.ros_control 简介
        • 2.运动控制实现流程(Gazebo)
    • 六、总结

一、实验前言

为什么要仿真?

在当前科技快速发展的时代,机器人操作系统(ROS)已经成为机器学习和人工智能领域的重要工具。学习、开发和测试ROS固然充满挑战,但同样充满了无限的可能性与机遇。比如,我们面临以下常见问题:

  • 场景1: 机器人的价格高昂,这意味着并不是每个研究者或学习者都有条件购买实体机器人进行实验。
  • 场景2: 真实世界环境的多样性和复杂性,使得在设计、测试机器人系统时,需要模拟一个实际操作环境。
  • 场景3: 将未经充分验证的程序部署到机器人上可能存在安全风险,特别是在高成本的硬件上进行实验时。

针对上述挑战,ROS中的仿真环境如同一个安全网,为我们提供了一个风险低、成本低的测试平台。以下是对仿真环境的深入探讨:

1. 概念解析

仿真环境用于模拟真实机器人系统,在ROS中它主要包括三大组件:机器人建模(URDF)、仿真环境创建(Gazebo)和环境感知(Rviz)。这三者结合起来,为我们提供一个全方位、系统性的仿真实现。

2. 仿真环境的价值

仿真的强大之处在于其低成本、高效率和安全性。相比真实的机器人实验,仿真环境可以:

  • 降低实验成本: 无需昂贵的硬件投资,就能进行多样化的机器人测试。
  • 提升测试效率和覆盖率: 通过快速迭代和灵活变化的环境设置,仿真可以涵盖更多的测试场景。
  • 保障安全性: 在仿真环境中进行测试,不用担心硬件损耗或安全事故。

3. 仿真环境的不足

尽管仿真环境有其独特优势,但同样存在一定的局限性。例如:

  • 物理引擎的限制: 虽然当前物理引擎已经非常先进,但仍难以模拟出真实世界的复杂物理情况。
  • 理想化的建模: 仿真器构建的是机器人最理想状态的模拟,而无法完全复现实际硬件可能出现的缺陷或极端情况。

4. 核心组件详解

仿真环境中,三个核心组件分别承载着不同的职能:

  • URDF: 提供了一种XML格式的描述文件,用于定义机器人的结构和关节等信息,是ROS机器人建模的核心。
  • Rviz: 作为一个三维可视化工具,RViz可以将ROS的数据信息进行形象直观的展示。
  • Gazebo: 作为动态仿真工具,能够支持机器人模型在复杂的室内外环境中的模拟运行。

仿真对于开发有哪些优势?

ROS(Robot Operating System)中的仿真环境对于机器人开发具有多个优势,归纳如下:

  1. 降低成本:
    仿真环境可以消除对昂贵硬件的依赖。原型设计、测试和开发可以在没有实体机器人的情况下进行,降低了实验和研发的初始成本。
  2. 安全测试:
    开发者可以在仿真环境中安全地测试代码和机器人行为,无需担心可能因错误而导致的实体损坏或其他安全隐患。
  3. 快速迭代:
    仿真允许开发人员快速调整和测试机器人系统的不同配置,提高了迭代速度,缩短了项目周期。
  4. 环境控制:
    开发者可以构建各种复杂和受控的测试环境,无需物理地改变现实条件,能够模拟各种天气、地形和其他可能影响机器人性能的因素。
  5. 错误诊断与分析:
    使用仿真,开发者可以轻松追踪和诊断错误、性能瓶颈或其他问题,这在实体测试中可能更加困难和耗时。
  6. 可重复性:
    实验在仿真中是可重复的,即可以在相同的条件下多次运行实验,确保结果的可靠性和测试的准确性。
  7. 教育和研发合作:
    对于教育和研究机构,仿真环境提供了一个共同的平台,让学生和研究人员能够在没有实体机器人的情况下学习和合作。
  8. 代码和资源的重用:
    在ROS中开发的仿真模型和程序可以被重用和共享,这为其他项目或团队成员提供了参考和起点,促进了社区和知识的共享。
  9. 算法验证:
    算法开发者能够在仿真环境中验证其算法的有效性,包括路径规划、视觉处理、决策制定等,而不必依赖实体测试。
  10. 满足规模测试需求:
    在仿真中,可以同时运行多个机器人实例,进行群体或协作机器人的算法和系统测试,这在现实世界中可能既难以实现又成本高昂。

综上所述,ROS中的仿真环境显著提高了机器人系统开发的效率、安全性和准确性,同时还为全球机器人研究和教育领域提供了强大的支持。

在了解了上面的基本概念以后,我们将进行下面的实验内容。

一、任务介绍

  1. URDF搭建小车基本模型
  2. URDF集成Gazebo
  3. **Gazebo 环境搭建 **
  4. 模拟小车运动

二、URDF集成Rviz

基本介绍

URDF 文件是一个标准的 XML 文件,在 ROS 中预定义了一系列的标签用于描述机器人模型,机器人模型可能较为复杂,但是 ROS 的 URDF 中机器人的组成却是较为简单,可以主要简化为两部分:连杆(link标签) 与 关节(joint标签),接下来我们就通过案例了解一下 URDF 中的不同标签:

  • robot 根标签,类似于 launch文件中的launch标签
  • link 连杆标签
  • joint 关节标签
  • gazebo 集成gazebo需要使用的标签

关于gazebo标签,后期在使用 gazebo 仿真时,才需要使用到,用于配置仿真环境所需参数,比如: 机器人材料属性、gazebo插件等,但是该标签不是机器人模型必须的,只有在仿真时才需设置

需求描述

创建一个四轮圆柱状机器人模型,机器人参数如下,底盘为圆柱状,半径 10cm,高 8cm,四轮由两个驱动轮和两个万向支撑轮组成,两个驱动轮半径为 3.25cm,轮胎宽度1.5cm,两个万向轮为球状,半径 0.75cm,底盘离地间距为 1.5cm(与万向轮直径一致)

实现流程

创建机器人模型可以分步骤实现

  1. 新建 urdf 文件,并与 launch 文件集成
  2. 搭建底盘
  3. 在底盘上添加两个驱动轮
  4. 在底盘上添加两个万向轮

1.新建urdf以及launch文件

urdf 文件:基本实现

<robot name="mycar"><!-- 设置 base_footprint  --><link name="base_footprint"><visual><geometry><sphere radius="0.001" /></geometry></visual></link><!-- 添加底盘 --><!-- 添加驱动轮 --><!-- 添加万向轮(支撑轮) --></robot>
Copy

launch 文件:

<launch><!-- 将 urdf 文件内容设置进参数服务器 --><param name="robot_description" textfile="$(find demo01_urdf_helloworld)/urdf/urdf/test.urdf" /><!-- 启动 rivz --><node pkg="rviz" type="rviz" name="rviz_test" args="-d $(find demo01_urdf_helloworld)/config/helloworld.rviz" /><!-- 启动机器人状态和关节状态发布节点 --><node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" /><node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" /><!-- 启动图形化的控制关节运动节点 --><node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" /></launch>
Copy

2.底盘搭建

<!-- 参数形状:圆柱 半径:10     cm 高度:8      cm 离地:1.5    cm--><link name="base_link"><visual><geometry><cylinder radius="0.1" length="0.08" /></geometry><origin xyz="0 0 0" rpy="0 0 0" /><material name="yellow"><color rgba="0.8 0.3 0.1 0.5" /></material></visual></link><joint name="base_link2base_footprint" type="fixed"><parent link="base_footprint" /><child link="base_link"/><origin xyz="0 0 0.055" /></joint>
Copy

3.添加驱动轮

<!-- 添加驱动轮 --><!--驱动轮是侧翻的圆柱参数半径: 3.25 cm宽度: 1.5  cm颜色: 黑色关节设置:x = 0y = 底盘的半径 + 轮胎宽度 / 2z = 离地间距 + 底盘长度 / 2 - 轮胎半径 = 1.5 + 4 - 3.25 = 2.25(cm)axis = 0 1 0--><link name="left_wheel"><visual><geometry><cylinder radius="0.0325" length="0.015" /></geometry><origin xyz="0 0 0" rpy="1.5705 0 0" /><material name="black"><color rgba="0.0 0.0 0.0 1.0" /></material></visual></link><joint name="left_wheel2base_link" type="continuous"><parent link="base_link" /><child link="left_wheel" /><origin xyz="0 0.1 -0.0225" /><axis xyz="0 1 0" /></joint><link name="right_wheel"><visual><geometry><cylinder radius="0.0325" length="0.015" /></geometry><origin xyz="0 0 0" rpy="1.5705 0 0" /><material name="black"><color rgba="0.0 0.0 0.0 1.0" /></material></visual></link><joint name="right_wheel2base_link" type="continuous"><parent link="base_link" /><child link="right_wheel" /><origin xyz="0 -0.1 -0.0225" /><axis xyz="0 1 0" /></joint>
Copy

4.添加万向轮

<!-- 添加万向轮(支撑轮) --><!--参数形状: 球体半径: 0.75 cm颜色: 黑色关节设置:x = 自定义(底盘半径 - 万向轮半径) = 0.1 - 0.0075 = 0.0925(cm)y = 0z = 底盘长度 / 2 + 离地间距 / 2 = 0.08 / 2 + 0.015 / 2 = 0.0475 axis= 1 1 1--><link name="front_wheel"><visual><geometry><sphere radius="0.0075" /></geometry><origin xyz="0 0 0" rpy="0 0 0" /><material name="black"><color rgba="0.0 0.0 0.0 1.0" /></material></visual></link><joint name="front_wheel2base_link" type="continuous"><parent link="base_link" /><child link="front_wheel" /><origin xyz="0.0925 0 -0.0475" /><axis xyz="1 1 1" /></joint><link name="back_wheel"><visual><geometry><sphere radius="0.0075" /></geometry><origin xyz="0 0 0" rpy="0 0 0" /><material name="black"><color rgba="0.0 0.0 0.0 1.0" /></material></visual></link><joint name="back_wheel2base_link" type="continuous"><parent link="base_link" /><child link="back_wheel" /><origin xyz="-0.0925 0 -0.0475" /><axis xyz="1 1 1" /></joint>

结果演示

在这里插入图片描述

三、URDF集成Gazebo

需求描述

将之前的机器人模型(xacro版)显示在 gazebo 中

实现流程

  1. 需要编写封装惯性矩阵算法的 xacro 文件
  2. 机器人模型中的每一个 link 添加 collision 和 inertial 标签,并且重置颜色属性
  3. 在 launch 文件中启动 gazebo 并添加机器人模型

1.编写封装惯性矩阵算法的 xacro 文件

<robot name="base" xmlns:xacro="http://wiki.ros.org/xacro"><!-- Macro for inertia matrix --><xacro:macro name="sphere_inertial_matrix" params="m r"><inertial><mass value="${m}" /><inertia ixx="${2*m*r*r/5}" ixy="0" ixz="0"iyy="${2*m*r*r/5}" iyz="0" izz="${2*m*r*r/5}" /></inertial></xacro:macro><xacro:macro name="cylinder_inertial_matrix" params="m r h"><inertial><mass value="${m}" /><inertia ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0"iyy="${m*(3*r*r+h*h)/12}" iyz = "0"izz="${m*r*r/2}" /> </inertial></xacro:macro><xacro:macro name="Box_inertial_matrix" params="m l w h"><inertial><mass value="${m}" /><inertia ixx="${m*(h*h + l*l)/12}" ixy = "0" ixz = "0"iyy="${m*(w*w + l*l)/12}" iyz= "0"izz="${m*(w*w + h*h)/12}" /></inertial></xacro:macro>
</robot>
Copy

2.复制相关 xacro 文件,并设置 collision inertial 以及 color 等参数

A.底盘 Xacro 文件

<!--使用 xacro 优化 URDF 版的小车底盘实现:实现思路:1.将一些常量、变量封装为 xacro:property比如:PI 值、小车底盘半径、离地间距、车轮半径、宽度 ....2.使用 宏 封装驱动轮以及支撑轮实现,调用相关宏生成驱动轮与支撑轮-->
<!-- 根标签,必须声明 xmlns:xacro -->
<robot name="my_base" xmlns:xacro="http://www.ros.org/wiki/xacro"><!-- 封装变量、常量 --><!-- PI 值设置精度需要高一些,否则后续车轮翻转量计算时,可能会出现肉眼不能察觉的车轮倾斜,从而导致模型抖动 --><xacro:property name="PI" value="3.1415926"/><!-- 宏:黑色设置 --><material name="black"><color rgba="0.0 0.0 0.0 1.0" /></material><!-- 底盘属性 --><xacro:property name="base_footprint_radius" value="0.001" /> <!-- base_footprint 半径  --><xacro:property name="base_link_radius" value="0.1" /> <!-- base_link 半径 --><xacro:property name="base_link_length" value="0.08" /> <!-- base_link 长 --><xacro:property name="earth_space" value="0.015" /> <!-- 离地间距 --><xacro:property name="base_link_m" value="0.5" /> <!-- 质量  --><!-- 底盘 --><link name="base_footprint"><visual><geometry><sphere radius="${base_footprint_radius}" /></geometry></visual></link><link name="base_link"><visual><geometry><cylinder radius="${base_link_radius}" length="${base_link_length}" /></geometry><origin xyz="0 0 0" rpy="0 0 0" /><material name="yellow"><color rgba="0.5 0.3 0.0 0.5" /></material></visual><collision><geometry><cylinder radius="${base_link_radius}" length="${base_link_length}" /></geometry><origin xyz="0 0 0" rpy="0 0 0" /></collision><xacro:cylinder_inertial_matrix m="${base_link_m}" r="${base_link_radius}" h="${base_link_length}" /></link><joint name="base_link2base_footprint" type="fixed"><parent link="base_footprint" /><child link="base_link" /><origin xyz="0 0 ${earth_space + base_link_length / 2 }" /></joint><gazebo reference="base_link"><material>Gazebo/Yellow</material></gazebo><!-- 驱动轮 --><!-- 驱动轮属性 --><xacro:property name="wheel_radius" value="0.0325" /><!-- 半径 --><xacro:property name="wheel_length" value="0.015" /><!-- 宽度 --><xacro:property name="wheel_m" value="0.05" /> <!-- 质量  --><!-- 驱动轮宏实现 --><xacro:macro name="add_wheels" params="name flag"><link name="${name}_wheel"><visual><geometry><cylinder radius="${wheel_radius}" length="${wheel_length}" /></geometry><origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" /><material name="black" /></visual><collision><geometry><cylinder radius="${wheel_radius}" length="${wheel_length}" /></geometry><origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" /></collision><xacro:cylinder_inertial_matrix m="${wheel_m}" r="${wheel_radius}" h="${wheel_length}" /></link><joint name="${name}_wheel2base_link" type="continuous"><parent link="base_link" /><child link="${name}_wheel" /><origin xyz="0 ${flag * base_link_radius} ${-(earth_space + base_link_length / 2 - wheel_radius) }" /><axis xyz="0 1 0" /></joint><gazebo reference="${name}_wheel"><material>Gazebo/Red</material></gazebo></xacro:macro><xacro:add_wheels name="left" flag="1" /><xacro:add_wheels name="right" flag="-1" /><!-- 支撑轮 --><!-- 支撑轮属性 --><xacro:property name="support_wheel_radius" value="0.0075" /> <!-- 支撑轮半径 --><xacro:property name="support_wheel_m" value="0.03" /> <!-- 质量  --><!-- 支撑轮宏 --><xacro:macro name="add_support_wheel" params="name flag" ><link name="${name}_wheel"><visual><geometry><sphere radius="${support_wheel_radius}" /></geometry><origin xyz="0 0 0" rpy="0 0 0" /><material name="black" /></visual><collision><geometry><sphere radius="${support_wheel_radius}" /></geometry><origin xyz="0 0 0" rpy="0 0 0" /></collision><xacro:sphere_inertial_matrix m="${support_wheel_m}" r="${support_wheel_radius}" /></link><joint name="${name}_wheel2base_link" type="continuous"><parent link="base_link" /><child link="${name}_wheel" /><origin xyz="${flag * (base_link_radius - support_wheel_radius)} 0 ${-(base_link_length / 2 + earth_space / 2)}" /><axis xyz="1 1 1" /></joint><gazebo reference="${name}_wheel"><material>Gazebo/Red</material></gazebo></xacro:macro><xacro:add_support_wheel name="front" flag="1" /><xacro:add_support_wheel name="back" flag="-1" /></robot>
Copy

注意: 如果机器人模型在 Gazebo 中产生了抖动,滑动,缓慢位移 … 诸如此类情况,请查看

  1. 惯性矩阵是否设置了,且设置是否正确合理
  2. 车轮翻转需要依赖于 PI 值,如果 PI 值精度偏低,也可能导致上述情况产生

B.摄像头 Xacro 文件

<!-- 摄像头相关的 xacro 文件 -->
<robot name="my_camera" xmlns:xacro="http://wiki.ros.org/xacro"><!-- 摄像头属性 --><xacro:property name="camera_length" value="0.01" /> <!-- 摄像头长度(x) --><xacro:property name="camera_width" value="0.025" /> <!-- 摄像头宽度(y) --><xacro:property name="camera_height" value="0.025" /> <!-- 摄像头高度(z) --><xacro:property name="camera_x" value="0.08" /> <!-- 摄像头安装的x坐标 --><xacro:property name="camera_y" value="0.0" /> <!-- 摄像头安装的y坐标 --><xacro:property name="camera_z" value="${base_link_length / 2 + camera_height / 2}" /> <!-- 摄像头安装的z坐标:底盘高度 / 2 + 摄像头高度 / 2  --><xacro:property name="camera_m" value="0.01" /> <!-- 摄像头质量 --><!-- 摄像头关节以及link --><link name="camera"><visual><geometry><box size="${camera_length} ${camera_width} ${camera_height}" /></geometry><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" /><material name="black" /></visual><collision><geometry><box size="${camera_length} ${camera_width} ${camera_height}" /></geometry><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" /></collision><xacro:Box_inertial_matrix m="${camera_m}" l="${camera_length}" w="${camera_width}" h="${camera_height}" /></link><joint name="camera2base_link" type="fixed"><parent link="base_link" /><child link="camera" /><origin xyz="${camera_x} ${camera_y} ${camera_z}" /></joint><gazebo reference="camera"><material>Gazebo/Blue</material></gazebo>
</robot>
Copy

C.雷达 Xacro 文件

<!--小车底盘添加雷达
-->
<robot name="my_laser" xmlns:xacro="http://wiki.ros.org/xacro"><!-- 雷达支架 --><xacro:property name="support_length" value="0.15" /> <!-- 支架长度 --><xacro:property name="support_radius" value="0.01" /> <!-- 支架半径 --><xacro:property name="support_x" value="0.0" /> <!-- 支架安装的x坐标 --><xacro:property name="support_y" value="0.0" /> <!-- 支架安装的y坐标 --><xacro:property name="support_z" value="${base_link_length / 2 + support_length / 2}" /> <!-- 支架安装的z坐标:底盘高度 / 2 + 支架高度 / 2  --><xacro:property name="support_m" value="0.02" /> <!-- 支架质量 --><link name="support"><visual><geometry><cylinder radius="${support_radius}" length="${support_length}" /></geometry><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" /><material name="red"><color rgba="0.8 0.2 0.0 0.8" /></material></visual><collision><geometry><cylinder radius="${support_radius}" length="${support_length}" /></geometry><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" /></collision><xacro:cylinder_inertial_matrix m="${support_m}" r="${support_radius}" h="${support_length}" /></link><joint name="support2base_link" type="fixed"><parent link="base_link" /><child link="support" /><origin xyz="${support_x} ${support_y} ${support_z}" /></joint><gazebo reference="support"><material>Gazebo/White</material></gazebo><!-- 雷达属性 --><xacro:property name="laser_length" value="0.05" /> <!-- 雷达长度 --><xacro:property name="laser_radius" value="0.03" /> <!-- 雷达半径 --><xacro:property name="laser_x" value="0.0" /> <!-- 雷达安装的x坐标 --><xacro:property name="laser_y" value="0.0" /> <!-- 雷达安装的y坐标 --><xacro:property name="laser_z" value="${support_length / 2 + laser_length / 2}" /> <!-- 雷达安装的z坐标:支架高度 / 2 + 雷达高度 / 2  --><xacro:property name="laser_m" value="0.1" /> <!-- 雷达质量 --><!-- 雷达关节以及link --><link name="laser"><visual><geometry><cylinder radius="${laser_radius}" length="${laser_length}" /></geometry><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" /><material name="black" /></visual><collision><geometry><cylinder radius="${laser_radius}" length="${laser_length}" /></geometry><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" /></collision><xacro:cylinder_inertial_matrix m="${laser_m}" r="${laser_radius}" h="${laser_length}" /></link><joint name="laser2support" type="fixed"><parent link="support" /><child link="laser" /><origin xyz="${laser_x} ${laser_y} ${laser_z}" /></joint><gazebo reference="laser"><material>Gazebo/Black</material></gazebo>
</robot>
Copy

D.组合底盘、摄像头与雷达的 Xacro 文件

<!-- 组合小车底盘与摄像头 -->
<robot name="my_car_camera" xmlns:xacro="http://wiki.ros.org/xacro"><xacro:include filename="my_head.urdf.xacro" /><xacro:include filename="my_base.urdf.xacro" /><xacro:include filename="my_camera.urdf.xacro" /><xacro:include filename="my_laser.urdf.xacro" />
</robot>
Copy

3.在 gazebo 中执行

launch 文件:

<launch><!-- 将 Urdf 文件的内容加载到参数服务器 --><param name="robot_description" command="$(find xacro)/xacro $(find demo02_urdf_gazebo)/urdf/xacro/my_base_camera_laser.urdf.xacro" /><!-- 启动 gazebo --><include file="$(find gazebo_ros)/launch/empty_world.launch" /><!-- 在 gazebo 中显示机器人模型 --><node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description"  />
</launch>

结果演示

在这里插入图片描述

四、Gazebo 环境搭建

到目前为止,我们已经可以将机器人模型显示在 Gazebo 之中了,但是当前默认情况下,在 Gazebo 中机器人模型是在 empty world 中,并没有类似于房间、家具、道路、树木… 之类的仿真物,如何在 Gazebo 中创建仿真环境呢?

Gazebo 中创建仿真实现方式有两种:

  • 方式1: 直接添加内置组件创建仿真环境
  • 方式2: 手动绘制仿真环境(更为灵活)

也还可以直接下载使用官方或第三方提高的仿真环境插件。

.添加内置组件创建仿真环境

1.1启动 Gazebo 并添加组件

在这里插入图片描述

1.2构建仿真墙体

在这里插入图片描述

在这里插入图片描述

1.4保存环境

在这里插入图片描述

  1. 5启动
<launch><!-- 将 Urdf 文件的内容加载到参数服务器 --><param name="robot_description" command="$(find xacro)/xacro $(find demo02_urdf_gazebo)/urdf/xacro/my_base_camera_laser.urdf.xacro" /><!-- 启动 gazebo --><include file="$(find gazebo_ros)/launch/empty_world.launch"><arg name="world_name" value="$(find demo02_urdf_gazebo)/worlds/hello.world" /></include><!-- 在 gazebo 中显示机器人模型 --><node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description"  />
</launch>
Copy

核心代码: 启动 empty_world 后,再根据arg加载自定义的仿真环境

<include file="$(find gazebo_ros)/launch/empty_world.launch"><arg name="world_name" value="$(find demo02_urdf_gazebo)/worlds/hello.world" />
</include>
Copy

五、模拟小车运动

gazebo 中已经可以正常显示机器人模型了,那么如何像在 rviz 中一样控制机器人运动呢?在此,需要涉及到ros中的组件: ros_control。

1.ros_control 简介

**场景:**同一套 ROS 程序,如何部署在不同的机器人系统上,比如:开发阶段为了提高效率是在仿真平台上测试的,部署时又有不同的实体机器人平台,不同平台的实现是有差异的,如何保证 ROS 程序的可移植性?ROS 内置的解决方式是 ros_control。

**ros_control:**是一组软件包,它包含了控制器接口,控制器管理器,传输和硬件接口。ros_control 是一套机器人控制的中间件,是一套规范,不同的机器人平台只要按照这套规范实现,那么就可以保证 与ROS 程序兼容,通过这套规范,实现了一种可插拔的架构设计,大大提高了程序设计的效率与灵活性。

gazebo 已经实现了 ros_control 的相关接口,如果需要在 gazebo 中控制机器人运动,直接调用相关接口即可

2.运动控制实现流程(Gazebo)

承上,运动控制基本流程:

  1. 已经创建完毕的机器人模型,编写一个单独的 xacro 文件,为机器人模型添加传动装置以及控制器
  2. 将此文件集成进xacro文件
  3. 启动 Gazebo 并发布 /cmd_vel 消息控制机器人运动

2.1 为 joint 添加传动装置以及控制器

两轮差速配置

<robot name="my_car_move" xmlns:xacro="http://wiki.ros.org/xacro"><!-- 传动实现:用于连接控制器与关节 --><xacro:macro name="joint_trans" params="joint_name"><!-- Transmission is important to link the joints and the controller --><transmission name="${joint_name}_trans"><type>transmission_interface/SimpleTransmission</type><joint name="${joint_name}"><hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface></joint><actuator name="${joint_name}_motor"><hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface><mechanicalReduction>1</mechanicalReduction></actuator></transmission></xacro:macro><!-- 每一个驱动轮都需要配置传动装置 --><xacro:joint_trans joint_name="left_wheel2base_link" /><xacro:joint_trans joint_name="right_wheel2base_link" /><!-- 控制器 --><gazebo><plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so"><rosDebugLevel>Debug</rosDebugLevel><publishWheelTF>true</publishWheelTF><robotNamespace>/</robotNamespace><publishTf>1</publishTf><publishWheelJointState>true</publishWheelJointState><alwaysOn>true</alwaysOn><updateRate>100.0</updateRate><legacyMode>true</legacyMode><leftJoint>left_wheel2base_link</leftJoint> <!-- 左轮 --><rightJoint>right_wheel2base_link</rightJoint> <!-- 右轮 --><wheelSeparation>${base_link_radius * 2}</wheelSeparation> <!-- 车轮间距 --><wheelDiameter>${wheel_radius * 2}</wheelDiameter> <!-- 车轮直径 --><broadcastTF>1</broadcastTF><wheelTorque>30</wheelTorque><wheelAcceleration>1.8</wheelAcceleration><commandTopic>cmd_vel</commandTopic> <!-- 运动控制话题 --><odometryFrame>odom</odometryFrame> <odometryTopic>odom</odometryTopic> <!-- 里程计话题 --><robotBaseFrame>base_footprint</robotBaseFrame> <!-- 根坐标系 --></plugin></gazebo></robot>
Copy

2.2 xacro文件集成

最后还需要将上述 xacro 文件集成进总的机器人模型文件,代码示例如下:

<!-- 组合小车底盘与摄像头 -->
<robot name="my_car_camera" xmlns:xacro="http://wiki.ros.org/xacro"><xacro:include filename="my_head.urdf.xacro" /><xacro:include filename="my_base.urdf.xacro" /><xacro:include filename="my_camera.urdf.xacro" /><xacro:include filename="my_laser.urdf.xacro" /><xacro:include filename="move.urdf.xacro" />
</robot>
Copy

当前核心: 包含 控制器以及传动配置的 xacro 文件

<xacro:include filename="move.urdf.xacro" />
Copy

2.3 启动 gazebo并控制机器人运动

launch文件:

<launch><!-- 将 Urdf 文件的内容加载到参数服务器 --><param name="robot_description" command="$(find xacro)/xacro $(find demo02_urdf_gazebo)/urdf/xacro/my_base_camera_laser.urdf.xacro" /><!-- 启动 gazebo --><include file="$(find gazebo_ros)/launch/empty_world.launch"><arg name="world_name" value="$(find demo02_urdf_gazebo)/worlds/hello.world" /></include><!-- 在 gazebo 中显示机器人模型 --><node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description"  />
</launch>
Copy

启动 launch 文件,使用 topic list 查看话题列表,会发现多了 /cmd_vel 然后发布 vmd_vel 消息控制即可

使用命令控制(或者可以编写单独的节点控制)

rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0.2, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}'
Copy

接下来我们会发现: 小车在 Gazebo 中已经正常运行起来了

QQ录屏20240421192919

六、总结

通过本次实验,我深刻体会到了机器人系统仿真在现代机器人研发中的重要性。在实验的开始,我通过编写URDF文件,成功搭建了小车的基本模型。这一过程虽然充满挑战,但通过不断调试和优化,我逐渐掌握了如何精确描述机器人各个组件及其相互关系的技巧,这对于我深入理解机器人的结构和功能有着重要的意义。

当模型在Gazebo中成功集成时,我感到异常兴奋。我意识到,Gazebo不仅仅是一个仿真平台,它更是一个强大的工具,能够让我们的设计在虚拟世界中“活”起来。通过在Gazebo中搭建仿真环境并模拟小车的运动,我学会了如何控制机器人在复杂环境中的行为,这对于未来进行更高级别的机器人设计和控制研究具有极大的帮助。

此外,本次实验也让我深刻认识到了理论知识与实践技能的结合的重要性。在面对问题和挑战时,我学会了如何将书本上的理论知识应用到实际操作中,通过不断的实践、测试和优化,最终达成预期的目标。

总之,本次实验不仅增强了我对机器人系统仿真技术的理解和应用能力,更重要的是,它激发了我对机器人技术深入研究和探索的热情。我期待在未来能够将在本次实验中学到的知识和技能,应用到更加复杂和前沿的机器人项目中,为机器人技术的发展做出自己的贡献。

最后感谢大佬友情链接:

  • http://www.autolabor.com.cn/book/ROSTutorials/
  • [ROS_RVIZ错误No transform from base_link] to [map]-CSDN博客

http://www.ppmy.cn/news/1445677.html

相关文章

词令直达美团外卖红包天天领入口怎么领外卖节红包优惠券?

词令是一款关键词口令直达工具。通过词令关键词口令直达工具&#xff0c;输入指定的词令关键词直达口令&#xff0c;搜索直达进入该词令管理的目标。 词令直达美团外卖红包天天领入口怎么领外卖节红包优惠券&#xff1f; 1、打开「词令」微信小程序&#xff1b; 2、点击搜索框…

GaussianTalker 学习笔记

目录 巴塞尔面部模型 01_MorphableModel.mat 下载地址: 数据准备转换BFM 缺少diff_gaussian_rasterization.py

UE5主视口导航快捷键汇总

镜头移动: 按住鼠标右键并移动 - 旋转视角 按住鼠标中键或Alt鼠标左键并移动 - 平移视角 滚动鼠标滚轮 - 缩放视角 焦点模式切换: F - 切换为焦点模式,此时可利用键盘方向键移动选中对象 AltF - 切换为焦点延展模式,视角跟随选中对象移动 对象选择/操作: 鼠标左键点击 …

语音识别的基本概念

语音识别的基本概念​​​​​​​ ​​​​​​​ 言语是一种复杂的现象。人们很少了解它是如何产生和感知的。天真的想法常常是语音是由单词构成的&#xff0c;而每个单词又由音素组成。不幸的是&#xff0c;现实却大不相同。语音是一个动态过程&#xff0c;没有明确区分的…

液体燃料运输厂数字孪生系统:智绘安全运输新蓝图

随着科技的不断进步&#xff0c;液体燃料运输行业正迎来一场前所未有的变革。在这场变革中&#xff0c;数字孪生系统以其独特的优势&#xff0c;正逐渐成为推动液体燃料运输厂转型升级的关键力量。 液体燃料作为现代社会的重要能源之一&#xff0c;其运输过程中的安全性和效率性…

大数据面试题 —— Spark数据倾斜及其解决方案

目录 1 调优概述2 数据倾斜发生时的现象3 数据倾斜发生的原理4 如何定位导致数据倾斜的代码4.1 某个 task 执行特别慢的情况4.2 某个 task 莫名其妙内存溢出的情况5 查看导致数据倾斜的 key 的数据分布情况6 数据倾斜的解决方案6.1 使用 Hive ETL 预处理数据6.2 过滤少数导致倾…

【AIGC调研系列】大型语言模型如何减少幻觉生成

在解读大型语言模型&#xff08;LLMs&#xff09;中的长格式事实性问题时&#xff0c;我们首先需要认识到这些模型在生成内容时可能会产生与既定事实不一致的情况&#xff0c;这种情况通常被称为“幻觉”[2][3]。这种现象不仅可能导致信息的误传&#xff0c;还可能对社会造成误…

【OpenCV】(一)wechat_qrcode检测二维码

一、注意&#xff1a; opencv-4.8.0之前的版本wechat_qrcode检测二维码是矩形检测&#xff1b; opencv-4.8.0的版本wechat_qrcode检测二维码是关键点检测&#xff1b; 二、C代码 代码目前是通用的&#xff08;仅在opencv-4.5.5、opencv-4.8.1上测试过&#xff09;&#xff1…