ROS2-Gazebo仿真

这篇具有很好参考价值的文章主要介绍了ROS2-Gazebo仿真。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Gazebo仿真

Gazebo是ROS系统中最为常用的三维物理仿真平台,支持动力学引擎,可以实现高质量的图形渲染,不仅可以模拟机器人及周边环境,还可以加入摩擦力、弹性系数等物理属性。所以类似Gazebo这样的仿真平台,可以帮助我们验证机器人算法、优化机器人设计、测试机器人场景应用,为机器人开发提供更多可能。

安装运行

通过命令apt进行安装

sudo apt install ros-humble-gazebo-*

然后通过一下命令可以运行

 ros2 launch gazebo_ros gazebo.launch.py

或者下面的命令

gazebo --verbose -s libgazebo_ros_init.so -s libgazebo_ros_factory.so 

运行之后可以看到如下页面:

ROS2-Gazebo仿真

为保证模型顺利加载,请将离线模型下载并放置到~/.gazebo/models路径下,下载链接如下:https://github.com/osrf/gazebo_models

gazebo启动节点与服务

首先查看节点

ros2 node list

正确返回:/gazebo
产看节点的对外提供的服务:ros2 service list。
可以看出如下的结果:

/delete_entity
/get_model_list
/spawn_entity
/gazebo/describe_parameters
/gazebo/get_parameter_types
/gazebo/get_parameters
/gazebo/list_parameters
/gazebo/set_parameters
/gazebo/set_parameters_atomically

出去最后几个常规的服务,我们只注意前三个特殊的服务:

  • /spawn_entity,用于加载模型到gazebo中
  • /get_model_list,用于获取模型列表
  • /delete_entity,用于删除gazbeo中已经加载的模型

创建工作空间及功能包

创建一个gazebo_demo的文件夹,在其中创建一个src文件,然后在src文件夹中创建我们的功能包myrobot(以c++为例)。

mkdir -p gazebo_demo/src
cd gazebo_demo/src
ros2 pkg create myrobot --build-type ament_camke

进入到myrobot的目录下,创建launch、urdf文件夹,修改CMakeLists.txt文件,这一步骤和rviz中类似。在urdf文件夹下创建一个demo01_base.urdf文件,这个文件就是一个简单的演示文件,只有一个基础的立方体。

<robot name="myrobot">
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.2 0.2 0.2"/>
            </geometry>
            <origin xyz="0.0 0.0 0.0"/>
        </visual>
        <collision>
            <geometry>
                <box size="0.2 0.2 0.2"/>
            </geometry>
            <origin xyz="0.0 0.0 0.0"/>
        </collision>
        <inertial>
            <mass value="0.1"/>
            <inertia ixx="0.000190416666667" ixy="0" ixz="0" iyy="0.0001904" iyz="0" izz="0.00036"/>
        </inertial>
    </link>
    <gazebo reference="base_link">
        <material>Gazebo/Red</material>
    </gazebo>
</robot>

这里和以前的文件不同的是加入了collision和intertial属性,都属于物理相关参数,这个就不做讨论。

lauch文件

launch文件的编写,launch文件主要启动两个部分,启动Gazebo文件,然后将机器人模型加载到Gazebo中。

start_gazebo_cmd =  ExecuteProcess(
        cmd=['gazebo', '--verbose','-s', 'libgazebo_ros_init.so', '-s', 'libgazebo_ros_factory.so'],
        output='screen')

这个命令就是启动Gazebo的,就是一个启动命令,并没有特别复杂的地方,下面是加载模型的命令:

 spawn_entity_cmd = Node(
        package='gazebo_ros', 
        executable='spawn_entity.py',
        arguments=['-entity', robot_name_in_model,  '-file', urdf_model_path ], output='screen')

这个命令注意后面两个参数-entity是模型文件中的名字,-file是通过urdf文件加载参数,后面我们还可以看到通过topic话题加载模型的。完整的启动文件如下:

import os
from launch import LaunchDescription
from launch.actions import ExecuteProcess
from launch_ros.actions import Node
from launch_ros.substitutions import FindPackageShare
from launch_ros.parameter_descriptions import ParameterValue
from launch.substitutions import Command

def generate_launch_description():
    robot_name_in_model = 'myrobot'
    package_name = 'myrobot'
    urdf_name = "demo01_base.urdf"
   
    ld = LaunchDescription()
    pkg_share = FindPackageShare(package=package_name).find(package_name) 
    urdf_model_path = os.path.join(pkg_share, f'urdf/{urdf_name}')
   
    # Start Gazebo server
    start_gazebo_cmd =  ExecuteProcess(
        cmd=['gazebo', '--verbose','-s', 'libgazebo_ros_init.so', '-s', 'libgazebo_ros_factory.so'],
        output='screen')

    # Launch the robot
    spawn_entity_cmd = Node(
        package='gazebo_ros', 
        executable='spawn_entity.py',
        arguments=['-entity', robot_name_in_model,  '-file', urdf_model_path ], output='screen')

    ld.add_action(start_gazebo_cmd)
    ld.add_action(spawn_entity_cmd)

    return ld

启动之后可以看到如下的Gazebo模型:

ROS2-Gazebo仿真

可以看到红色的模型,因为最后加上了Gazebo的标签设置。

设置自定义的模型文件

通过上面的显示模型文件,可以看出只有空荡荡的模型,我们可以加入一些自定义的环境,例如我们在功能包中新建一个world的文件夹,在其中放入我们的环境模型文件myworld.world。可以通过命令启动文件配置:gazebo --verbose -s libgazebo_ros_init.so -s libgazebo_ros_factory.so 你的world文件目录/myworld.world。就是在原命令的基础上加了个文件路径,效果如下:

ROS2-Gazebo仿真

launch文件加载world

上面的文件中,我们已经实现了launch文件启动gazebo并显示机器人模型,但是还存在一些问题,如果文件xacro的话,无法直接通过-file进行读取,所以可以考虑使用-topic命令。我们可以通过 robot_state_publisher_node 将robot_description话题发布出去,这个话题中包含了机器人的模型文件。

    robot_description = ParameterValue(Command(['xacro ', urdf_model_path]),
        value_type=str)
 # 将机器人模型通过robot_description话题发布出去(gazebo好像不能直接加载xacro文件)
    robot_state_publisher_node = Node(
        package='robot_state_publisher',
        executable='robot_state_publisher',
        parameters=[{'robot_description': robot_description}]
    )

这部分就和上节课类似,只不过是将模型发布到Gazebo中了,然后下面是更改加载模型的方式了

 spawn_entity_cmd = Node(
        package='gazebo_ros', 
        executable='spawn_entity.py',
        arguments=['-entity', robot_name_in_model,  '-topic', 'robot_description' ], output='screen')

注意到使用了-topic的方式,后面加上了话题名称robot_description。启动Gazebo服务的命令后面也要加上我们定义的world模型文件路径。

 start_gazebo_cmd =  ExecuteProcess(
        cmd=['gazebo', '--verbose','-s', 'libgazebo_ros_init.so', '-s', 'libgazebo_ros_factory.so',gazebo_world_path],
        output='screen')

最后查看完整的launch文件

import os
from launch import LaunchDescription
from launch.actions import ExecuteProcess
from launch_ros.actions import Node
from launch_ros.substitutions import FindPackageShare
from launch.substitutions import Command
from launch_ros.parameter_descriptions import ParameterValue



def generate_launch_description():
    robot_name_in_model = 'myrobot'
    package_name = 'myrobot'
    urdf_name = "sumcar.xacro"
   

    ld = LaunchDescription()
    pkg_share = FindPackageShare(package=package_name).find(package_name) 
    urdf_model_path = os.path.join(pkg_share, f'urdf/{urdf_name}')
    gazebo_world_path = os.path.join(pkg_share, 'world/myworld.world')

    robot_description = ParameterValue(Command(['xacro ', urdf_model_path]),
    value_type=str)
    # Start Gazebo server
    start_gazebo_cmd =  ExecuteProcess(
        cmd=['gazebo', '--verbose','-s', 'libgazebo_ros_init.so', '-s', 'libgazebo_ros_factory.so',gazebo_world_path],
        output='screen')
        
    # 将机器人模型通过robot_description话题发布出去(gazebo好像不能直接加载xacro文件)
    robot_state_publisher_node = Node(
        package='robot_state_publisher',
        executable='robot_state_publisher',
        parameters=[{'robot_description': robot_description}]
    )

    # Launch the robot
    spawn_entity_cmd = Node(
        package='gazebo_ros', 
        executable='spawn_entity.py',
        arguments=['-entity', robot_name_in_model,  '-topic', 'robot_description' ], output='screen')

    ld.add_action(robot_state_publisher_node)
    ld.add_action(start_gazebo_cmd)
    ld.add_action(spawn_entity_cmd) 

    return ld

将以上文件写好后,可以编译运行查看,最终的效果如下:
ROS2-Gazebo仿真
这个里面蓝色的区域是雷达所能看见的范围,机器人也已经出现在了world区域的中心。文章来源地址https://www.toymoban.com/news/detail-457832.html

到了这里,关于ROS2-Gazebo仿真的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【PX4&Simulink&Gazebo联合仿真】在Simulink中使用ROS2控制无人机沿自定义圆形轨迹飞行并在Gazebo中可视化

    本篇文章介绍如何使用ROS2控制无人机沿自定义圆形轨迹飞行并在Gazebo中可视化,提供了Matlab/Simulink源代码,以及演示效果图。 环境: MATLAB : R2022b Ubuntu :20.04 LTS Windows :Windows 10 ROS :ROS2 Foxy Python: 3.8.2 Visual Studio :Visual Studio 2019 PX4 :1.13.0 ROS2的应用程序管道非常简单,这要

    2024年02月22日
    浏览(46)
  • 【ROS学习笔记17】ROS常用仿真组件URDF集成Gazebo

    写在前面,本系列笔记参考的是AutoLabor的教程,具体项目地址在 这里 1.1 URDF与Gazebo基本集成流程 URDF 与 Gazebo 集成流程与 Rviz 实现类似,主要步骤如下: 创建功能包,导入依赖项 编写 URDF 或 Xacro 文件 启动 Gazebo 并显示机器人模型 1.创建功能包 创建新功能包,导入依赖包: 2.编

    2024年02月06日
    浏览(29)
  • ros2机器人在gazebo中移动方案

    很重要的地方:使用虚拟机运行Ubuntu的时候,需要关闭”加速3D图形“的那个选项,否则gazebo无法正常显示。 In this tutorial we will learn how to move our robot. We will use the robot we built in the Build your own robot tutorial. You can download the robot from here. You can also find the finished world of this tutoria

    2024年01月16日
    浏览(30)
  • ROS2机器人任务级导航仿真系统设计与实现(预告)

    前一篇: ​​​​​ROS2工业机械臂抓取仿真系统设计与实现(预告) ROS2机器人任务级导航仿真系统设计与实现 一、背景与意义 随着机器人技术的不断发展和智能化需求的提高,机器人在各个领域中的应用越来越广泛。其中,机器人导航系统是实现机器人自主移动、完成各

    2024年01月24日
    浏览(34)
  • 一个成功的camera案例:ros2+gazebo+摄像头

    各位看:随着大物体的移动,在涉嫌头的位置也发生了改变-----右上角那个/camera的位置也变了 右上角那个是摄像头图案,以下是仓库链接: ros-ign-gazebo-camera: https://github.com/arashsm79/ros-ign-gazebo-camera.git一个ros2+摄像头的示例  如果你输入:   输入: 这位高人的摄像头是确实在

    2024年01月22日
    浏览(26)
  • 【ROS2机器人入门到实战】使用gazebo加载URDF

    当前平台文章汇总地址:ROS2机器人从入门到实战 获取完整教程及配套资料代码,请关注公众号鱼香ROS获取 教程配套机器人开发平台:两驱版| 四驱版 为方便交流,搭建了机器人技术问答社区:地址 fishros.org.cn 在第六章中小鱼曾介绍过,gazebo是独立于ROS/ROS2之外的仿真软件,

    2024年02月05日
    浏览(36)
  • ROS2 humble版本安装gazebo提示:没有可安装候选或无法定位安装包

    错误提示如下所示: 或者: 解决方法: 如果大家使用这条指令依然无法解决问题,请大家注意发帖时间,是否与您当前使用的时间相隔过久,可能官方又更换安装指令了 方法来源:How to install Gazebo for Ubuntu 22.04 with ROS2 Humble - Gazebo: QA Forum

    2024年02月08日
    浏览(27)
  • 关于Ubuntu22.04,ros2-humble环境下,使用gazebo遇到的问题。

    遇到的问题: 打开gazebo时出现error:process has died的报错,虽然仍然可以打开gazebo,但是gazebo显示的并不是launch文件调用的world文件与urdf文件内容,可能显示前次使用gazebo时的内容,或者出现机器人模型乱转的情况。 问题原因: 前次使用gazebo后,没有完全关闭gazebo,尤其是

    2024年02月15日
    浏览(34)
  • ros2机器人urdf内<gazebo>标签解释(非传感器)(源自sdf文件官网)

    原文链接SDFormat extensions to URDF (the \\\'gazebo\\\' tag) — Documentation 注意了ros2的gazebo部分已经跟ros1的gazebo部分不一样了: Toggle navigation  Specification API Documentation Download Back Edit                  Version: 1.6            Table of Contents SDFormat extensions to URDF (the gazebo tag) gazebo Element

    2024年02月01日
    浏览(35)
  • 【ROS仿真实战】Gazebo仿真平台介绍及安装方法(一)

    Gazebo仿真平台是一个广泛应用于机器人研发、测试和教育等领域的开源软件。它可以模拟机器人的运动、感知和控制等行为,并提供了丰富的物理引擎、传感器模拟和ROS集成等功能,使得使用者可以高效地进行机器人仿真和开发。本文将介绍Gazebo仿真平台的基本概念和安装方

    2024年02月10日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包