ROS学习笔记十二:使用gazebo在ROS中仿真

2023-05-16

想要在ROS系统中对我们的机器人进行仿真,需要使用gazebo。

gazebo是一种适用于复杂室内多机器人和室外环境的仿真环境。它能够在三维环境中对多个机器人、传感器及物体进行仿真,产生实际传感器反馈和物体之间的物理响应。

在本文中,你会学习如何使用之前创建的机器人模型,如何加载一个激光雷达传感器和摄像头,并使机器人模型像真的机器人一样移动。


一、在 gazebo 中使用 URDF 3D 模型

在 gazebo 工作前,我们需要安装ROS功能包与 gazebo 交互:

$ sudo apt-get install ros-indigo-gazebo-ros-pkgs ros-indigo-ros-control


为了在 gazebo 中导入机器人模型,你需要先完成 URDF 模型。在这里我们将使用.xacro文件,虽然这可能更复杂,但是对于代码开发来说其功能非常强大。你能够在 chapter7_tutorials/robot1_description/urdf/robot1_base_01.xacro 找到修改后的文件:(由于代码过多,所以并未完全贴出,下面只是很少的一部分代码)

<link name="base_link">
    <visual>
        <geometry>
            <box size="0.2 .3 .1"/>
        </geometry>
        <origin rpy="0 0 1.54" xyz="0 0 0.05"/>
        <material name="white">
            <color rgba="1 1 1 1"/>
        </material>
    </visual>
    <collision>
        <geometry>
            <box size="0.2 .3 0.1"/>
        </geometry>
    </collision>
    <xacro:default_inertial mass="10"/>
</link>

这是机器人底盘 base_link 的新代码。请注意 collision 和 inertial 部分对于在 gazebo 中运行模型是必需的,这样才能计算机器人的物理响应。


想要启动这一切,我们创建一个名为 gazebo.launch 的启动文件到 chapter7_tutorials/robot1_gazebo/launch 文件夹下,并添加以下代码:

<?xml version="1.0"?>
<launch>

  <!-- these are the arguments you can pass this launch file, for example paused:=true -->
  <arg name="paused" default="true"/>
  <arg name="use_sim_time" default="false"/>
  <arg name="gui" default="true"/>
  <arg name="headless" default="false"/>
  <arg name="debug" default="true"/>

  <!-- 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 robot1_gazebo)/worlds/robot.world"/>
    <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>

  <!-- Load the URDF into the ROS Parameter Server -->
  <arg name="model" />
  <param name="robot_description" 
     command="$(find xacro)/xacro.py $(arg model)" />

  <!-- Run a python script to the send a service call to gazebo_ros to spawn a URDF robot -->
   <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
    args="-urdf -model robot1 -param robot_description -z 0.05"/> 

</launch>


想要启动文件,需要使用以下命令:

$ roslaunch robot1_gazebo gazebo.launch model:="`rospack find robot1_description`/urdf/robot1_base_01.xacro"

然后可以在 gazebo 中看到机器人。仿真初始状态是暂停的,你可以点击 paly 来运行它。(不过机器人不会移动)

ROS_chap12_A.png

正如你所见,模型并没有任何纹理渲染。在rviz中你能看到在URDF文件中声明的纹理。但是在 gazebo 中,你看不到它们。为了在 gazebo 中添加可见的纹理,需要在你的 .gazebo 模型文件中创建robot.gazebo文件。将 robot1_description/urdf/robot1_base_01.xacro 文件另存为 robot1_base_02.xacro,并添加如下代码,即可创建robot.gazebo文件:

<xacro:include filename="$(find robot1_description)/urdf/robot.gazebo" />

启动这个新文件,你看到的机器人虽然还是同一个,但已经带有纹理了:

$ roslaunch robot1_gazebo gazebo.launch model:="`rospack find robot1_description`/urdf/robot1_base_02.xacro"

你将会看到以下输出:

ROS_chap12_B.png


二、在 gazebo 中添加传感器

在gazebo中,你能够对机器人的物理运动进行仿真。你同样能仿真它的传感器。

在本节中我们将会向模型中添加一个摄像头和激光雷达传感器。

我们会从 gazebo_ros_demos 功能包中调用激光雷达。这是ROS的神奇之处,你能从其他功能包中复用代码从而简化开发。

我们唯一需要做的是向 robot1_base_02.xacro 文件中增加这些行,来为机器人添加 Hokuyo 激光雷达3D模型,并另存为 robot1_base_03.xacro 文件:

  <!-- Hokuyo Laser -->
  <link name="hokuyo_link">
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
    <box size="0.1 0.1 0.1"/>
      </geometry>
    </collision>

    <visual>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <mesh filename="package://robot1_description/meshes/hokuyo.dae"/>
      </geometry>
    </visual>

    <inertial>
      <mass value="1e-5" />
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <inertia ixx="1e-6" ixy="0" ixz="0" iyy="1e-6" iyz="0" izz="1e-6" />
    </inertial>
  </link>


在 robot.gazebo 文件里,我们将添加 libgazebo_ros_laser 插件,这样就可以模拟 Hokuyo 激光测距雷达的行为。

  <!-- hokuyo -->
  <gazebo reference="hokuyo_link">
    <sensor type="ray" name="head_hokuyo_sensor">
      <pose>0 0 0 0 0 0</pose>
      <visualize>false</visualize>
      <update_rate>40</update_rate>
      <ray>
        <scan>
          <horizontal>
            <samples>720</samples>
            <resolution>1</resolution>
            <min_angle>-1.570796</min_angle>
            <max_angle>1.570796</max_angle>
          </horizontal>
        </scan>
        <range>
          <min>0.10</min>
          <max>30.0</max>
          <resolution>0.01</resolution>
        </range>
        <noise>
          <type>gaussian</type>
          <!-- Noise parameters based on published spec for Hokuyo laser
               achieving "+-30mm" accuracy at range < 10m.  A mean of 0.0m and
               stddev of 0.01m will put 99.7% of samples within 0.03m of the true
               reading. -->
          <mean>0.0</mean>
          <stddev>0.01</stddev>
        </noise>
      </ray>
      <plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_laser.so">
        <topicName>/scan</topicName>
        <frameName>hokuyo_link</frameName>
      </plugin>
    </sensor>
  </gazebo>


使用以下命令启动新的模型:

$ roslaunch robot1_gazebo gazebo.launch model:="`rospack find robot1_description`/urdf/robot1_base_03.xacro"

你将会看到附带激光雷达模块的机器人。

ROS_chap12_C.png


采用同样的方法,我们向 robot.gazebo 和 robot1_base_03.xacro 添加几行代码以增加另一个传感器(一个摄像头)。

再使用以下命令启动添加摄像头后的模型:

$ roslaunch robot1_gazebo gazebo.launch model:="`rospack find robot1_description`/urdf/robot1_base_04.xacro"

注意,这个激光雷达会像真实的雷达一样产生“真实"的传感器数据。你能够通过 rostopic echo 命令看到这些数据:

$ rostopic echo /robot/laser/scan

我们可以向摄像头发出相同命令,但如果你想观察摄像头看到的 gazebo 仿真图像,你可以在终端中写入以下指令:

$ rosrun image_view image_view image:=/robot/camera1/image_raw


下面是点击"play"允许后摄像头拍摄的图像。

ROS_chap12_D.png


三、在 gazebo 中加载和使用地图

在本小节中我们将会使用一张柳树车库公司(Willow Garage)办公室的地图、这张地图在我们的ROS软件中应该默认安装了,保存在 gazebo_worlds 功能包中。

为了检查模型,可以使用以下命令启动 .launch 文件:

$ roslaunch gazebo_ros willowgarage_world.launch

你会在 gazebo 中看到3D的办公室。这个办公室只有墙壁,你可以添加桌子、椅子和其他你想添加的物体。


我们现在要做的是创建一个新的 .launch 文件来同时加载地图和机器人。为实现这个功能,我们在 robot1_gazebo/launch 文件夹下创建一个名为 gazebo_wg.launch 的文件,并添加以下代码:

<?xml version="1.0"?>
<launch>
  <include file="$(find gazebo_ros)/launch/willowgarage_world.launch">
  </include>

  <!-- Load the URDF into the ROS Parameter Server -->
  <param name="robot_description"
         command="$(find xacro)/xacro.py '$(find robot1_description)/urdf/robot1_base_04.xacro'" />
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />

  <!-- Run a python script to the send a service call to gazebo_ros to spawn a URDF robot -->
   <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
        args="-urdf -model robot1 -param robot_description -z 0.05"/>

</launch>


现在运行带有机器人的地图模型文件(注意:有些时候会出现软件崩溃,多尝试运行几次):

$ roslaunch robot1_gazebo gazebo_wg.launch 

你会在 gazebo 中看到机器人和地图。下一步是在仿真虚拟环境中命令机器人移动和接受其传感器的仿真读数。


四、在 gazebo 中移动机器人

滑移转向(skid-steer)机器人是一种对机身两侧轮子分别进行驱动的移动机器人。它通过将两侧轮子控制在不同的转速(所产生的转速差)进行转向,而不需要轮子有任何转向行动。

正如前面所说,在 gazebo 中我们需要对机器人、关节、传感器等设备的行为进行编程。和前面的激光雷达一样,gazeb 也已经有了 skid 驱动的实现,我们能够直接使用它移动机器人。使用此行驶控制器,只需要在模型文件(robot1_base_04.xacro)中增加以下代码:

  <!-- Drive controller -->
<gazebo>
  <plugin name="skid_steer_drive_controller" filename="libgazebo_ros_skid_steer_drive.so">
    <updateRate>100.0</updateRate>
    <robotNamespace>/</robotNamespace>
    <leftFrontJoint>base_to_wheel1</leftFrontJoint>
    <rightFrontJoint>base_to_wheel3</rightFrontJoint>
    <leftRearJoint>base_to_wheel2</leftRearJoint>
    <rightRearJoint>base_to_wheel4</rightRearJoint>
    <wheelSeparation>4</wheelSeparation>
    <wheelDiameter>0.1</wheelDiameter>
    <robotBaseFrame>base_link</robotBaseFrame>
    <torque>1</torque>
    <topicName>cmd_vel</topicName>
    <broadcastTF>0</broadcastTF>
  </plugin>
</gazebo>

你在代码中能够看到的参数都是一些简单的配置,以便这个控制器能够支持4个轮子的机器人工作。例如,我们选择 base_to_wheel1、base_to_wheel2、base_to_wheel3、base_to_wheel4 关节作为机器人的驱动轮。


另外一个有趣的参数是 topicName。我们需要以这个参数为名发布命令来控制机器人。此时,当你发布一个 sensor_msgs/Twist 主题调用 /cmd_vel 时,机器人将会移动。正确配置轮子关节的方向非常重要,按照xacro文件中的当前方向,机器人将上下移动,因此有必要修改四个轮子的初始rpy,如以下代码中的 base link 和 wheel1 关节:

 <joint name="base_to_wheel1" type="continuous">
   <parent link="base_link"/>
   <child link="wheel_1"/>
   <origin rpy="-1.5707 0 0" xyz="0.1 0.15 0"/>
   <axis xyz="0 0 1" />
 </joint>

所有修改都保存在 chapter7_tutorials/robot1_description/urdf/robot1_base_04.xacro 文件中。现在我们使用以下命令启动带有控制器、机器人和地图的模型:

$ roslaunch robot1_gazebo gazebo_wg.launch

你将会在 gazebo 屏幕中看到机器人在地图上。现在我们将使用键盘来移动地图中的机器人。这个节点在 teleop_twist_keyboard 功能包中,发布 /cmd_vel 主题。运行以下命令以按照此功能包:

$ sudo apt-get install ros-indigo-teleop-twist-keyboard
$ rosstack profile
$ rospack profile


然后,运行节点如下:

$ rosrun teleop_twist_keyboard teleop_twist_keyboard.py 

现在你会看到一个有很多说明的新命令行窗口,你可以使用(u,i,o,j,k,l,m,“,”,“.”)按键来移动机器人并设置最大速度。(目前已知u键是加速,j键是左转,k键是减速,l键是右转)

如果一切顺利的话,你可以驾驶机器人穿越 Willow Garage 的办公室。你可以观察到激光雷达数据和摄像头显示的图像。


五、小节

在本文中,你学会了如何创建一个属于自己的3D机器人模型。这包括对添加纹理、创建关节和说明如何使用节点来移动机器人等工作的详细解释。

概况来讲,我们已经看到了如何复用其他机器人的部件来设计我们自己的机器人,特别是我们已经包含了抓取器并添加了传感器,例如一个激光雷达和一个摄像头。

因此,在仿真中不需要完全从无到有来建造一个机器人,社区里已经开发了大量的机器人,你可以下载代码并在 ROS 和 gazebo 中运行它们,如有必要也可以修改它们。


转载于:https://www.cnblogs.com/linuxAndMcu/p/10876005.html

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

ROS学习笔记十二:使用gazebo在ROS中仿真 的相关文章

  • 快速测试端口的连通性(HTTP/HTTPS)

    ping 仅限 80 端口 xff0c 命令中无法指定端口 xff1a span class hljs label C span Users Administrator gt span class hljs built in ping sp
  • 支持 UTF-8 中文的串口调试工具

    支持 UTF 8 中文的串口调试工具 最近使用 mdk526 xff0c 编辑设置使用 utf 8 xff0c 编辑窗口中文正常 xff0c 但是编译的时候提示 warning 870 D invalid multibyte charact
  • Linux

    Linux服务 TOC mysql 关系型数据库 关系 就是一个一个的二维表 其中 表中的行 列次序并不重要 行 record 表中的每一行 又称为一条记录 列 column 表中的每一列 称为属性 字段 主键 primary key 是一
  • Eclipse怎么样添加智能感知提示功能(含Windows版和Mac版)

    近日感兴趣于安卓 xff0c 开始学习Android开发 第一次使用Eclipse xff0c 用久了VS xff0c 也习惯了他的智能提示 xff0c 刚转到Eclipse下实在是不习惯 网上有人说按Alt 43 可以实现单词补全功能 x
  • ORB-SLAM2:一种开源的VSLAM方案(译文)

    摘要 xff1a ORB SLAM2是基于单目 xff0c 双目和RGB D相机的一套完整的SLAM方案 它能够实现地图重用 xff0c 回环检测和重新定位的功能 无论是在室内的小型手持设备 xff0c 还是到工厂环境的无人机和城市里驾驶的
  • 双目视觉几何框架详解

    一 图像坐标 xff1a 我想和世界坐标谈谈 A 玉米竭力用轻松具体的描述来讲述双目三维重建中的一些数学问题 希望这样的方式让大家以一个轻松的心态阅读玉米的 计算机视觉学习笔记 双目视觉数学架构系列博客 这个系列博客旨在捋顺一下已标定的双目
  • C#之委托

    委托 xff1a 顾名思义 xff0c 让别人帮你办件事 委托是C 实现回调函数的一种机制 可能有人会问了 xff0c 回调函数是个啥 xff1f xff1f xff1f 举个例子 xff1a 我现在是一家公司的老板 xff0c 公司现在在
  • http://mirrors.163.com/centos/7.6.1810/os/x86_64/repodata/repomd.xml: [Errno 14]

    执行 vi etc yum repos d CentOS Base repo 里面内容都清楚 xff0c 然后把下面的复制粘贴上 CentOS Base repo The mirror system uses the connecting
  • 剑指offer T8跳台阶

    由推导可知 xff0c 递推公式为 f n 61 f n 1 43 f n 2 迭代法 xff1a 递归 xff1a 递归优化 xff08 保存结果 xff0c 剪枝 xff09 xff1a 转载于 https www cnblogs co
  • linux磁盘占用满了,docker日志清理

    磁盘分析命令 xff1a df h 查看当前文件夹所有文件大小 xff1a du sh 查看docker各容器占用的磁盘空间 du d1 h var lib docker containers sort h docker日志文件 xff1a
  • Install gitlab enterprise on ubuntu

    1 Install and configure the necessary dependencies sudo apt get update sudo apt get install y curl openssh server ca cer
  • python-docx 设置标题heading的中文字体类型+设置正文的中文字体类型

    依赖包 xff1a from docx import Document from docx shared import Pt from docx shared import Inches from docx oxml ns import q
  • 单片机显示原理(LCD1602)

    一 xff0e 接口 LCD1602是很多单片机爱好者较早接触的字符型液晶显示器 xff0c 它的主控芯片是HD44780或者其它兼容芯片 与此相仿的是LCD12864液晶显示器 xff0c 它是一种图形点阵显示器 xff0c 能显示的内容
  • 使用Simulink进行无刷直流电机控制仿真

    这段时间刚开始接触Matlab中的Simulink仿真 xff0c 我就结合自己的专业 xff0c 利用Simulink进行了无刷直流电机的仿真 xff0c 因为Simulink工具箱里面有很多可用的模块 xff0c 所以建模过程变得非常简
  • MATLAB绘制向量图

    MATLAB绘制向量图 对于如何在二维平面中绘制带箭头的向量 xff0c 先给出一个实例 xff1a clear clc A 61 4 5 B 61 10 0 C 61 A 43 B M 61 A B C X 61 M 1 A 1 Y 61
  • 图文并茂 RAID 技术全解 – RAID0、RAID1、RAID5、RAID100

    RAID 技术相信大家都有接触过 xff0c 尤其是服务器运维人员 xff0c RAID 概念很多 xff0c 有时候会概念混淆 这篇文章为网络转载 xff0c 写得相当不错 xff0c 它对 RAID 技术的概念特征 基本原理 关键技术
  • 推荐几个知名顶级的文献网站

    有人在后台给我留言 xff0c 让我推荐几个查找文献的网站 xff0c 周末特别花了点时间整理了一下 在这里推荐给大家 xff0c 希望对大家有帮助 xff01 本文总共分为2篇 xff0c 一篇为国内的网站 xff0c 一篇为国外的网站
  • 树莓派3折腾笔记

    这篇教程将带您一起玩转树莓派3 xff08 Raspberry Pi 3 xff09 和普通PC一样 xff0c 拿到新设备第一件事就是要给它安装一个操作系统 xff0c 并做一些初始化的操作 比PC简单的是 xff0c 树莓派是一个固定配
  • linux系统怎么安全杀毒软件,Linux系统用什么杀毒软件 为什么Linux不中毒

    Linux下有哪些杀毒软件 国产的我找了一遍貌似没有 xff0c 国外的avast norton eset也不支持 其实之前有了解过Linux不容易中毒 xff0c 但没有考虑过Linux下有哪些杀毒软件 xff0c 为什么Linux不容易
  • electron与jquery起冲突,使用jquery报错解决方法

    问题原因 xff1a Electron 为了整合 Node js xff0c 会在 DOM 加入 module exports require 等模块和函数 xff0c 和jQuery RequireJS Meteor AngularJS

随机推荐

  • 安装图形化界面consol/centos-xfce-vnc

    直接通过docker hub上的centos镜像安装centos docker search centos docker 64 localhost education docker search centos NAME DESCRIPTIO
  • php curl http digest

    php用curl访问有http digest验证的网址时 xff0c 不能直接加在URL上 xff0c 例如 xff1a http user pass 64 xxx xxx xxx xxx index php a 61 1 amp b 61
  • PS基础教程[1]如何制作微信泡泡

    PS是很多朋友都很喜欢额一款图像处理软件 xff0c 我们可以使用PS制作很多的效果 xff0c 本系列经验教程的起源就来源于知道中这位朋友问的微信泡泡如何使用 xff0c 下面就来简单的分享一下 微信泡泡制作方法 有很多的方法可以制作这种
  • 《计算机组成原理》第6章:总线

    第6章 xff1a 总线 6 1 总线概述 总线的定义 总线是一组能为多个部件分时共享的公共信息传送线路 分时和共享是总线的两个特点 分时是指同一时刻只允许有一个部件向总线发送信息 xff0c 如果系统中有多个部件 xff0c 则它们只能分
  • Fragment生命周期及add、replace、remove、hide&show方法分析

    转载自https blog csdn net u014699958 article details 52996143 项目有一个Activity类和3个Fragment类 Activity 中放置3个按钮 xff08 实质TextView
  • Fragment 中使用 getActivity()为null的原因---剖析源码

    问题 xff1a 使用 AS 在 Fragment 中调用 getActivity 方法的时候会出现可能为空指针的提醒 思考 为什么会出现这种情况 xff0c 按说当前 Activity 存在 xff0c 在 Fragment 中使用 ge
  • 测试用例设计方案

    以淘宝加入购物车为例 xff1a 1 看整个流程分为几个节点 xff1a a 选择物品 b 点击加入购物车 c 查看购物车 结果验证 2 根据每个节点的输入输出设计场景 a 选择物品的场景的影响因素 xff1a 请求来源 设备 账号 库存
  • CSS transform中的rotate的旋转中心怎么设置

    transform origin 属性 默认情况 xff0c 变形的原点在元素的中心点 xff0c 或者是元素X轴和Y轴的50 处 我们没有使用transform origin改变元素原点位置的情况下 xff0c CSS变形进行的旋转 移位
  • 松耦合和紧耦合

    Question 首先 xff0c 明确一点 xff0c 什么是松耦合 xff1f 什么是紧耦合 xff1f Answer 比如说两个模块 xff0c A模块和B模块 xff0c 当两者的关联非常多的时候 xff0c 就叫紧耦合 xff0c
  • 把pandas dataframe转为list方法

    把pandas dataframe转为list方法 先用numpy的 array 转为ndarray类型 xff0c 再用tolist 函数转为list 转载于 https www cnblogs com lichunl p 9622923
  • docker容器中使用top、free命令查看容器真实cpu和内存使用情况的实践

    参考 xff1a https www colabug com 1759782 html 转载于 https www cnblogs com robinunix p 10482908 html
  • 人性的弱点之情商

    处理好人际关系 真诚赞美他人 xff0c 不要过度批评他人 赢得他人喜爱的4个方式 xff1a 真诚关注他人 记住名字和生日 建立好的第一印象 保持微笑 善谈就是倾听 迎合对方兴趣 让他人为你所用 xff1a 避免争论 避免树敌 坦率承认自
  • 小米笔记本进入安全模式比较靠谱的方法

    在锁屏界面 xff0c 按住shift按键 xff0c 然后右下角进入重启就可以进入win10恢复模式 转载于 https www cnblogs com yang xiansen p 10471358 html
  • pytorch 中Tensor.uniform_代替numpy.random.uniform

    uniform from 61 0 to 61 1 Tensor 将tensor用从均匀分布中抽样得到的值填充 例如 a 61 torch Tensor 2 3 uniform 1 1 转载于 https www cnblogs com z
  • STM32 嵌入式操作系统的进入 HardFault_Handler分析

    STM32在使用中 xff0c 因为一般没有其他异常抛出 xff0c 所以抛出异常一般都是HardFault Handler 导致产生该现象的原因有一下几点 xff1a 1 数组越界操作 xff1b 2 内存溢出 xff0c 访问越界 xf
  • Linux批量加连续端口映射,批量端口映射

    内网ip 10 199 2 12 虚拟机网络 192 168 10 0 24 内网访问示例 xff0c 如访问ip为192 168 10 20的虚拟机 xff0c 远程桌面 10 199 2 12 6020 vnc 10 199 2 12
  • 想做Linux/Unix下的软件开发

    我学Linux Unix已经有段时间了 xff0c 工作中我也会写些Shell Script去完成一些任务 但是Linux Unix下的应用我还是没有开发过的 xff0c 基本上是拿来主义 xff0c 直接用别人开发好的软件包 其中最根本的
  • mpu和嵌入式linux区别,详解DSP、MCU、MPU的区别

    详解DSP MCU MPU的区别 2018年09月10日 11 17 57来源 xff1a 网络关键词 xff1a 嵌入式操作系统 CPU Central Processing Unit xff0c 中央处理器 发展出来三个分枝 xff0c
  • ug支持linux系统吗,Linux 黑话解释:什么是长期支持(LTS)版本?什么是 Ubuntu LTS?...

    在 Linux 的世界里 xff0c 特别是谈到 Ubuntu 的时候 xff0c 你会遇到 LTS 长期支持Long Term Support 这个词 如果你是一个经验丰富的 Linux 用户 xff0c 你可能知道 Linux 发行版的
  • ROS学习笔记十二:使用gazebo在ROS中仿真

    想要在ROS系统中对我们的机器人进行仿真 xff0c 需要使用gazebo gazebo是一种适用于复杂室内多机器人和室外环境的仿真环境 它能够在三维环境中对多个机器人 传感器及物体进行仿真 xff0c 产生实际传感器反馈和物体之间的物理响