• 【gazebo要素4】构建插件


    一、提要

            欢迎来到中级模块!本模块将指导您完成创建新模拟功能并将该功能贡献给 Gazebo 的过程。

            我们基础知识需要: Gazebo 、Linux。我们还假设您是一位专业的教程阅读者(仔细、完整地阅读所有内容)。

            在本系列教程中,我们将创建一个 Velodyne HDL-32 LiDAR,我们将逐步完成

    1. 创建 HDL-32 传感器的 SDF 模型,
    2. 将模型贡献给 Gazebo 的模型数据库,
    3. 改善模型的外观和数据输出,
    4. 使用插件控制模型,以及
    5. 在 Gazebo 和 RViz 中可视化传感器数据。

            上述每个主题都将有专门的教程解说。本教程的 重点是 Velodyne SDF 模型的创建。

    二、生成模型

            创建新模型的第一步是收集有关模型的信息。在这种情况下,Velodyne 激光雷达公司在其网站 Velodyne 的 HDL-32E 环绕激光雷达传感器 | 上提供了有关其传感器的文档。 Velodyne 激光雷达。如果没有关于模型的详细信息,那么您可以测量物理版本,询问制造商的规格,或者在最坏的情况下猜测。

            根据 Velodyne 文档,我们将创建一个传感器,该传感器具有:

    1. 底部圆柱体和顶部圆柱体,顶部圆柱体在其中旋转,以及
    2. 一组垂直扇形定向的激光射线。

    2.1 Step 1: 生成基座的 SDF模型

    1. 生成新文件.

      1. cd
      2. gedit velodyne.world
    2. 使用地平面和灯光填充世界文件:

      1. <sdf version="1.5">
      2. <world name="default">
      3. <include>
      4. <uri>model://sunuri>
      5. include>
      6. <include>
      7. <uri>model://ground_planeuri>
      8. include>
      9. world>
      10. sdf>
    3. 接下来,我们将 Velodyne LiDAR 的基础知识添加到 SDF 世界文件中。我们将使用 Velodyne 传感器尺寸来构建一个基圆柱体和一个顶部圆柱体。下面是 Velodyne 2D 绘图的屏幕截图。

    1. 将以下内容复制到 SDF 世界文件中,直接位于 标记之前。

      1. <model name="velodyne_hdl-32">
      2. <link name="base">
      3. <pose>0 0 0.029335 0 0 0pose>
      4. <collision name="base_collision">
      5. <geometry>
      6. <cylinder>
      7. <radius>.04267radius>
      8. <length>.05867length>
      9. cylinder>
      10. geometry>
      11. collision>
      12. <visual name="base_visual">
      13. <geometry>
      14. <cylinder>
      15. <radius>.04267radius>
      16. <length>.05867length>
      17. cylinder>
      18. geometry>
      19. visual>
      20. link>
      21. <link name="top">
      22. <pose>0 0 0.095455 0 0 0pose>
      23. <collision name="top_collision">
      24. <geometry>
      25. <cylinder>
      26. <radius>0.04267radius>
      27. <length>0.07357length>
      28. cylinder>
      29. geometry>
      30. collision>
      31. <visual name="top_visual">
      32. <geometry>
      33. <cylinder>
      34. <radius>0.04267radius>
      35. <length>0.07357length>
      36. cylinder>
      37. geometry>
      38. visual>
      39. link>
      40. model>
    2. 在构建新模型时,定期尝试小的更改是个好主意。启动 Gazebo 已暂停,以便您可以在物理引擎不改变模型姿势的情况下查看模型。还有一些其他图形工具可以帮助开发过程,我们将在本教程的过程中介绍这些工具。

    3. 暂停运行 Velodyne 世界(-u 参数)。

      1. cd
      2. gazebo velodyne.world -u
    4. 默认情况下,您会在模型中看到 元素,这些元素定义了模型的外观。另一方面, 元素定义了模型在与其他模型碰撞时的行为方式。要查看和调试 元素,请右键单击模型,然后选择“查看”->“碰撞”。现在试试这个,你应该会看到两个橙色圆柱体(由于它们的距离很近,看起来像一个圆柱体)。

    2.2 Step 2: 添加惯性

            此时,我们的 Velodyne 模型缺少惯性矩等动态属性。物理引擎使用惯性信息来计算模型在受力时的行为方式。具有不正确或没有惯性值的模型将以奇怪的方式表现。

           1)首先可视化当前的惯性值。在 Gazebo 运行时,右键单击 Velodyne 并选择 View->Inertia。这将导致出现两个紫色框。

    通常,每个紫色框应与与其关联的链接的大小大致匹配。您会注意到当前的惯性框非常大,这是由于我们的模型缺少惯性信息。

    1. 我们可以通过指定质量和惯性矩阵来为链接添加惯性。我们将质量基于 Velodyne 的指定质量,即 1.3 千克,并给予基本链接多数(此分布是我们的猜测)。惯性矩矩阵可以使用维基百科上的方程计算。

      以下是基础链接的惯性值。将 块复制到指定位置。

      1. <model name="velodyne_hdl-32">
      2. <link name="base">
      3. <pose>0 0 0.029335 0 0 0pose>
      4. <inertial>
      5. <mass>1.2mass>
      6. <inertia>
      7. <ixx>0.001087473ixx>
      8. <iyy>0.001087473iyy>
      9. <izz>0.001092437izz>
      10. <ixy>0ixy>
      11. <ixz>0ixz>
      12. <iyz>0iyz>
      13. inertia>
      14. inertial>

      接下来为顶部链接添加惯性值。将以下 <惯性> 块复制到指定位置。

      1. <link name="top">
      2. <pose>0 0 0.095455 0 0 0pose>
      3. <inertial>
      4. <mass>0.1mass>
      5. <inertia>
      6. <ixx>0.000090623ixx>
      7. <iyy>0.000090623iyy>
      8. <izz>0.000091036izz>
      9. <ixy>0ixy>
      10. <ixz>0ixz>
      11. <iyz>0iyz>
      12. inertia>
      13. inertial>
    2. 有了惯性值,可视化应该类似于下图。

            在模型创建过程的这一点上,您应该拥有一个具有正确视觉、碰撞和惯性属性的模型。我们现在将移动到关节。

    2.3 Step 3: 加入关节

            关节定义链接之间的约束。在机器人领域,最常见的关节类型是旋转的。旋转关节定义了两个连杆之间的单个旋转自由度。可以在 SDF 网站上找到完整的关节列表。

            当然,可以可视化关节。运行 Gazebo 时,右键单击模型,然后选择查看 -> 关节。关节通常位于模型内,因此您可能必须使模型透明才能看到关节可视化(右键单击模型并选择查看->透明)。

    1. 我们首先必须在 Velodyne 模型中添加一个关节。关节将是旋转的,因为顶部连杆将相对于基本连杆旋转。

    2. 打开 SDF 世界,并在 标签前添加一个旋转关节。

      1. <joint type="revolute" name="joint">
      2. <pose>0 0 -0.036785 0 0 0pose>
      3. <parent>baseparent>
      4. <child>topchild>
      5. <axis>
      6. <xyz>0 0 1xyz>
      7. <limit>
      8. <lower>-10000000000000000lower>
      9. <upper>10000000000000000upper>
      10. limit>
      11. axis>
      12. joint>
    3. 运行 SDF 世界,暂停并可视化关节。

    1. gazebo velodyne.world -u
    2. 右键点击 model并选 View->Joints
    3. 右键点击 model并选  View->Transparent

    1. 我们还可以使用 Joint Command 图形工具验证关节是否正确旋转。拖动主窗口上打开的右侧面板,然后选择 Velodyne 模型。

    2. 使用此小部件中的“力”选项卡向关节施加较小的力,0.001 即可。取消暂停世界,您应该会看到可视化关节开始围绕模型的 Z 轴旋转。

            至此,我们有了一个具有有效惯性、碰撞和关节属性的 Velodyne 模型。在下一节中,我们将介绍模型的最后一部分,即传感器的添加。

    2.4 Step 4: 添加 sensor

            传感器用于从环境或模型生成数据。在本节中,我们将为 Velodyne 模型添加一个光线传感器。 Gazebo 中的射线传感器由一个或多个光束组成,这些光束会产生距离和潜在的强度数据。

            一个射线传感器由一个 和一个 SDF 元素组成。 元素定义光束的布局和数量, 元素定义单个光束的属性。

             元素中包含 元素。 组件定义在水平平面中散开的光线, 组件定义在垂直平面中散开的光线。

            Velodyne 传感器需要垂直射线,然后旋转。我们将其模拟为旋转的水平风扇。我们采用这种方法是因为在 Gazebo 中可视化数据会更容易一些。 Velodyne 规范表明 HDL-32 有 32 条射线,垂直视场介于 +10.67 和 -30.67 度之间。

    1. 我们将光线传感器添加到顶部链接。将以下内容复制到
      <link name="top"> 元素,在velodyne.world文件内
      
      1. <sensor type="ray" name="sensor">
      2. <pose>0 0 -0.004645 1.5707 0 0pose>
      3. <visualize>truevisualize>
      4. <update_rate>30update_rate>
      5. sensor>
    2. 接下来,我们将添加 元素,它定义了 元素。将以下 SDF 放在 元素中(直接在 元素下方效果很好)。

      1. <ray>
      2. <scan>
      3. <horizontal>
      4. <samples>32samples>
      5. <resolution>1resolution>
      6. <min_angle>-0.53529248min_angle>
      7. <max_angle>0.18622663max_angle>
      8. horizontal>
      9. scan>
      10. <range>
      11. <min>0.05min>
      12. <max>70max>
      13. <resolution>0.02resolution>
      14. range>
      15. ray>
    3. 再次启动模拟,您应该可以看到 32 个传感器光束在没有暂停时。

    后续操作

            现在我们有了 Velodyne LiDAR 模型,我们可以通过三种方式对其进行改进:

    • 添加 3D 网格以改善视觉外观
    • 添加传感器噪声以提高数据真实性
    • 添加一个插件来控制传感器。

            第一个改进将在其它教程中解决。

  • 相关阅读:
    MethodInterceptor
    手写RPC框架之泛化调用
    代码随想录算法训练营第四十九天 | 动态规划 part 10 | 买卖股票的最佳时机i、ii
    Android JetPack~ DataBinding(数据绑定)(一) 集成与使用
    [RK3568][Android11]内核Oops日志分析
    【重磅】刚刚,《学位法》通过!!!2025年1月1日起施行!
    论Orchestration和Choreography
    工业相机基本知识理解:工业相机IO接口,功耗和供电方式
    如何运用 Kyligence 综合对比餐饮门店的销售能力?
    C# 11 预览版
  • 原文地址:https://blog.csdn.net/gongdiwudu/article/details/126304205