ROS 学习 Gazebo仿真

news2024/11/23 11:14:31

机器人模型添加Gazebo属性

使用xacro设计的机器人URDF模型已经描述了机器人的外观特征和物理特性,虽然已经具备在Gazebo中仿真的基本条件,但是,由于没有在模型中加入Gazebo的相关属性,还是无法让模型在Gazebo仿真环境中动起来。那么如何开始仿真呢?

首先我们需要确保每个link的元素已经进行了合理的设置,然后要为每个必要的、、设置标签。标签是URDF模型中描述gazebo仿真时所需要的扩展属性。

添加Gazebo属性之后的模型文件放置在本书配套源码mrobot_gazebo功能包的urdf文件夹下,以区别于mrobot_description中的URDF模型。

1.为link添加标签

针对机器人模型,需要对每一个link添加标签,包含的属性仅有material。material 属性的作用与link里中material属性的作用相同,Gazebo无法通过中的material参数设置外观颜色,所以需要单独设置,否则默认情况下Gazebo中显示的模型全是灰白色。

以base_link为例,标签的内容如下:

<gazebo reference="wheel_${lr}_link">
	<material>Gazebo/Black</material>
</gazebo>

2.添加传动装置

我们的机器人模型是一个两轮差速驱动的机器人,通过调节两个轮子的速度比例,完成前
进、转向、倒退等动作。火车跑得快,全靠车头带,在之前的模型中,并没有加入驱动机器人
运动的动力源,这当然是仿真必不可少的部分。
为了使用ROS控制器驱动机器人,需要在模型中加入元素,将传动装置与
joint绑定:

<transmission name="wheel_${lr}_joint_trans">
	<type>transmission_interface/SimpleTransmission</type>
	<joint name="base_to_wheel_${lr}_joint" />
	<actuator name="wheel_${lr}_joint_motor">
	<hardwareInterface>VelocityJointInterface</hardwareInterface>
	<mechanicalReduction>1</mechanicalReduction>
	</actuator>
</transmission>

以上代码中,定义了将要绑定驱动器的joint,标签声明了所使用的传
动装置类型,定义了硬件接口的类型,这里使用的是速度控制接口。
到现在为止,机器人还是一个静态显示的模型,如果要让它动起来,还需要使用Gazebo插
件。Gazebo插件赋予了URDF模型更加强大的功能,可以帮助模型绑定ROS消息,从而完成传
感器的仿真输出以及对电机的控制,让机器人模型更加真实。

3.添加Gazebo控制器插件

Gazebo插件可以根据插件的作用范围应用到URDF模型的robot>、link>、joint>上,需要使用标签作为封装。

(1)为元素添加插件
为元素添加Gazebo插件的方式如下:

<gazebo>
<plugin name="unique_name" filename="plugin_name.so">
... plugin parameters ...
</plugin>
</gazebo>

(2)为、标签添加插件

如果需要为、标签添加插件,则需要设置标签中的reference="x"属性:

<gazebo reference="your_link_name">
<plugin name=" unique_name " filename="plugin_name.so">
... plugin parameters ...
</plugin>
</gazebo>

至于Gazebo目前支持的插件种类,可以查看ROS默认安装路径下的/opt/ros/kinetic/lib文件夹,所有插件都是以libgazeboXXX.so的形式命名的。

Gazebo已经提供了一个用于差速控制的插件libgazebo_ros_diff_drive.so,可以将其应用到现有的机器人模型上。在mrobot_gazebo/urdf/mrobot_body.urdf.xacro文件中添加如下插件声明:

<!-- controller -->
<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>base_to_wheel_left_joint</leftJoint>
	<rightJoint>base_to_wheel_right_joint</rightJoint>
	<wheelSeparation>${base_link_radius*2}</wheelSeparation>
	<wheelDiameter>${2*wheel_radius}</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>

在加载差速控制器插件的过程中,需要配置一系列参数,其中比较关键的参数如下。

  • robotNamespace :机器人的命名空间,插件所有数据的发布、订阅都在该命名空间下。
  • leftJoint>和 rightJoint>:左右轮转动的关节joint,控制器插件最终需要控制这两个joint转
    动。
  • wheelSeparation>和- wheelDiameter>:这是机器人模型的相关尺寸,在计算差速参数时需
    要用到。
  • wheelAcceleration>:车轮转动的加速度。
  • commandTopic>:控制器订阅的速度控制指令,ROS中一般都命名为cmd_vel,生成全局
    命名时需要结合中设置的命名空间。
  • odometryFrame>:里程计数据的参考坐标系,ROS中一般都命名为odom。

在Gazebo中显示机器人模型

创建一个启动文件robot_mrobot/mrobot_gazebo/view_mrobot_gazebo.launch,运行Gazebo,加载机器人模型,并且启动一些必要的节点:

<launch>
<!-- 设置launch文件的参数 -->
<arg name="world_name" value="$(find mrobot_gazebo)/worlds/playground.world"/>
<arg name="paused" default="false"/>
<arg name="use_sim_time" default="true"/>
<arg name="gui" default="true"/>
<arg name="headless" default="false"/>
<arg name="debug" default="false"/>
<!-- 运行Gazebo仿真环境 -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(arg world_name)" />
<arg name="debug" value="$(arg debug)" />
<arg name="gui" value="$(arg gui)" />
<arg name="paused" value="$(arg paused)"/>
<arg name="use_sim_time" value="$(arg use_sim_time)"/>
<arg name="headless" value="$(arg headless)"/>
</include>
<!-- 加载机器人模型描述参数 -->
<param name="robot_description" command="$(find xacro)/xacro --inorder '$(find mrobot_gazebo)/urdf/mrobot.urdf.xacro'" />
<!-- 运行joint_state_publisher节点,发布机器人的关节状态 -->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node>
<!-- 运行robot_state_publisher节点,发布TF -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" output="screen" >
<param name="publish_frequency" type="double" value="50.0" />
</node>
<!-- 在gazebo中加载机器人模型-->
<node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn= "false" output="screen"
args="-urdf -model mrobot -param robot_description"/>
</launch>

以上launch文件主要做了两项工作:

1)启动机器人的状态发布节点,同时加载带有Gazebo属性的机器人URDF模型。

2)启动Gazebo,并且将机器人模型加载到Gazebo仿真环境中。
现在,启动这个launch文件,如果一切正常,应该可以看到如图所示的界面,机器人模型已经加载进入仿真环境中。

roslaunch mrobot_gazebo view_mrobot_gazebo.launch

在这里插入图片描述

控制机器人在Gazebo中运动

机器人模型中已经加入了libgazebo_ros_diff_drive.so插件,可以使用差速控制器实现机器人运动。查看系统当前的话题列表

rostopic list

在这里插入图片描述
Gazebo仿真中已经开始订阅cmd_vel话题了。接下来可以运行键盘控制节点,发布该话题的速度控制消息,机器人就会在Gazebo中开始运动了

roslaunch mrobot_teleop mrobot_teleop.launch

在这里插入图片描述
当机器人在仿真环境中撞到障碍物时,会根据两者的物理属性决定机器人是否反弹,或者障碍物是否会被推动,这也证明了Gazebo是一种贴近真实环境的物理仿真平台。

摄像头仿真

在之前rviz+ArbotiX搭建的机器人仿真环境中,机器人装配了多种传感器模型,但是这些模型并无法获取任何环境数据。Gazebo的强大之处还在于提供了一系列传感器插件,可以帮助我们仿真传感器数据,获取Gazebo虚拟环境中的传感信息。

首先为机器人模型添加一个摄像头插件,让机器人看到Gazebo中的虚拟世界。

1.为摄像头模型添加Gazebo插件

类似于机器人模型中的差速控制器插件,传感器的Gazebo插件也需要在URDF模型中配置。复制mrobot_description中的传感器模型到mrobot_gazebo包中,然后在摄像头的模型文件
mrobot_gazebo/urdf/camera.xacro中添加的相关标签,代码如下:

<gazebo reference="${prefix}_link">
<material>Gazebo/Black</material>
</gazebo>
<gazebo reference="${prefix}_link">
<sensor type="camera" name="camera_node">
<update_rate>30.0</update_rate>
<camera name="head">
<horizontal_fov>1.3962634</horizontal_fov>
<image>
<width>1280</width>
<height>720</height>
<format>R8G8B8</format>
</image>
<clip>
<near>0.02</near>
<far>300</far>
</clip>
<noise>
<type>gaussian</type>
<mean>0.0</mean>
<stddev>0.007</stddev>
</noise>
</camera>
<plugin name="gazebo_camera" filename="libgazebo_ros_camera.so">
<alwaysOn>true</alwaysOn>
<updateRate>0.0</updateRate>
<cameraName>/camera</cameraName>
<imageTopicName>image_raw</imageTopicName>
<cameraInfoTopicName>camera_info</cameraInfoTopicName>
<frameName>camera_link</frameName>
<hackBaseline>0.07</hackBaseline>
<distortionK1>0.0</distortionK1>
<distortionK2>0.0</distortionK2>
<distortionK3>0.0</distortionK3>
<distortionT1>0.0</distortionT1>
<distortionT2>0.0</distortionT2>
</plugin>
</sensor>
</gazebo>

新的摄像头模型文件在模型描述部分没有变化,只需要加入两个gazebo 标签。

第一个gazebo 标签用来设置摄像头模型在Gazebo中的material,与机器人模型的配置相似,只需要设置颜色参数。

重点是第二个设置摄像头插件的 gazebo>标签。在加载传感器插件时,需要使用 sensor> 标签来包含传感器的各种属性。

例如现在使用的是摄像头传感器,需要设置type为camera,传 感器的命名(name)可以自由设置;然后使用 camera>标签具体描述摄像头的参数,包括分辨率、编码格式、图像范围、噪音参数等;最后需要使用 plugin>标签加载摄像头的插件 libgazebo_ros_camera.so,同时设置插件的参数,包括命名空间、发布图像的话题、参考坐标系 等。

2.运行仿真环境
现在摄像头插件已经配置完成,使用如下命令启动仿真环境,并加载装配了摄像头的机器人模型:

roslaunch mrobot_gazebo view_mrobot_with_camera_gazebo.launch

启动成功后,可以看到机器人已经在仿真环境中就位了,如图

在这里插入图片描述
查看当前系统中的话题列表

从上图发布的话题中可以看到摄像头已经开始发布图像消息了,使用rqt工具查看当前机器人眼前的世界:

 rqt_image_view

在这里插入图片描述
选择仿真摄像头发布的图像话题/camera/image_raw,即可看到如图所示的图像信息。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1092256.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java的大学生兼职论坛管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

基于STM32_DHT11单总线温湿度传感器驱动

基于STM32_DHT11单总线温湿度传感器驱动 文章目录 基于STM32_DHT11单总线温湿度传感器驱动前言一、DHT11&#xff1f;二、原理1.时序1.主机复位信号和 DHT11 响应信号2.信号‘0’的表示3.信号‘1’的表示4.整个数据信号收发流程 2.数据结构 三、驱动1 .h文件&#xff1a;2 .c文…

力扣-434.字符串中的单词数

Idea 利用C中的 stringstream 指定字符分割字符串 class Solution { public:int countSegments(string s) {int cnt 0;stringstream ss(s);string word;while(ss >> word){cnt;}return cnt;} };

大模型分布式训练并行技术(一)-概述

近年来&#xff0c;随着Transformer、MOE架构的提出&#xff0c;使得深度学习模型轻松突破上万亿规模参数&#xff0c;传统的单机单卡模式已经无法满足超大模型进行训练的要求。因此&#xff0c;我们需要基于单机多卡、甚至是多机多卡进行分布式大模型的训练。 而利用AI集群&am…

【Java 进阶篇】JavaScript流程控制语句详解

JavaScript是一门高级编程语言&#xff0c;具备丰富的流程控制语句&#xff0c;用于控制程序的执行流程。在本篇博客中&#xff0c;我们将深入探讨JavaScript的流程控制语句&#xff0c;包括条件语句、循环语句、以及其他一些控制语句。这篇博客将逐步介绍这些概念&#xff0c;…

智慧公厕:打破传统,解决城市痛点@中期科技

近年来&#xff0c;随着城市化进程的加速推进&#xff0c;智慧公厕成为人民生活质量提升的重要组成部分。作为一个富有创新和科技感的解决方案&#xff0c;智慧公厕不仅满足了人们对公共环境的要求&#xff0c;还提供了一系列便利的服务&#xff0c;让人们的生活更加舒适、便捷…

LabVIEW在安装了其它的NI软件之后崩溃了

LabVIEW在安装了其它的NI软件之后崩溃了 在安装了其它的NI软件之后&#xff0c;一些原本安装好的或者新安装的软件由于缺少必要的DLL而崩溃掉了。例如&#xff0c;在这种情况下&#xff0c;Teststand可能会报下面的错误&#xff1a; RetrievingCOM class factory for compone…

基于Springboot的闲置图书共享系统设计与实现(源码+论文+开题报告+PPT+部署)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

PixMIM论文笔记

论文名称&#xff1a;PixMIM: Rethinking Pixel Reconstruction in Masked Image Modeling 发表时间&#xff1a;2023 年 3 月 4 日 作者及组织&#xff1a;上海人工智能实验室、西蒙菲莎大学、香港中文大学 GitHub&#xff1a;https://github.com/open-mmlab/mmselfsup/tree/d…

虚幻阴影整理

虚拟阴影贴图&#xff08;VSM&#xff09;是一种全新的阴影贴图方法&#xff0c;可以提供稳定的高分辨率阴影。通过与虚幻引擎5的Nanite虚拟几何体、Lumen全局光照和反射以及世界分区功能结合使用&#xff0c;它能够实现电影级的品质效果&#xff0c;为大型开放场景提供光照。 …

C#,数值计算——数据建模Plog的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Plog { private int ndat { get; set; } private double[] dat { get; set; } private double[] stau { get; set; } private double[] slogtau { get; set; …

【Redis】使用Java客户端操作Redis

目录 引入jedis依赖连接Redis命令get/setexists/delkeysexpire/ttltype 引入jedis依赖 连接Redis 命令 get/set exists/del keys expire/ttl type

简单三步,让你的二维码焕发新生

在当今数字化时代&#xff0c;二维码已经成为了我们日常生活和工作中不可或缺的一部分。然而&#xff0c;你是否厌倦了那些单调、乏味的二维码&#xff1f;是否希望你的二维码能够更加美观、个性化&#xff1f;接下来&#xff0c;就让我们一起走进二维码的美化之旅。 首先&…

8.Covector Transformation Rules

上一节已知&#xff0c;任意的协向量都可以写成对偶基向量的线性组合&#xff0c;以及如何通过计算基向量穿过的协向量线来获得协向量分量&#xff0c;且看到 协向量分量 以 与向量分量 相反的方式进行变换。 现要在数学上确认协向量变换规则是什么。 第一件事&#xff1a;…

学习记忆——数学篇——案例——代数——不等式——一元二次不等式

重点记忆法 归类记忆法 解一元二次不等式的步骤 1.先化成标准型&#xff1a; a x 2 b x c > 0 ( 或 < 0 ) ax^2bxc>0(或<0) ax2bxc>0(或<0)&#xff0c;且a >0&#xff1b; 2.计算对应方程的判别式 △ △ △&#xff1b; 3.求对应方程的根&#xff1b…

Spring-学习

Spring&#xff1a; 图片出处&#xff1a;b站黑马 ssm学习截图 是一个大家族 &#xff0c;是一套完整的开发生态圈。可以利用这个spring全家桶快速构建企业级开发环境。 Spring Freamwork 是其他框架的基础 Springbot 使用了注解开发 SpringCloud 分布式 云服务 Sprin…

ShopXO download 任意文件读取

漏洞描述 ShopXO存在任意文件读取漏洞&#xff0c;攻击者可利用该漏洞获取敏感信息 漏洞复现 访问url&#xff1a; 构造payload 漏洞证明&#xff1a; 文笔生疏&#xff0c;措辞浅薄&#xff0c;望各位大佬不吝赐教&#xff0c;万分感谢。 免责声明&#xff1a;由于传播或…

想要精通算法和SQL的成长之路 - 连续的子数组和

想要精通算法和SQL的成长之路 - 连续的子数组和 前言一. 连续的子数组和1.1 最原始的前缀和1.2 前缀和 哈希表 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 连续的子数组和 原题链接 1.1 最原始的前缀和 如果这道题目&#xff0c;用前缀和来算&#xff0c;我们的思路…

基于Java的点歌管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

车载电子电器架构 —— 国产基础软件现在与未来

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c;多看一眼都是你的不…