在gazebo里搭建一个livox mid360 + 惯导仿真平台测试 FAST-LIO2

在gazebo里搭建一个livox mid360 + 惯导仿真平台测试 FAST-LIO2

  • 前言
  • 立方体平台
  • 加入 livox mid360 激光雷达
  • 加入IMU模块
  • 调整底盘大小 并设计调用接口
  • 测试 Fast-Lio2

前言

livox mid360 在官网一直没有货,在gazebo里可以仿真该雷达形式的点云。

但是其只发布雷达的数据,没有imu数据,实际的雷达是可以发布既有雷达也有imu的数据的

运行 FAST-LIO2 也需要雷达和惯导的数据

本篇博客在gazebo中搭建了一个有livox mid360 和惯导的平台,并成功运行了FAST-LIO2

立方体平台

先做一个最简单的立方体平台,用来放livox mid360 和惯导

编写一个xacro文件,如下

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="example">


  <!-- Base Footprint -->
  <link name="base_footprint" />

  <!-- Base Link -->
  <joint name="footprint" type="fixed" >
   <parent link="base_footprint" />
    <child link="link_platform" />
    <origin xyz="0 0 0.05" rpy="0 0 0" />
  </joint>
  <link name="link_platform" >
    <visual>
      <geometry>
        <box size="0.5 0.5 0.1" />
      </geometry>
    </visual>
    <collision>
      <geometry>
        <box size="0.5 0.5 0.1" />
      </geometry>
    </collision>
    <inertial>
      <origin xyz="0 0 0"/>
      <mass value="0.01"/>
      <inertia ixx="0.001" ixy="0.0" ixz="0.0"
               iyy="0.001" iyz="0.0" 
               izz="0.001" />
    </inertial>
  </link>

</robot>

写一个launch文件来启动它,加载到gazebo和rivz中

<?xml version="1.0" ?>
<launch>
  <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"/>
  <arg name="verbose" default="false"/>

  <!-- Start gazebo and load the world -->
  <include file="$(find gazebo_ros)/launch/empty_world.launch" >
    <arg name="paused" value="$(arg paused)"/>
    <arg name="use_sim_time" value="$(arg use_sim_time)"/>
    <arg name="gui" value="$(arg gui)"/>
    <arg name="headless" value="$(arg headless)"/>
    <arg name="debug" value="$(arg debug)"/>
    <arg name="verbose" value="$(arg verbose)"/>
  </include>
![在这里插入图片描述](https://img-blog.csdnimg.cn/1a7fdea939be47c8b0a1c6d7d064e1fa.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/1a7fdea939be47c8b0a1c6d7d064e1fa.png)
  <!-- Spawn the platform -->
  <param name="robot_description" command="$(find xacro)/xacro --inorder '$(find livox_laser_simulation)/urdf/mid360_IMU_platform.xacro' " />

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

  <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher">
    <param name="publish_frequency" type="double" value="30.0" />
  </node>

  <!-- RViz -->
  <arg name="rviz" default="true"/>
  <node if="$(arg rviz)" pkg="rviz" type="rviz" name="$(anon rviz)" respawn="false" output="screen" args="-d $(find livox_laser_simulation)/rviz/mid360_IMU_platform.rviz" />

</launch>

启动

roslaunch livox_laser_simulation mid360_IMU_platform.launch

gazebo 和rviz 中会出现下面的立方体,具体的尺寸和颜色可以最后再根据雷达和惯导再调整
在这里插入图片描述

加入 livox mid360 激光雷达

下一步向平台上加入 livox mid360 激光雷达, 放在平台的中心。

向 livox_laser_simulation/urdf/mid360_IMU_platform.xacro 文件中加入下面代码

  <joint name="lidar_platform" type="fixed" >
    <parent link="link_platform" />
    <child link="livox_base" />
    <origin xyz="0 0 0.08" rpy="0 0 0" />
  </joint>

  <xacro:include filename="$(find livox_laser_simulation)/urdf/livox_mid360.xacro"/>
  <xacro:Livox_Mid360 name="livox"/>

再次启动launch文件即可,看到平台中央多了livox mid360 雷达
在这里插入图片描述
确认雷达输出点云正常,可向周围加入几个物体测试

在这里插入图片描述
点云正常

加入IMU模块

向平台中加入IMU模块,放在雷达的前方一点

向 livox_laser_simulation/urdf/mid360_IMU_platform.xacro 文件中加入下面代码

    <!--imu -->
    <link name="imu_base_link">
        <visual>
        <origin xyz="0 0 0" rpy="0 0 0" />
        <geometry >
            <box size="0.03 0.03 0.03" />
        </geometry>
        </visual>
        <collision>
        <origin xyz="0 0 0" rpy="0 0 0" />
        <geometry >
            <box size="0.03 0.03 0.03" />
        </geometry>
        </collision>   
        <inertial>
            <mass value="0.001"/>
            <inertia ixx="0.001" ixy="0.0" ixz="0.0" iyy="0.001" iyz="0.0" izz="0.001"/>
        </inertial> 
    </link>

    <gazebo reference="imu_base_link">
        <material>Gazebo/Green</material>
        <turnGravityOff>true</turnGravityOff>
    </gazebo>

    <joint name="imu_platform_joint" type="fixed">
        <parent link="link_platform"/>
        <child link="imu_base_link"/>
        <origin xyz="0.05 0 0.065" rpy="0 0 0" />
        <axis xyz="0 0 1" />
    </joint>

     <gazebo reference="imu_base_link">
        <gravity>true</gravity>
        <sensor name="imu_sensor" type="imu">
            <always_on>true</always_on>
            <update_rate>200</update_rate>
            <visualize>true</visualize>
            <topic>/livox/imu</topic>
            <plugin filename="libgazebo_ros_imu_sensor.so" name="imu_plugin">
                <topicName>/livox/imu</topicName>         
                <bodyName>imu_base_link</bodyName>
                <updateRateHZ>200.0</updateRateHZ>    
                <gaussianNoise>0.00329</gaussianNoise>   
                <xyzOffset>0 0 0</xyzOffset>     
                <rpyOffset>0 0 0</rpyOffset>
                <frameName>imu_base_link</frameName>        
            </plugin>
            <pose>0 0 0 0 0 0</pose>
        </sensor>
    </gazebo>

再次启动launch文件即可,看到平台中 的livox mid360 雷达 前多了一个绿色的小方块,它即为刚建立惯导模型
在这里插入图片描述
通过rostopic 查看 惯导数据是否正常
在这里插入图片描述
数据正常

调整底盘大小 并设计调用接口

下一步需要调整底盘平台的大小,能够放下雷达和惯导即可

将底盘尺寸改为如下

<box size="0.15 0.1 0.1" />

在这里插入图片描述
回来平台的前方挂个双目也不错

带有雷达和惯导的平台搭建完了

但是这个平台无法运动,也就完成不了建图,如果运行需要将平台挂载到小车或者无人机上。
所以需要对这个平台设计好接口,方便其它移动平台挂载。

修改 livox_laser_simulation/urdf/mid360_IMU_platform.xacro 这个文件

最后的文件如下:

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="example">


  <!-- Base Footprint -->
 <!-- <link name="base_footprint" /> -->


  <xacro:macro name="LivoxMid360_IMU_Plantform" params="name:=mid360_imu_plantform parent_link_name:=base_link x:=0.0 y:=0.0 z:=0.05 r:=0.0 p:=0.0 yaw:=0.0">
      
      <joint name="${name}_joint" type="fixed" >
        <parent link="${parent_link_name}" />
        <child link="link_platform" />
        <origin xyz="${x} ${y} ${z}" rpy="${r} ${p} ${yaw}" />
      </joint>

      <!-- link_platform -->
      <link name="link_platform" >
        <visual>
          <geometry>
            <box size="0.15 0.1 0.1" />
          </geometry>
        </visual>
        <collision>
          <geometry>
            <box size="0.15 0.1 0.1" />
          </geometry>
        </collision>
      
        <inertial>
          <origin xyz="0 0 0"/>
          <mass value="0.001"/>
          <inertia ixx="0.001" ixy="0.0" ixz="0.0"
                  iyy="0.001" iyz="0.0" 
                  izz="0.001" />
        </inertial>
    
      </link>

      <gazebo reference="link_platform">
        <turnGravityOff>false</turnGravityOff>
      </gazebo>

      <joint name="lidar_platform_joint" type="fixed" >
        <parent link="link_platform" />
        <child link="livox_base" />
        <origin xyz="0 0 0.08" rpy="0 0 0" />
      </joint>

      <!--lidar -->
      <xacro:include filename="$(find livox_laser_simulation)/urdf/livox_mid360.xacro"/>
      <xacro:Livox_Mid360 name="livox"/>

        <!--imu -->
        <link name="imu_base_link">
            <visual>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <geometry >
                <box size="0.03 0.03 0.03" />
            </geometry>
            </visual>
            <collision>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <geometry >
                <box size="0.03 0.03 0.03" />
            </geometry>
            </collision>  
            <inertial>
                <mass value="0.001"/>
                <inertia ixx="0.001" ixy="0.0" ixz="0.0" iyy="0.001" iyz="0.0" izz="0.001"/>
            </inertial>
        </link>

        <gazebo reference="imu_base_link">
            <material>Gazebo/Green</material>
            <turnGravityOff>false</turnGravityOff>
        </gazebo>

        <joint name="imu_platform_joint" type="fixed">
            <parent link="link_platform"/>
            <child link="imu_base_link"/>
            <origin xyz="0.05 0 0.065" rpy="0 0 0" />
            <axis xyz="0 0 1" />
        </joint>

        <gazebo reference="imu_base_link">
            <gravity>true</gravity>
            <sensor name="imu_sensor" type="imu">
                <always_on>true</always_on>
                <update_rate>200</update_rate>
                <visualize>true</visualize>
                <topic>/livox/imu</topic>
                <plugin filename="libgazebo_ros_imu_sensor.so" name="imu_plugin">
                    <topicName>/livox/imu</topicName>         
                    <bodyName>imu_base_link</bodyName>
                    <updateRateHZ>200.0</updateRateHZ>    
                    <gaussianNoise>0.00329</gaussianNoise>   
                    <xyzOffset>0 0 0</xyzOffset>     
                    <rpyOffset>0 0 0</rpyOffset>
                    <frameName>imu_base_link</frameName>        
                </plugin>
                <pose>0 0 0 0 0 0</pose>
            </sensor>
        </gazebo>

  </xacro:macro>

</robot>

将其挂载到飞机上,代码如下:的几款雷达进行了仿真测试。

  <xacro:include filename="$(find livox_laser_simulation)/urdf/mid360_IMU_platform.xacro"/>
  <xacro:LivoxMid360_IMU_Plantform name ="mid360_imu_plantform" parent_link_name="${namespace}/base_link" x="0"  y="0" z="0.08" r="0"  p="0" yaw="0" /> 

最终效果如下:
在这里插入图片描述

测试 Fast-Lio2

用这个平台跑Fast-Lio2 还需要有一步,就是修改雷达的仿真程序,使其发送Livox的Custcom格式的点云,这个方法会放到其它博客中

调通后,用其跑Fast-Lio2 效果如下:

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/205644.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【电源专题】DC/DC电源FB分压电阻设计注意事项

在DC/DC电源中我们不可避免的会遇到FB分压电阻的取值,PCB设计等问题。如下所示随意打开一份同步降压稳压器规格书TPS56320X,规格书中的简化电路原理图就已经存在VFB管脚上的两个分压电阻。 很多工程师朋友们会误认为分压电阻只是简单的将输出电压缩小到参考电压,通过此电压来…

电子学会C/C++编程等级考试2023年03月(三级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:和数(2023.3) 给定一个正整数序列,判断其中有多少个数,等于数列中其他两个数的和。 比如,对于数列1 2 3 4, 这个问题的答案就是2, 因为3 = 2 + 1, 4 = 1 + 3。 时间限制:10000 内存限制:65536输入 共两行,第一行是数列中…

【接口自动化】selenium库也有大用场(获取cookie)

相信有些童鞋在做接口、或者说接口自动化测试的过程中会遇到这样的场景&#xff1a;测试的接口&#xff0c;必须是需要登录后才能发起请求成功的。 那么怎么解决呢&#xff1f; 本着团队协作的精神&#xff0c;我们就去让开发同学开个后门&#xff0c;给你个“万能”值&#x…

AntDB“超融合+流式实时数仓”——颠覆50年未变的数据库内核

流式处理引擎&#xff0c;颠覆50年未变的数据库内核 流式处理的概念 2001年9月11日&#xff0c;美国世贸大楼被袭击&#xff0c;美国国防部第一次将“主动预警”纳入国防的宏观战略规划。而IBM作为当时全球最大的IT公司&#xff0c;承担了大量基础支撑软件研发的任务。其中200…

R语言单因素方差分析+差异显著字母法标注+逐行详细解释

R语言单因素方差分析 代码如下 df <- read.csv("data.csv",header TRUE,row.names 1) library(reshape2) df <- melt(df,idc()) names(df) <- c(trt, val) df aov1 <- aov(val~trt,datadf) summary(aov1)library(agricolae) data <- LSD.test(aov…

双指针算法总结

双指针算法分为两类&#xff1a;第一类指向一个序列&#xff08;更多的情况&#xff09;&#xff0c;第二类指向两个序列。 基本的代码框架是&#xff1a; for (i 0, j 0; i < n; i) {while (j < i && check(i, j)) j;// 每道题目的具体逻辑 } 核心思想&…

探索使用Quarkus和MicroProfile 构建Kubernetes原生微服务的秘诀!

Kubernetes Native Microservices with Quarkus and MicroProfile 是一个基于Kubernetes原生微服务的开发框架&#xff0c;它结合了Quarkus和MicroProfile的优点&#xff0c;提供了一个高效、可扩展、易于管理的微服务解决方案。 Quarkus是一个针对Java虚拟机&#xff08;JVM&…

代码demo-内部订单批量投料

为了简化用户操作&#xff0c;开发内部订单批量投料功能 用户可以批量上传&#xff0c;或者选择对应的物料&#xff0c;输入库位和内部订单号后进行过账操作 对用户选择的内部订单做校验&#xff0c;内部订单是否正确 内部订单的公司是否和工厂对应的公司一致等等 下面展示…

[NOIP2016 普及组] 回文日期

枚举好题&#xff0c;直接枚举答案 看看在不在范围内就行了 注意二月份 92200229是合法的~ 82200228也是合法的&#xff01; #include<bits/stdc.h> using namespace std;map<int,int>mp;int main() {mp[1] mp[3] mp[5] mp[7] mp[8] mp[10] mp[12] 31;mp[…

MMdetection3.0 问题

MMdetection3.0 问题 希望各位路过的大佬指教一下&#xff1a; 问题&#xff1a; 1、NWPU-VHR-10有标注的数据一共650张&#xff0c;我将其分为了455张训练集&#xff0c;195张验证集。 2、然后使用MMdetection3.0框架中的Faster-rcnn网络进行训练&#xff0c;设置训练参数b…

微信小程序体验版提交审核,提示接口未配置在app.json文件且无权限

在火狐浏览器 打开微信公众平台 发布小程序 弹窗一闪而过 是因为 放开这里就可以了

selenium元素定位方法之xpath

什么是xpath&#xff1f; XPath是XML的路径语言&#xff0c;通俗一点讲就是通过元素的路径来查找到这个标签元素XPath使用路径表达式在XML文档中进行导航 普通语法 注意&#xff01; 1.xpath中的值用引号引起来时&#xff0c;在代码中要注意区分&#xff0c;内单外双&#xf…

Intellij IDEA 的安装和使用以及配置

IDE有很多种&#xff0c;常见的Eclipse、MyEclipse、Intellij IDEA、JBuilder、NetBeans等。但是这些IDE中目前比较火的是Intellij IDEA&#xff08;以下简称IDEA&#xff09;&#xff0c;被众多Java程序员视为最好用的Java集成开发环境&#xff0c;今天的主题就是IDEA为开发工…

【Qt基础之QPalette实例电子时钟】

# 简介 借助`QLCDNumber`实现电子时钟,可以随意拖拽到桌面任意位置,鼠标右键进行关闭,用于实践`QPalette`类、`QTimer`的使用以及`mousePressEvent`\`mouseMoveEvent`\`mouseDoubleClickEvent`事件处理函数的使用。可在此基础上扩展其他应用,参看Qt帮助手册。 # QPalette …

homeassistant 随笔

1.使用mushroom-strategy自动生成ui&#xff0c;隐藏中文ares&#xff0c;名字为区域的拼音&#xff0c;例如显示厨房则真实名字为chu_fang 隐藏图片中的工作室 代码为&#xff1a;

ACM程序设计课内实验(2) 排序问题

基础知识‘ sort函数 C中的sort函数是库中的一个函数&#xff0c;用于对容器中的元素进行排序。它的原型如下&#xff1a; template <class RandomAccessIterator, class Compare> void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);参数…

代码随想录算法训练营第四十八天【动态规划part09】 | 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

198.打家劫舍 题目链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 求解思路&#xff1a; 当前房屋偷与不偷取决于前一个房屋是否被偷了 动规五部曲 确定dp数组及其下标含义&#xff1a;考虑下标i&#xff08;包括i&#xff09…

用户注册这样玩,保你平安

前言 基本上每个系统系统都包含用户注册、发送验证码等基本操作。在前些年&#xff0c;我还记得我在逛 csdn、贴吧、网易新闻等网站的时候是可以不登陆也能浏览完网页内容的&#xff0c;但是近几年这些网站已经改成了不登陆不让用&#xff0c;浏览网页时不时提醒你要进行登录&…

finebi 新手入门案例

finebi 新手入门案例 连锁超市销售数据分析 步骤&#xff1a; 准备公共数据新建分析主题处理数据在数据中分析在图形中分析数据大屏 准备公共数据 点击公共数据 点击新建文件夹 修改文件夹名称 上传数据 鼠标悬停在文件夹上&#xff0c;右侧出现 鼠标悬停在文件夹上&#x…

ESP32-Web-Server编程- 通过 Highcharts 创建图表(Chart)实时显示设备信息

ESP32-Web-Server编程- 通过 Highcharts 创建图表&#xff08;Chart&#xff09;实时显示设备信息 概述 上节讲述了通过 Server-Sent Events&#xff08;以下简称 SSE&#xff09; 实现在网页实时更新 ESP32 Web 服务器的传感器数据&#xff0c;并通过表格显示传感器的数据。…