gazebo的学习与使用

2023-05-16

Gazebo教程(使用roslaunch启动Gazebo,world文件和URDF模型)

启动Gazebo,打开world模型以及向仿真环境中插入机器人模型的方法有很多.在这个教程中,我们将使用rosrun和roslaunch来实现.这里包括将URDF文件存储在ROS包中,并保留相对于ROS工作区的各种资源路径。(本文转载自https://www.jianshu.com/p/4d8b8327eb9b,转载目的便于自己学习

一.使用roslaunch打开world模型

roslaunch是一个启动ROS节点并插入机器人模型的标准方法.要建立一个空的world模型,我们只需要运行

roslaunch gazebo_ros empty_world.launch

1.roslaunch参数

你可以更改launch文件中的参数来改变Gazebo的启动行为:

paused:在暂停状态下启动Gazebo(默认为false).

use_sim_time:告诉ROS节点要求获取ROS话题/clock发布的时间信息(默认为true).

gui:启动Gazebo中的用户界面窗口(默认为true).

headless recording:启动Gazebo状态日志记录(默认为false).

debug:使用gdb以调试模式启动gzserver(默认为false).

verbose:用–verbose运行gzserver和gzclient,并将错误和警告打印到终端(默认为false).

2.roslaunch命令示例

通常情况下使用默认值就可以了,这里只是一个例子:

roslaunch gazebo_ros empty_world.launch paused:=true use_sim_time:=false gui:=true throttled:=false recording:=false debug:=true verbose:=true

3.运行其他demo worlds

其他的demo worlds已经包含在gazebo_ros中了,它包括:

roslaunch gazebo_ros willowgarage_world.launch

roslaunch gazebo_ros mud_world.launch

roslaunch gazebo_ros shapes_world.launch

roslaunch gazebo_ros rubble_world.launch

mud_world.launch的代码如下:

<launch>

  <!-- We resume the logic in empty_world.launch, changing only the name of the world to be launched -->

  <include file="$(find gazebo_ros)/launch/empty_world.launch">

    <arg name="world_name" value="worlds/mud.world"/> <!-- Note: the world_name is with respect to GAZEBO_RESOURCE_PATH environmental variable -->

    <arg name="paused" value="false"/>

    <arg name="use_sim_time" value="true"/>

    <arg name="gui" value="true"/>

    <arg name="recording" value="false"/>

    <arg name="debug" value="false"/>

  </include>

</launch>

在这个launch文件中,我们继承了大多数empty_world.launch中的内容.只改变了world_name参数,用mud.world代替了empty.world.其他的参数使用默认的就好了.

4.world文件

继续查看mud_world.launch文件,我们现在看mud.world文件的内容.mud.world开头的一部分代码如下所示:

<sdf version="1.4">

    <world name="default">

      <include>

        <uri>model://sun</uri>

      </include>

      <include>

        <uri>model://ground_plane</uri>

      </include>

      <include>

        <uri>model://double_pendulum_with_base</uri>

        <name>pendulum_thick_mud</name>

        <pose>-2.0 0 0 0 0 0</pose>

      </include>

      ...

    </world>

  </sdf>

在这个world文件片段中我们可以看到三个模型.这三个模型都是从本地的Gazebo Model Database中搜寻的.如果没有找到,那么Gazebo会自动的从网上的数据库中搜索.

5.如何在你的计算机中找到world文件

world文件位于Gazebo资源路径的/worlds文件夹中.这个路径取决于你是如何安装Gazebo以及你的系统类型的.想要找到你的Gazebo资源路径,你可以运行如下命令:

env | grep GAZEBO_RESOURCE_PATH

一个典型的路径是/usr/local/share/gazebo-1.9.在这个路径后面加上/worlds就可以了.

二.创建你自己的Gazebo ROS包

在继续插入机器人之前,我们将首先讨论使在ROS下使用Gazebo的文件层次结构标准,以便我们可以做出以后的假设。

现在,我们假设你的工作空间为catkin_ws.它的路径可能是:

/home/user/catkin_ws/src

关于机器人模型和描述的一切都在/MYROBOT_description包中,Gazebo中用到的所有的world文件和launch文件都在/MYROBOT_gazebo中.实际情况下用你机器人的名字的小写字母来代替’MYROBOT’.你的文件夹目录应该如下所示:

  1. …/catkin_ws/src

        /MYROBOT_description
    
            package.xml
    
            CMakeLists.txt
    
            /urdf
    
                MYROBOT.urdf
    
            /meshes
    
                mesh1.dae
    
                mesh2.dae
    
                ...
    
            /materials
    
            /cad
    
        /MYROBOT_gazebo
    
            /launch
    
                MYROBOT.launch
    
            /worlds
    
                MYROBOT.world
    
            /models
    
                world_object1.dae
    
                world_object2.stl
    
                world_object3.urdf
    
            /materials
    
            /plugins
    

·创建一个自定义的world文件

你可根据自己的机器人和功能包创建自己的.world文件.这里我们将创建一个拥有地面,太阳和加油站的世界.下面是我们推荐的步骤.记得用你自己的机器人的名字代替MYROBOT ,如果你没有机器人的话可以直接用'test'代替:

1.创建一个ROS功能包名为MYROBOT_gazebo

2.在个包中,创建一个launch文件夹.

3.在launch文件夹中创建一个YOUROBOT.launch文件,写入如下代码:

<launch>

  <!-- We resume the logic in empty_world.launch, changing only the name of the world to be launched -->

  <include file="$(find gazebo_ros)/launch/empty_world.launch">

    <arg name="world_name" value="$(find MYROBOT_gazebo)/worlds/MYROBOT.world"/>

    <!-- more default parameters can be changed here -->

  </include>

</launch>

4.同样在这个功能包中,创建一个worlds文件夹,并创建一个MYROBOT.world 文件,写入如下代码:

<?xml version="1.0" ?>

<sdf version="1.4">

  <world name="default">

    <include>

      <uri>model://ground_plane</uri>

    </include>

    <include>

      <uri>model://sun</uri>

    </include>

    <include>

      <uri>model://gas_station</uri>

      <name>gas_station</name>

      <pose>-2.0 7.0 0 0 0 0</pose>

    </include>

  </world>

</sdf>

5.通过如下命令你可以在Gazebo中启动你的自定义world文件

. ~/catkin_ws/devel/setup.bash

roslaunch MYROBOT_gazebo MYROBOT.launch

结果如下所示

在这里插入图片描述

·在Gazebo中编辑world文件

你可以插入额外的模型到你的世界中并通过File->Save保存.结果会返回到你的ROS功能包中.

三.使用roslaunch插入URDF机器人

有两种方法:

一个是:通过ROS服务

第一种方法可以让您的机器人的ROS包在计算机和存储库检查之间更加便携。它允许你保持机器人相对于ROS包路径的位置,但也要求你写一个ROS服务程序.

另一个是:通过模型库

这种方法允许你的.world文件中包含你的机器人,这样看起来更整洁方便但是需要设定环境变量来将你的机器人添加到Gazebo的模型库.

我们会使用两种方法.但总的来说我们更推荐第一种方法.

1."ROS服务"

这个方法使用了一个叫做spawn_model的python程序来要求gazebo_ros节点向Gazebo中添加URDF.spawn_model程序存储在gazebo_ros包中.你可以通过如下命令调用这个程序:

rosrun gazebo_ros spawn_model -file rospack find MYROBOT_description/urdf/MYROBOT.urdf -urdf -x 0 -y 0 -z 1 -model MYROBOT

要看所有的spawn_model中的可变参数,运行:rosrun gazebo_ros spawn_model -h

1.1使用Baxter的URDF示例

如果你没有URDF文件来测试,你可以从Rethink Robotics的baxter_common中下载baxter_description包.通过运行如下命令将这个包放在你的工作空间下:

git clone https://github.com/RethinkRobotics/baxter_common.git

现在你应该有一个叫做baxter.urdf的URDF文件在路径baxter_description/urdf/下,运行

rosrun gazebo_ros spawn_model -file rospack find baxter_description/urdf/baxter.urdf -urdf -z 1 -model baxter

结果如下:在这里插入图片描述
接下来将它继集成到ROS启动文件中,打开MYROBOT_gazebo/launch/YOUROBOT.launch并在前添加:

<!-- Spawn a robot into Gazebo -->

<node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-file $(find baxter_description)/urdf/baxter.urdf -urdf -z 1 -model baxter" />

然后启动这个文件,你会得到一样的结果.

1.2使用PR2的XACRO示例

如果你的URDF不是XML形式而是XACRO形式.你可以对launch文件进行类似的修改.通过安装这个包你可以运行这个PR2示例.

对于ROS Jade版本:

sudo apt-get install ros-jade-pr2-common

然后添加如下内容到先前的launch文件中:

<!-- Convert an xacro and put on parameter server -->

<param name="robot_description" command="$(find xacro)/xacro.py $(find pr2_description)/robots/pr2.urdf.xacro" />

<!-- Spawn a robot into Gazebo -->

<node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-param robot_description -urdf -model pr2" />

运行这个文件得到如下结果:
在这里插入图片描述注意:由于Gazebo API的变化,这个方法仍会产生许多的错误和警告.

2."模型库"

这种方法允许你的.world文件中包含你的机器人,这样看起来更整洁方便但是需要设定环境变量来将你的机器人添加到Gazebo的模型库.因为ROS与Gazebo是相互分离的所以需要这个环境变量;URDF包不能直接在.world文件中使用,以为Gazebo不会搜索ROS包.

要想成功的使用这个方法,你必须要新建一个包含有你的机器人你的模型库.这不是将URDF加载到Gazebo中的最简洁方法,但是不必在计算机上保留两个机器人URDF副本.如果你对如下的说明感到困惑,那么你需要回头看看Gazebo Model Database.

我们假设你的ROS工作空间已经按照之前的说明建好了.那么唯一的区别就是在MYROBOT_description中添加了一个model.config文件,目录结构如下:

. …/catkin_ws/src

    /MYROBOT_description

        package.xml

        CMakeLists.txt

        model.config

        /urdf

            MYROBOT.urdf

        /meshes

            mesh1.dae

            mesh2.dae

            ...

        /materials

        /plugins

        /cad

这个目录结构很是个用来做Gazebo的模型库,各个文件夹/文件的意义如下:

·/home/user/catkin_workspace/src:这是Gazebo模型库的存储位置.

·/MYROBOT_description:这个目录存储Gazebo模型

·model.config:Gazebo要在模型库中找到模型所需的配置文件.

·MYROBOT.urdf:描述你的机器人的文件,也可以在Rviz,MoveIt!等中使用.

·/meshes:将你的.stl或者.dae文件放在这里,就像你普通的URDFs文件一样.

2.1model.config

在每一个模型的源文件夹中都有一个model.config文件,它包含了这个模型的元信息.将如下代码复制到你的model.config文件中,用你自己的文件名代替MYROBOT.urdf

<?xml version="1.0"?>

  <model>

    <name>MYROBOT</name>

    <version>1.0</version>

    <sdf>urdf/MYROBOT.urdf</sdf>

    <author>

      <name>My name</name>

      <email>name@email.address</email>

    </author>

    <description>

      A description of the model

    </description>

  </model>

不像SDF,当标签用于URDF时,标签不需要任何版本.

2.2环境变量

最后,你需要给你的 .bashrc 文件添加环境变量来告诉Gazebo上哪找模型库.使用你自己的编辑器编辑"/.bashrc".检查你是否已经定义了一个GAZEBO_MODEL_PATH.如果有,则用一个分号加上它,否则新添一个.假设你的工作空间在/catkin_ws/.那么你的路径应该是:

export GAZEBO_MODEL_PATH=/home/user/catkin_ws/src/

2.3在Gazebo中查看--手动

现在我们打开Gazebo查看是否已经成功配置.

gazebo

点击"Insert".你将会看到数个不同的模型库,包括线上数据库.找到你机器人相应的模型库,打开它的子菜单,选中你的机器人并放置.

2.4在Gazebo中查看--通过roslaunch

使用模型库的方法的优点是你能够在world中添加你的机器人,而不用使用ROS包的路径.我们将使用 "Creating a world file"中相同的设置,只修改其中的world文件:

·在MYROBOT_description/launch文件夹中,编辑MYROBOT.world,使用如下代码:

<?xml version="1.0" ?>

<sdf version="1.4">

  <world name="default">

    <include>

      <uri>model://ground_plane</uri>

    </include>

    <include>

      <uri>model://sun</uri>

    </include>

    <include>

      <uri>model://gas_station</uri>

      <name>gas_station</name>

      <pose>-2.0 7.0 0 0 0 0</pose>

    </include>

    <include>

      <uri>model://MYROBOT</uri>

    </include>

  </world>

</sdf>

·现在运行launch文件应该可以同时看到世界和机器人:

roslaunch MYROBOT_gazebo MYROBOT.launch

这个方法的缺点是MYROBOT_description和MYROBOT_gazebo之间并不能简单的交互.在任何新的系统上你都要先设置GAZEBO_MODEL_PATH.

四.通过package.xml输出模型的路径

<run_depend>gazebo_ros</run_depend>

<export>

  <gazebo_ros gazebo_model_path="${prefix}/models"/>

  <gazebo_ros gazebo_media_path="${prefix}/models"/>

</export>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gazebo的学习与使用 的相关文章

  • PX4卡尔曼滤波分析

    PX4卡尔曼滤波分析 本文主要介绍了PX4中EKF相关的代码
  • 飞行器参数辨识-极大似然估计

    飞行器参数辨识 极大似然估计 1 理论1 1 极大似然估计一般理论1 2 极大似然估计应用在飞行器参数估计1 3 拟线性化求解带估计参数 2 程序实现2 1 飞行器运动的状态方程 1 理论 1 1 极大似然估计一般理论 n n n 个随机观
  • 使用opencv进行车牌提取及识别

    https blog csdn net u011808673 article details 78510692
  • ​天天干着打杂的活,你做好突破自我的觉悟了吗?

    天天干着打杂的活 xff0c 你做好突破自我的觉悟了吗 xff1f 本文为草核儿创作 xff0c 经授权在本公众号原创首发 关于作者 xff1a 草核儿 xff0c 互联网行业沉思者 xff01 希望传播的是正能量 xff0c 但偶尔会被误
  • 数据仓库系列:如何优雅地规划数仓体系

    0x00 前言 数仓规划是数仓建设的蓝图 xff0c 涵盖从需求分析开始到最终的数仓评估验收整个环境 xff1b 数仓规划之所以重要 xff0c 是因为它是描述了数据流动的概念性框架 xff0c 为元数据管理奠定了基础 xff0c 对数据加
  • 【实践案例分享】有赞数据仓库实践之路

    作者 xff1a 叶瑞典 团队 xff1a 数据中台 一 大数据环境下的有赞数仓 关于数据仓库 xff0c 在维基百科中将它定义为用于报表和数据分析的系统 xff0c 是商务智能 Business Intelligence 的核心部分 在数
  • 3分钟看懂用户标签体系怎么做

    随着越来越多的企业开始追求对用户的精细化运营 用各种手段延长用户的生命周期 xff0c 促进用户的活跃与转化 xff0c 并尽一切可能产生商业价值 xff0c 已经是运营的核心 而要做好精准化运营的第一步 xff0c 便是更好的认识我们的用
  • 数据运营系列(三):熵权法如何确定指标权重构建评价体系

    1 熵权法 信息论基本原理解释信息是系统有序性的度量单位 xff0c 而熵可以度量系统的无序程度 xff1b 如果某个指标的信息熵越小 xff0c 该指标提供的信息量越大 xff0c 指标变异程度 方差 高 xff0c 因此在综合评价中所起
  • 漫谈数据团队协作之各岗位间的相互尊重

    最近和几位资深的团队管理者聊团队协作 xff0c 受益匪浅 xff0c 其中有一个观点令居士印象深刻 xff1a 想让团队成员之间能够默契地协作 xff0c 有非常多的方法 xff0c 但是 xff0c 有一个很重要且很基本的要求是 xff
  • 【Proteus仿真】【STM32单片机】智能窗帘控制系统设计

    文章目录 一 功能简介二 软件设计三 实验现象联系作者 一 功能简介 本项目使用Proteus8仿真STM32单片机控制器 xff0c 使用LCD1602显示模块 按键模块 HC05蓝牙 DHT11温湿度 PCF8591 ADC模块 光线传
  • 直播PPT分享-如何体现数据同学的业务敏感度

    今天即兴给大家直播分享了一次 xff0c 反馈还比较不错 xff0c 不少童鞋私信我要ppt xff0c 这里就统一发出来给大家参考了 xff0c 其实内容很少 xff0c 6句话搞定 以后 xff0c 居士会不定期地直播分享 xff0c
  • 无题

    今天在思考一个问题 xff0c 关于互联网行业的 xff0c 其他行业还不太清楚不敢妄加评论 互联网行业在当前社会中其实面临着很多社会问题需要解决和探索 xff0c 比如职业发展的不确定性 35岁的职业危机 职业社交关系的难处理 xff0c
  • Markdown学习笔记:如何画流程图

    如何使用markdown画流程图 话说网上关于使用markdown画流程图的相关的教程真是一堆堆的坑 xff0c 我丝毫不怀疑这些博文作者确实是知道如何使用markdown画流程图了 xff0c 但是写出来的文章却丝毫没有明白具体的使用方法
  • Gradle打jar包,包含所有依赖

    前言 最近被gradle折腾的欲仙欲死 gradle想把所有依赖打进jar包主要有两种方式 xff1a 一种是重写jar动作 xff0c 一种是用第三方插件 为了装x xff0c 我一直都是用的第一种方式 xff0c 结果出了问题解决不了
  • Spring Data Rest如何暴露ID字段

    前言 为了懒省事 xff0c 使用Spring Data Rest来直接提供rest接口 xff0c 重点遇到点小坑 xff0c 记录一下 记录 问题 entity xff1a span class hljs annotation 64 E
  • hadoop清空回收站

    直接删除目录 xff08 不放入回收站 xff09 hdfs dfs span class hljs attribute rm span span class hljs attribute skipTrash span path span
  • 漫谈数据仓库之拉链表(原理、设计以及在Hive中的实现)

    0x00 前言 本文将会谈一谈在数据仓库中拉链表相关的内容 xff0c 包括它的原理 设计 以及在我们大数据场景下的实现方式 最新文章已经迁入公众 xff1a 木东居士 全文由下面几个部分组成 xff1a 先分享一下拉链表的用途 什么是拉链
  • 《数据仓库实践》

    序言 2017 年初 xff0c 我开始在简书上写关于数据仓库的系列博客 xff0c 博客主题围绕大数据场景下数据仓库的理论和实践来展开 xff0c 截止现在已有十篇左右 最初写作的时候主要是抱着学习和总结的态度 xff0c 导致很多地方略
  • 一种计算用户留存的方法

    0x00 概述 用户留存分析是互联网时代常用的一种数据分析方法 而很多快速发展的公司并没有相应的方法论沉淀 xff0c 这就导致了在计算用户留存的时候会出现下面的一些问题 xff1a 1 xff09 用户留存的定义不明确 xff0c 不同的
  • MAVLink--结构

    MAVLink源文件结构 MAVLink是为微型飞行器MAV xff08 Micro Air Vehicle xff09 设计的 xff08 LGPL xff09 开源的通讯协议 是无人飞行器和地面站 xff08 Ground Contro

随机推荐

  • 关于函数strtok和strtok_r的使用要点和实现原理(二)

    xff08 一 xff09 中已经介绍了使用strtok函数的一些注意事项 xff0c 本篇将介绍strtok的一个应用并引出strtok r函数 1 一个应用实例 网络上一个比较经典的例子是将字符串切分 xff0c 存入结构体中 如 xf
  • TX2 ubuntu CPU占用率、占用物理内存、占用虚拟内存、进程ID、系统温度

    文件解释 在实际工作中有时需要程序打印出某个进程的内存占用情况以作参考 下面介绍一种通过Linux下的伪文件系统 proc计算某进程内存占用的程序实现方法 首先 为什么会有所谓的 伪文件 呢 Linux系统的文件类型大致可分为三类 普通文件
  • 【Fast RTPS】入门--------Ubuntu系统下

    RTPS协议的简单介绍 在RTPS的顶层 xff0c Domain域定义了不同的通信层 几个域可以同时独立地共存 域包含任意数量的参与者Participants xff0c 即发送和接收数据的元素 参与者使用端Endpoints xff1a
  • Linux 内核配置选项(转)

    Linux 内核配置选项 from http www mitbbs com mitbbs article t php board 61 Linux amp gid 61 10715608 amp ftype 61 0 第一部分 01 Cod
  • Cortex-M3双堆栈MSP和PSP

    什么是栈 xff1f 在谈M3堆栈之前我们先回忆一下数据结构中的栈 栈是一种先进后出的数据结构 类似于枪支的弹夹 xff0c 先放入的子弹最后打出 xff0c 后放入的子弹先打出 M3内核的堆栈也不例外 xff0c 也是先进后出的 栈的作用
  • 烧毁DC/DC电路问题

    使用芯龙半导体的XL7005A DC DC芯片 已经很多年了 xff0c 用的也很稳定 这次在做一个设备的时候 xff0c 系统上电就会烧DC DC芯片以及系统电路中的LDO和MCU等 试了很多次终于发现规律了 xff0c DC DC电路就
  • FreeRTOS内核全局变量

    想要分析FreeRTOS源码 xff0c 想要理解FreeRTOS源码的整个宏观架构 xff0c 有一个前提就是必须知道FreeRTOS内核中那些全局变量的意义 xff0c 每个全局变量都是用来干什么的 只有了解了这些全局变量我们才能从宏观
  • 基于LWIP协议栈RAW API的 UDP传输实验

    什么是UDP xff1f UDP是用户数据报协议 xff0c 是OSI参考模型中的传输层协议 UDP的特点 缺点 xff1a 无连接的 xff0c 不可靠的 xff0c 不能保证数据安全到达目的地 优点 xff1a 消耗资源小 xff0c
  • 初识CANOpen

    什么是CANOpen CANOpen是位于CAN总线之上的一个应用层协议 CAN总线只规定了物理层和数据链路层 xff0c 有了这两层 xff0c 数据就可以在CAN总线上传输了 我们和哪个设备通信就和哪个设备约定好 xff0c 哪个ID代
  • STM32单片机被锁无法烧写程序解决办法

    以前遇到无法烧写程序的问题 在开发中 xff0c 单片机突然无法烧写程序 xff0c 这种情况相信大家应该都遇到过 比如烧写程序引脚被设置为别的功能 这种情况也是最常见的 我们可以把复位电容短路 xff0c 让单片机复位 xff0c 然后点
  • STM32F407以太网DMA描述符和数据链路层收发数据

    本文主要介绍STM32F407单片机MAC内核的DMA描述符 xff0c 以及如何实现以太网二层的数据收发 这一篇先实现数据链路层的正常收发 xff0c 下一篇再去介绍如何把LWIP移植到单片机上 大部分资料都是把LWIP移植和以太网卡驱动
  • linux查看日志常用命令

    线上环境出现问题 xff0c 熟悉常用的日志操作命令 xff0c 对有效的排查出问题至关重要 下面将介绍一些常用的命令 xff0c 一起学习下 1 tail命令 xff08 查询日志文件尾部 xff09 tail f 日志文件 xff1a
  • 定时事件链表

    本文主要写的是 xff1a 将需要定时的事件作为一个链表节点添加到链表中 所写代码是从LWIP源码中复制出来的 xff0c 稍作修改 当阅读到lwip源码timers c文件中的sys timeout函数时 xff0c 觉得非常适合如下一种
  • LAN8720A芯片

    LAN8720A是一个10 100M 的以太网PHY芯片 带有SMI接口 xff0c 支持RMII LAN8720A各个管脚的功能 xff1a MDIO MDC是站管理接口 SMI接口 引脚 SMI是标准接口 xff0c 比如交换机芯片一般
  • 无刷无霍尔BLCD电机控制

    声明 xff1a 本文出自百度文库无刷无霍尔电机控制 xff0c 因为该文为繁体 xff0c 看起来特别别扭 xff0c 特此翻译 文库网址 xff1a span class hljs label https span wenku span
  • 如何高效阅读一篇论文?来自18位教授、主编和博士生的最好建议!

    撰文 Elisabeth Pain xff08 翻译 何伟雄 xff1b 审校 魏潇 xff09 文章来源自公众号科研圈 xff08 ID xff1a keyanquan xff09 即便是专业的科研从业者 xff0c 也无法做到像看小说一
  • 了解FreeRTOS操作系统

    对于初学者来说 xff0c 想要弄懂FreeRTOS操作系统 xff0c 首先需要知道FreeRTOS需要包含哪些文件 xff0c 从官网 https sourceforge net projects freertos files 上下载的
  • Windows程序的入口是哪里?写出Windows消息机制的流程

    Windows程序的入口是WinMain 函数 Windows应用程序消息处理机制 xff1a A 操作系统接收应用程序的窗口消息 xff0c 将消息投递到该应用程序的消息队列中 B 应用程序在消息循环中调用GetMessage函数从消息队
  • Linux内核编译与安装:4.4.0-21→4.14.0

    1 背景 从事Linux环境下开发工作 xff0c 一直想自己玩 xff0c 纯属好奇 xff0c 没撒背景 2 编译环境 zg Linux etc uname a xff08 查看内核 xff09 Linux zg Linux 4 4 0
  • gazebo的学习与使用

    Gazebo教程 xff08 使用roslaunch启动Gazebo world文件和URDF模型 xff09 启动Gazebo xff0c 打开world模型以及向仿真环境中插入机器人模型的方法有很多 xff0e 在这个教程中 xff0c