精华内容
下载资源
问答
  • 更多相关内容
  • gazebo教程(八)场景建模

    千次阅读 2021-05-21 08:25:44
    gazebo教程(八)场景建模 我是。 发布时间 2021.01.03阅读数 1344 评论数 1 场景建模 一、介绍 1、打开场景编辑器 UI介绍 二、导入平面图 三、添加特征 墙壁 添加门窗 添加楼梯 添加层 ...

    转载自:https://www.guyuehome.com/22247

    gazebo教程(八)场景建模

    我是。

    发布时间 2021.01.03阅读数 1344 评论数 1

    场景建模

    一、介绍 1、打开场景编辑器 UI介绍 二、导入平面图 三、添加特征

      • 墙壁
      • 添加门窗
      • 添加楼梯
      • 添加层
      • 编辑建筑物
          • 变更层数
      • 编辑墙体
      • 编辑门窗
      • 添加颜色和纹理
    • 保存场景
    • 退出

    一、介绍

      在gazebo中,我们不仅可以对机器人建模,还可以对场景建模(即机器人所在环境),这一节就给大家介绍如何在gazebo中创建一栋房子,作为机器人的活动空间。  

    1、打开场景编辑器

      启动gazebo,依次点击 Edit -> Building Editor, 或者使用快捷键 Ctrl+B 打开编辑器。界面如下:  

    在这里插入图片描述

     

    UI介绍

      该编辑器由以下3个区域组成:

    • 调色板,在这里你可以选择你的建筑特征和材料。
    • 2D视图,你可以导入楼层平面图,编辑器会根据平面图自动插入插入墙壁,门窗和楼梯。
    • 3D视图,在这里你可以看到你的建筑物的预览。您还可以在其中为建筑物的不同部分分配颜色和纹理。

     

    在这里插入图片描述

     

    二、导入平面图

      您可以从零开始创建建筑场景,也可以使用现有图像作为模板进行追溯。该图像可以是例如建筑物的2D激光扫描。   这里给出示例平面图:  

    在这里插入图片描述

      然后按以下步骤操作:   1、点击调色板下方的Import按钮。然后将会弹出Import Image对话框。   2、选择平面图所在路径,然后单击Next。  

    在这里插入图片描述

      3、为确保在图像上绘制的墙以正确的比例显示,必须以像素/米(px/m)设置图像的分辨率。如果知道分辨率,则可以直接在对话框中输入分辨率,然后单击Ok。在此示例中,我们不知道分辨率,但是我们知道图像中两点之间的真实距离(例如7.5 m的顶壁),因此我们可以使用它来计算分辨率:  

    • 点击墙的一端,然后在另一端释放。当您移动鼠标时,将显示橙色线,如下所示。
    • 现在,在对话框中输入以米为单位的距离(在这种情况下为7.5 m)。分辨率将根据您绘制的线条自动为您计算。
    • 最后,单击Ok

     

    在这里插入图片描述

     

    三、添加特征

     

    墙壁

      我们接下来会根据平面图绘制所有的墙壁。值得注意的是,稍后我们会将门窗附加到墙壁上,因此现阶段可以直接忽略门窗位置。如果你觉得墙壁不完美,不用担心,稍后我们将对其进行更加细致的编辑。  

    • 在调色板上,单击Wall
    • 在2D视图上,在任意墙角单击开始绘制墙体。随着鼠标的移动,墙的长度也会跟着显示。
    • 再次单击可以结束当前墙体的绘制,转而进入相邻墙体的绘制,如果想要取消绘制可以esc。(这里跟cad sw的绘制直线有点类似)。

     

    在这里插入图片描述

     

    默认情况下,墙体会以15°和0.25 m递增,并且还会捕捉到现有墙的端点。如果不希望自动补抓,可在绘图时按住 Shift

     

    添加门窗

      注意:目前,门窗是墙上的简单孔。 让我们在平面图上所示的位置插入门窗。

    • 在面板上,单击WindowDoor
    • 在2D视图中移动鼠标时,要插入的特征会随之移动,在3D视图中其对应物也会随之移动。
    • 单击所需位置以放置特征。
    提示:将鼠标悬停在门上时,门窗会自动与墙壁对齐。移动时会显示到墙端的距离。

     

    在这里插入图片描述

     

    提示:在墙壁上添加了相关特征之后,可能很难看到其在平面图中的位置。为了简化操作,您可以在2D视图的顶部选择查看或隐藏当前级别的平面图或特征。您还可以使用热键来切换可见性, F对应floor和 G对应特征。

     

    在这里插入图片描述

     

    添加楼梯

      尽管在这个平面图上没有显示楼梯,但是我们还是要插入一个楼梯。  

    • 在调色面板上,单击Stairs
    • 在2D视图中移动鼠标时,要插入的楼梯也随之移动,在3D视图中也是如此。
    • 为您的楼梯选择一个位置,然后单击放置它。

     

    在这里插入图片描述

     

    添加层

      我们已经完成了第1层的工作。接下来我们要在建筑物中添加另一个层,使得我们的楼梯能够连接到某个地方。

    • 在2D视图的顶部,单击+添加一个级别。或者,右键单击2D视图,然后选择Add a level
    • 添加新层后,将自动插入地板。如果下面的台阶上有楼梯,则在保存建筑物时,将从地面上挖一个台阶。
    注意:目前,所有楼层均为矩形。 提示:在添加层之前,请确保要在当前层上建立墙体。 提示:目前,建立新的层时是复制上一层的所有墙体,并且使用默认材质。没有其他特征被复制。您可以手动删除不需要的墙。

     

    在这里插入图片描述

     

    编辑建筑物

     

    注意:编辑建筑物时要小心;编辑器目前无法撤消您的操作。 提示:所有度量单位均为米。

     

    变更层数

      由于添加一层,因此在2D视图中我们看到的同样是新一层的平面图。您可以通过从2D视图顶部的下拉列表中选择层2返回到层1。

    提示:在2D视图中,当前选择的层在3D视图中将显示为半透明,而其下面的所有层将显示为不透明。上面的层将被隐藏,但是依旧存在。

      如果有需要,我们还可以编辑一些相关层的配置。  

    • 双击2D视图以打开带有层配置选项的检查器。或者,右键单击并选择Open Level Inspector

    您可能添加了不需要的级别,或者在当前层中弄乱了,并希望重新绘制,可以

    • 按2D视图顶部的-按钮删除当前层,或右键单击并选择Delete Level

     

    在这里插入图片描述

     

    编辑墙体

      我们之前画了很多墙,但是也许它们并没有完全按照我们想要的方式绘制。我们有以下方式可以进行修改:   1、在2D视图中,单击要编辑的墙。

    • 通过将墙拖动到新位置来平移墙。
    • 通过拖动墙的端点之一来调整墙的大小或旋转墙。

      2、在2D视图中双击墙以打开带有配置选项的检查器。或者,右键单击并选择Open Wall Inspector。编辑你想要修改的内容,然后按Apply预览更改。   3、选中你想要删除的墙体,按下键盘上的Delete键,或在2D视图中右键单击墙体,选择Delete。  

    在这里插入图片描述

     

    编辑门窗

      现在让我们一起编辑门窗。正如我们编辑墙体那样,也可以通过以下几种不同的方式更精确地控制门窗属性。   1、在2D视图中,单击要编辑的特征。

    • 通过将特征拖动到新位置来对其进行变换。
    • 拖动特征的旋转手柄来旋转特征。当前,只要将它们附着在墙上,它们的方向就不会改变。
    • 通过拖动端点之一来调整特征的宽度。

      2、双击2D视图中的特征以打开带有配置选项的检查器。或者,右键单击并选择Open Window/Door Inspector   3、选中想要删除的特征,按下键盘的Delete键,或在2D视图中右键单击并选择Delete。  

    在这里插入图片描述

      编辑楼梯同样如此,这里就不细说了  

    在这里插入图片描述

     

    添加颜色和纹理

      现在,一切都已正确放置并确定大小,您可以为墙壁,地板和楼梯分配颜色和纹理。请记住,门窗只是墙上的孔,因此不能有任何材料。   有两种方法可以为建筑物添加颜色和纹理:  

    • 您可以从Wall InspectorStairs InspectorLevel Inspector分别为墙壁,楼梯和地板添加颜色和纹理。只需打开检查器,选择材料,然后按Apply
    • 可以从调色板中选择颜色和纹理,然后通过在3D视图中单击将其分配给建筑物中的项目。

      a、单击调色板中的颜色或纹理。 b、在3D视图中移动鼠标时,悬停的功能将突出显示,显示所选材质的预览。 c、单击突出显示的功能会为其分配选定的材料。您可以根据需要单击任意数量的功能。 d、完成所选材质的操作后,右键单击3D视图,或在任何要素外部单击以退出材质模式。  

    在这里插入图片描述

      凉亭5.1的新增功能:要选择自定义颜色,请在More调色板上单击。将打开一个对话框,您可以在其中指定自定义颜色。  

    在这里插入图片描述

     

    保存场景

      保存之前,在选用板上给您的建筑物起个名字。  

    在这里插入图片描述

      在顶部菜单上,选择File,然后Save As(或按Ctrl+S)。将出现一个对话框,您可以在其中选择模型保存的位置。  

    在这里插入图片描述

     

    退出

      注意:一旦退出场景编辑器后,场景就不能够再次编辑了。   完成创建建筑物并保存之后,请转到File,然后单击Exit Building Editor,您的建筑物将显示在主窗口中。您可以在Insert标签中找到该场景。  

    在这里插入图片描述

     

    在这里插入图片描述

     


    ROSgazebo建模与仿真场景建模

    原创文章作者:我是。。如若转载,请注明出处:古月居 https://www.guyuehome.com/22247

    展开全文
  • 教程描述了 Gazebo 的模型目录结构,以及模型目录中的必要文件。 Gazebo 中的模型定义了具有动态、运动学和视觉属性的物理实体。 此外,一个模型可能有一个或多个插件,这些插件会影响模型的行为。 一个模型可以...

    一、说明:

    首先,Gazebo是个仿真软件,不是模型软件,但Gazebo需要依赖于许多模型;

    Gazebo 能够以编程方式或通过 GUI 将模型动态加载到仿真中。 在您下载或创建模型之后,模型就存在于您的计算机上。 本教程描述了 Gazebo 的模型目录结构,以及模型目录中的必要文件。

    Gazebo 中的模型定义了具有动态、运动学和视觉属性的物理实体。 此外,一个模型可能有一个或多个插件,这些插件会影响模型的行为。 一个模型可以代表任何东西,从简单的形状到复杂的机器人; 连地面都是模型。

    Gazebo 依靠数据库来存储和维护可在模拟中使用的模型。 模型数据库是社区支持的资源,因此请上传和维护您创建和使用的模型。

    二、模型数据库存储库


    模型数据库是在此处找到的 GitHub 存储库。您可以使用以下方法克隆存储库:

       git clone https://github.com/osrf/gazebo_models

    下文专门介绍 gazebo_models中的专属文件。

    三、模型数据库结构


            模型数据库必须遵循特定的目录和文件结构。模型数据库的根目录包含每个模型的一个目录,以及一个包含模型数据库信息的 database.config 文件。每个模型目录还有一个 model.config 文件,其中包含有关模型的元数据。模型目录还包含模型的 SDF 以及任何材料、网格和插件。

            结构如下(在此示例中,数据库只有一个模型,称为 model_1):

    数据库

    • database.config :关于数据库的元数据。现在从 CMakeLists.txt 自动填充
    • model_1 :model_1 的目录
    • model.config : 关于 model_1 的元数据
    • model.sdf : 模型的 SDF 描述
    • model.sdf.erb : Ruby 嵌入式 SDF 模型描述
    • 网格:所有 COLLADA 和 STL 文件的目录
    • material : 一个应该只包含纹理和脚本子目录的目录
    • textures :图像文件(jpg、png 等)的目录。
    • scripts : OGRE 材料脚本的目录
    • plugins:插件源和头文件的目录

    插件目录
    这是一个可选目录,其中包含模型的所有插件。

    网格目录
    这是一个可选目录,其中包含模型的所有 COLLADA 和/或 STL 文件。

    材料目录
    这是一个可选目录,其中包含模型的所有纹理、图像和 OGRE 脚本。 纹理图像必须放在textures 子目录中,而OGRE 脚本文件必须放在scripts 目录中。

    四、数据库配置


    这是模型数据库根目录中的 database.config 文件。 该文件包含模型的许可证信息、数据库的名称和所有有效模型的列表。

    注意:只有在线存储库需要 database.config 文件。 本地计算机上的模型目录不需要 database.config 文件。

    这个 database.config 的格式是:

    <?xml version='1.0'?>
    <database>
      <name>name_of_this_database</name>
      <license>Creative Commons Attribution 3.0 Unported</license>
      <models>
        <uri>file://model_directory</uri>
      </models>
    </database>

    <名称> : 数据库的名称。 这由 GUI 和其他工具使用。

    <许可证> : 数据库中模型的许可证。 我们强烈推荐 Creative Commons Attribution 3.0 Unported 许可证。

    <型号> : 数据库中所有模型 URI 的列表。

    <uri> : 模型的 URI,这应该是 file://model_directory_name

    五、模型配置


    每个模型都必须在模型的根目录中有一个 model.config 文件,其中包含有关模型的元信息。

    这个model.config的格式是:

    <?xml version="1.0"?>
    
    <model>
      <name>My Model Name</name>
      <version>1.0</version>
      <sdf version='1.5'>model.sdf</sdf>
    
      <author>
        <name>My name</name>
        <email>name@email.address</email>
      </author>
    
      <description>
        A description of the model
      </description>
    </model>

    <电子邮件> 必需, 作者的电子邮件地址。

    <描述> 必填, 模型描述应包括:

            模型是什么(例如,机器人、桌子、杯子),  插件的作用(模型的功能)
    <依赖> 可选,此模型的所有依赖项。 这通常是其他模型。

    <型号> 可选,

    <uri> 必需 , 模型依赖的 URI。

    <版本> 必需 ,模型的版本。

    展开全文
  • -- We resume the logic in empty_world.launch, changing only the name of the world to be launched --> "$(find gazebo_ros)/launch/empty_world.launch"> "world_name" value="$(find rrbot_gazebo)/worlds/...

    一. 添加传感器插件
    (1)在rrbot.xacro中添加< link/>和< joint/>,内容如下:

    <joint name="camera_joint" type="fixed">
        <axis xyz="0 1 0" />
        <origin xyz="${camera_link} 0 ${height3 - axel_offset*2}" rpy="0 0 0"/>
        <parent link="link3"/>
        <child link="camera_link"/>
      </joint>
    
      <!-- Camera -->
      <link name="camera_link">
        <collision>
          <origin xyz="0 0 0" rpy="0 0 0"/>
          <geometry>
    	<box size="${camera_link} ${camera_link} ${camera_link}"/>
          </geometry>
        </collision>
    
        <visual>
          <origin xyz="0 0 0" rpy="0 0 0"/>
          <geometry>
    	<box size="${camera_link} ${camera_link} ${camera_link}"/>
          </geometry>
          <material name="red"/>
        </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>
    

    上面是用于rviz加载
    (2)在rrbot.gazebo中添加如下内容:

      <!-- camera -->
      <gazebo reference="camera_link">
        <sensor type="camera" name="camera1">
          <update_rate>30.0</update_rate>
          <camera name="head">
            <horizontal_fov>1.3962634</horizontal_fov>
            <image>
              <width>800</width>
              <height>800</height>
              <format>R8G8B8</format>
            </image>
            <clip>
              <near>0.02</near>
              <far>300</far>
            </clip>
            <noise>
              <type>gaussian</type>
              <!-- Noise is sampled independently per pixel on each frame.
                   That pixel's noise value is added to each of its color
                   channels, which at that point lie in the range [0,1]. -->
              <mean>0.0</mean>
              <stddev>0.007</stddev>
            </noise>
          </camera>
          <plugin name="camera_controller" filename="libgazebo_ros_camera.so">
            <alwaysOn>true</alwaysOn>
            <updateRate>0.0</updateRate>
            <cameraName>rrbot/camera1</cameraName>
            <imageTopicName>image_raw</imageTopicName>
            <cameraInfoTopicName>camera_info</cameraInfoTopicName>
            <frameName>camera_link_optical</frameName>
            <!-- setting hackBaseline to anything but 0.0 will cause a misalignment
                between the gazebo sensor image and the frame it is supposed to
                be attached to -->
            <hackBaseline>0.0</hackBaseline>
            <distortionK1>0.0</distortionK1>
            <distortionK2>0.0</distortionK2>
            <distortionK3>0.0</distortionK3>
            <distortionT1>0.0</distortionT1>
            <distortionT2>0.0</distortionT2>
            <CxPrime>0</CxPrime>
            <Cx>0.0</Cx>
            <Cy>0.0</Cy>
            <focalLength>0.0</focalLength>
          </plugin>
        </sensor>
      </gazebo>
    
    <gazebo reference="camera_link">
    

    首先这个link的名字必须与我们添加到xacro文件中的canera的link匹配。

    <sensor type="camera" name="camera1">
    

    其次传感器的名字必须是唯一的,除了在gazebo插件中,这个名字不能用在其它地方。

    <update_rate>30.0</update_rate>
    

    这是在仿真期间传感器尝试刷新的最大频率,但是当物理仿真速度快于传感器生成的速度时,它会低于这个目标值。

            <horizontal_fov>1.3962634</horizontal_fov>
            <image>
              <width>800</width>
              <height>800</height>
              <format>R8G8B8</format>
            </image>
            <clip>
              <near>0.02</near>
              <far>300</far>
            </clip>
    

    上面的取值是与自身相机物理硬件的规格相匹配。而< near>和< far>表示的是相机可以看到物体的最近和最远距离。

    <plugin name="camera_controller" filename="libgazebo_ros_camera.so">
    

    这个是实际文件gazebo_ros/gazebo_ros_camera.cpp所要链接的。

            <cameraName>rrbot/camera1</cameraName>
            <imageTopicName>image_raw</imageTopicName>
            <cameraInfoTopicName>camera_info</cameraInfoTopicName>
    

    这里定义的是相机发布的话题。对于rrbot,我们所要订阅的话题为:

    /rrbot/camera1/image_raw
    /rrbot/camera1/camera_info
    

    二. 运行launch文件

    roslaunch rrbot_gazebo rrbot_world.launch
    roslaunch rrbot_description rrbot_rviz.launch
    

    结果如下图:
    在这里插入图片描述
    在这里插入图片描述
    运行rqt_graph,显示节点图:
    在这里插入图片描述
    可以看出gazebo和rviz中的机器人状态不一致。
    此时加载的rrbot_world.launch的内容如下:

    <launch>
    
      <!-- these are the arguments you can pass this launch file, for example paused:=true -->
      <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"/>
    
      <!-- 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 rrbot_gazebo)/worlds/rrbot.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 -->
      <param name="robot_description"
        command="$(find xacro)/xacro --inorder '$(find rrbot_description)/urdf/rrbot.xacro'" />
    
      <!-- 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 rrbot -param robot_description"/>
    
    </launch>
    

    rrbot_rviz.launch的内容如下:

    <launch>
      <param name="robot_description"
        command="$(find xacro)/xacro --inorder '$(find rrbot_description)/urdf/rrbot.xacro'" />
    
      <!-- send fake joint values -->
      <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher">
        <param name="use_gui" value="true"/>
      </node>
    
      <!-- Combine joint values -->
      <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"/>
    
      <!-- Show in Rviz   -->
      <node name="rviz" pkg="rviz" type="rviz" args="-d $(find rrbot_description)/launch/rrbot.rviz"/>
    
    </launch>
    

    对于添加激光雷达插件是一样的原理。

    参考:
    http://gazebosim.org/tutorials?tut=ros_gzplugins

    展开全文
  • gazebo教程---在gazebo中使用URDF

    千次阅读 2021-08-14 16:17:48
    一. 背景 虽然URDF在ROS中是一个非常有用的标准格式,但是它缺少很多特性并且不能满足机器人不断发展的需求。URDF只能单独指定一个单个机器人的运动学和...为了解决这个问题,一个新的格式SDF被用在Gazebo以此解决URD
  • gazebo教程---ros_control

    2021-08-15 14:32:30
    一. ros_control和Gazebo的数据流向 在Gazebo中模拟机器人的控制器是可以通过使用ros_control和一个简单的Gazebo插件适配器来完成。下面是仿真,硬件,控制器和传动之间关系的概览:
  • roslaunch gazebo_ros willowgarage_world.launch 运行效果如图: 下面看一下willowgarage_world.launch里的内容: <?xml version="1.0"?> <launch> <!-- We resume the logic in empty_world....
  • gazebo教程之gazebo的结构

    千次阅读 2019-09-28 20:14:58
    官方的教程:http://gazebosim.org/tutorials?tut=architecture&cat=get_started 一、总述 (1)gazebo采用的是分布式结构,将物理环境的仿真和解析、用户的界面接口、通信、传感器数据的产生四部分采用不同的库...
  • #if GAZEBO_MAJOR_VERSION (int _argc, char **_argv) { // Load gazebo as a client #if GAZEBO_MAJOR_VERSION < 6 gazebo::setupClient(_argc, _argv); #else gazebo::client::setup(_argc, _argv); #endif // ...
  • 这一部分将描述在运行gazebo仿真过程的每一部分。 《一》world files 环境文件、世界文件 这个world描述文件包含所有在仿真过程的元素模块。包括机器人(robot)、光照、传感器和静态的物体。这个文件的格式是使用...
  • Gazebo教程(使用roslaunch 启动Gazebo,world以及urdf模型) 关于如何学习ROS可以参考古月居的这篇文章 1、 https://www.zhihu.com/question/35788789/answer/580258849 推荐一些好的参考 2、...
  • 启动Gazebo,打开world模型以及向仿真环境中插入机器人模型的方法有很多.在这个教程中,我们将使用rosrun和roslaunch来实现.这里包括将URDF文件存储在ROS包中,并保留相对于ROS工作区的各种资源路径。一.使用...
  • gazebo教程(10)制作一个简单的夹子

    千次阅读 2020-03-21 15:04:19
    教程介绍了如何通过编辑SDF文件来制作简单的两杆式夹持器。 想要以图形化界面的方式编辑模型,请参见“ 模型编辑器” 教程
  • ROS中gazebo配置教程详解

    千次阅读 2020-06-02 18:07:29
    ROS中gazebo配置教程详解机器人模型文件获取原始URDF模型文件采用xacro格式改写文件增加gazebo插件描述增加传动transmission最后将上面三个文件合成一个文件环境XX.world文件配置文件××.yaml 每次配置机械臂到...
  • ros gazebo基础教程

    千次阅读 2018-03-16 09:56:19
    本人用的ros版本是kinetic,因为比较穷。。所以就一直在找可以...1.首先安装turtlebot-gazebo,在gazebo环境下进行turtlebot的仿真 apt-get install ros-kinetic-turtlebot-gazebo 2.启动gazebo roslaunch tu...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,170
精华内容 868
关键字:

gazebo教程