松灵机器人scout mini小车 自主导航(4)——运行lio-sam建图

news/2024/10/18 15:17:40/文章来源:https://www.cnblogs.com/binbin2002/p/18326867

松灵机器人Scout mini小车运行lio-sam

在之前的工作中,我们已经实现了用小车搭载传感器,采用gmapping建图和navigation导航实现小车在2D环境中自主导航,但是实际我们采用的激光雷达多为三维激光雷达。因此决定采用lio-sam来建图。具体操作步骤如下。

1.下载雷达仿真

1.1下载激光雷达包

首先将VLP16线的激光雷达仿真包放入之前的工作空间中

git clone https://bitbucket.org/DataspeedInc/velodyne_simulator/src/master/

下载之后查看文件夹结构如下:

img

下载好VLP激光雷达仿真包之后重新catkin_make一次,生成激光雷达点云产生库链接。编译之后在/devel/lib文件夹下生成两个动态链接库

img

1.2添加雷达支架描述文件

为了操作方便,我们给激光雷达一个支架,使得激光雷达能够立在支架上面。在对应机器人的urdf文件夹下新建一个laser_support.xacro文件,写入以下内容:

雷达支架描述文件
<?xml version="1.0"?>
<robot name="laser_support" xmlns:xacro="http://wiki.ros.org/xacro"><!-- 雷达支架 --><xacro:property name="support_length" value="0.30" /> <!-- 支架长度 --><xacro:property name="support_radius" value="0.025" /> <!-- 支架半径 --><xacro:property name="support_x_size" value="-0.2" /> <!-- 支架安装的x坐标 --><xacro:property name="support_y_size" value="0.0" /> <!-- 支架安装的y坐标 --><xacro:property name="support_z_size" value="${base_z_size}" /> <!-- 支架安装的z坐标:底盘高度 / 2 + 支架高度 / 2  --><xacro:property name="support_m" value="0.02" /> <!-- 支架质量 --><link name="support"><visual><geometry><cylinder radius="${support_radius}" length="${support_length}" /></geometry><origin xyz="0 0 0" rpy="0.0 0.0 0.0" /><material name="red"><color rgba="0.8 0.2 0.0 0.8" /></material></visual><collision><geometry><cylinder radius="${support_radius}" length="${support_length}" /></geometry><origin xyz="0 0 0" rpy="0.0 0.0 0.0" /></collision><xacro:cylinder_inertial_matrix m="${support_m}" r="${support_radius}" h="${support_length}" /></link><joint name="support2base_link" type="fixed"><parent link="base_link" /><child link="support" /><origin xyz="${support_x_size} ${support_y_size} ${support_z_size}" /></joint><gazebo reference="support"><material>Gazebo/White</material></gazebo>
</robot>

1.3在机器人的urdf描述文件中添加激光雷达的描述(urdf/empty.urdf)

首先包含激光雷达的支架描述
img

然后添加雷达的两个属性描述变量
img

最后,包含激光雷达的描述文件,这里会用到上面两个属性变量
img

1.4 启动仿真

编写launch文件,启动rviz和gazebo查看机器人

<launch><arg name="model" /><arg name="gui"  default="False" /><!-- Loading model files --><arg name = "model_xacro" default = "$(find scout_description)/urdf/mini.xacro" /><param name="robot_description" command="$(find xacro)/xacro $(arg model_xacro)" /><!-- <param  name="robot_description"  textfile="$(find scout_description)/urdf/scout_mini.urdf" /> --><param  name="use_gui"  value="$(arg gui)" /><!-- Launch  the joint state publisher --><node  name="joint_state_publisher"  pkg="joint_state_publisher"  type="joint_state_publisher" /><!-- Launch  the robot state publisher --><node  name="robot_state_publisher"  pkg="robot_state_publisher"  type="robot_state_publisher" /><node name="rviz"  pkg="rviz"  type="rviz"  args="-d $(find scout_description)/rviz/scout_mini_model_display.rviz" /> <arg name="world_name" default="$(find scout_gazebo_sim)/worlds/clearpath_playpen.world"/><include file="$(find gazebo_ros)/launch/empty_world.launch"><arg name="world_name" value="$(arg world_name)"/><arg name="paused" value="false"/><arg name="use_sim_time" value="true"/><arg name="gui" value="true"/><arg name="headless" value="false"/><arg name="debug" value="false"/></include><node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model scout -param robot_description"  />  </launch>

运行launch文件后可以看到机器人携带小车如下
img

此时可以打开我们的话题,看看是否有点云输出
img

可以看到我们的点云是正常输出的。注意,我们我们为了在gazebo里面看到我们的机器人,所以没有在gazebo里面吧激光点云可视化出来,如果想要可视化可以通过修改 VLP-16.urdf.xacro 文件中这个地方
img

2.添加imu模块

我们需要跑的框架是LIO-SAM,需要用到IMU模块,因此我们还需要添加imu进入仿真中,同样的我们在机器人对应的urdf文件夹下新建一个imu.xacro文件,写入以下内容:

<?xml version="1.0"?>
<robot xmlns:xacro="http://wiki.ros.org/xacro">  <xacro:macro name="imu" params="sensor_name parent_link *origin"><xacro:property name="imu_offset_x" value="0" /><xacro:property name="imu_offset_y" value="0" /><xacro:property name="imu_offset_z" value="0.2" /><xacro:property name="imu_size"     value="0.05" /><xacro:property name="imu_m" value="0.01" /> <!-- imu质量 --><!-- imu --><joint name="imutobase" type="fixed"><!-- <origin xyz="${imu_offset_x} ${imu_offset_y} ${imu_offset_z}" rpy="0 0 0" /> --><xacro:insert_block name="origin" /><parent link="${parent_link}"/><child link="imu_base"/></joint><link name="imu_base"><visual><origin rpy="0 0 0" xyz="0 0 0" /><geometry><box size="${imu_size} ${imu_size} ${imu_size}"/></geometry>                <material name= "black" ><color rgba="1.0 0.0 0.0 0.6" /></material></visual><collision><geometry><box size="${imu_size} ${imu_size} ${imu_size}" /></geometry><origin xyz="0.0 0.0 0" rpy="0.0 0.0 0.0" /></collision><xacro:Box_inertial_matrix m = "${imu_m}" l = "${imu_size}" w = "${imu_size}" h = "${imu_size}"/></link><!-- 被引用的link --><gazebo reference="imu_base"><material>Gazebo/Bule</material><gravity>true</gravity><sensor name="imu_sensor" type="imu"><always_on>true</always_on><update_rate>100</update_rate><visualize>true</visualize><topic>__default_topic__</topic><plugin filename="libgazebo_ros_imu_sensor.so" name="imu_plugin"><topicName>imu/data</topicName><bodyName>imu_base</bodyName><updateRateHZ>100.0</updateRateHZ><gaussianNoise>0.01</gaussianNoise><xyzOffset>0 0 0</xyzOffset>     <rpyOffset>0 0 0</rpyOffset><frameName>imu_base</frameName>        </plugin><pose>0 0 0 0 0 0</pose></sensor></gazebo></xacro:macro>
</robot>

然后在urdf/empty.urdf文件中包含这个模块
img

3.lio-sam仿真

安装依赖

$ sudo apt-get install -y ros-noetic-navigation
$ sudo apt-get install -y ros-noetic-robot-localization
$ sudo apt-get install -y ros-noetic-robot-state-publisher

安装GTSAM

$ git clone https://github.com/borglab/gtsam
$ cd gtsam
$ mkdir build && cd build
# 注意这里要加-DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF这个选项,不然后面运行会报错
$ cmake -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF ..
$ sudo make install -j8
$ sudo ln -s /usr/local/lib/libmetis-gtsam.so /usr/lib/libmetis-gtsam.so  //修改链接库

编译LIO-SAM

$ cd ~/robot_ws/src
$ git clone https://github.com/TixiaoShan/LIO-SAM  //不要用官网的lio-sam 用博主内的lio-sam
$ cd ..
$ catkin_make

4.运行结果

首先启动仿真环境

roslaunch scout_gazebo_sim  scout_mini_playpen.launch

img

运行lio-sam

roslaunch lio_sam run.launch 

img

键盘控制机器人移动

rosrun  teleop_twist_keyboard teleop_twist_keyboard.py 

img

5.遇到的一些问题

gazebo中机器人静止,rviz中反复横跳

原因:lio-sam会对点云进行下采样滤波,滤波体素设置太大了,匹配过程出现误差,导致机器人优化出来的位姿反复横跳。
解决: 因为我们这里是在室内建图,所以在lio-sam的配置文件中把体素大小设置小一些
img

运行时报错 error while loading shared libraries: libmetis-gtsam.so: cannot open shared object file: No such file or directory

解决: sudo ln -s /usr/local/lib/libmetis-gtsam.so /usr/lib/libmetis-gtsam.so

**雷达和imu的xacro文件中 xacro:cylinder_inertial_matrix 和 xacro:Box_inertial_matrix报错

添加对应的惯性矩阵文件

惯性矩阵文件
<robot name="base" xmlns:xacro="http://wiki.ros.org/xacro"><!-- Macro for inertia matrix --><xacro:macro name="sphere_inertial_matrix" params="m r"><inertial><mass value="${m}" /><inertia ixx="${2*m*r*r/5}" ixy="0" ixz="0"iyy="${2*m*r*r/5}" iyz="0" izz="${2*m*r*r/5}" /></inertial></xacro:macro><xacro:macro name="cylinder_inertial_matrix" params="m r h"><inertial><mass value="${m}" /><inertia ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0"iyy="${m*(3*r*r+h*h)/12}" iyz = "0"izz="${m*r*r/2}" /> </inertial></xacro:macro><xacro:macro name="Box_inertial_matrix" params="m l w h"><inertial><mass value="${m}" /><inertia ixx="${m*(h*h + l*l)/12}" ixy = "0" ixz = "0"iyy="${m*(w*w + l*l)/12}" iyz= "0"izz="${m*(w*w + h*h)/12}" /></inertial></xacro:macro>
</robot>

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[题解]P2672 [NOIP2015 普及组] 推销员

P2672 [NOIP2015 普及组] 推销员 为了便于操作,将住户信息按疲劳值从大到小排序。 那么对于选\(X\)个住户,有\(2\)种情况:选疲劳值前\(X\)大的住户,答案即为\(\sum\limits_{i=1}^X a[i] + 2\times \max\limits_{i=1}^X s[i]\)。 选疲劳值前\(X-1\)大的住户,然后在剩下的住…

LockSupport

LockSupprot 用来阻塞和唤醒线程,底层实现依赖于 Unsafe 类(后面会细讲)。 该类包含一组用于阻塞和唤醒线程的静态方法,这些方法主要是围绕 park 和 unpark 展开。 public class Main {public static void main(String[] args) {Thread mainThread = Thread.currentThread(…

计算机组成与体系结构-浮点数表示

定点数: 是一种在计算机中表示和处理实数的方法,其中,小数点的位置是固定的,不会随着数值的大小而变化。浮点数: 是计算机中用于表示实数的一种数据类型。小数点 位置浮动浮点数表示阶码(指数部分): 决定了浮点数可以表示的范围。阶码越长,可以表示的指数范围就越大 尾数(有…

渗透

渗透测试 一、简介 ​ 渗透测试(Penetration Testing)是一种通过模拟攻击的技术与方法,挫败目标系统的安全控制措施并获得控制访问权的安全测试方法。 ​ 网络渗透测试主要依据CVE(Common Vulnerabilities and Exposures,通用漏洞与披露)已经发现的安全漏洞,模拟入侵者的攻击…

学习Java的第四周

第四周的学习记录来喽,本周的重点就是之前提到过的判断和循环(其中包括流程控制语句的三种结构:顺序、分支、循环;顺序结构即Java程序的默认流程,分支结构学了if判断语句的三种格式、switch语句练习和扩展知识,循环结构学了for循环格式和练习、累加思想和统计思想、while…

idea在pom中引入第三方依赖

项目右侧点击maven,点击加号(鼠标放上去会出现add maven project字样) 找到要导入的项目的pom文件选中,ok(这里我以及导入过了,所以ok是灰色) 回到原项目中,在pom中添加dependency 其中,artifactId是导入进来的姓名的名字,groupId是导入进来的项目的java目录下的包名…

计算机组成与体系结构-cache

概念 Cache,高速缓冲存储器。是解决CPU与主存之间速度不匹配而采用的一项重要技术,位于主存与CPU之间,由静态存储芯片(SRAM)组成,容量比较小,Cache存储了频繁访问的内存数据命中率 CPU欲访问的信息已在Cache中的比率,设在一段程序执行期间cache完成存取次数为NC,主存完成…

《Programming from the Ground Up》阅读笔记:p88-p94

《Programming from the Ground Up》学习第5天,p88-p94总结,总计7页。 一、技术总结 1.touppercase.s #PURPOSE: This program converts an input file #to an output file with all letters #converted to uppercase.#PROCESSING: #(1)Open the input file #(2)Open the o…

计算机网络第三讲 数据链路层

计算机网络第三讲 数据链路层 第一节:数据链路层功能 1. 概述2. 数据链路层的功能封装成帧透明传输差错控制实现无比特差错 不是可靠传输 丢失,乱序,重复无法解决

计算机组成与体系结构-层次化存储体系

将数据分为多个层次进行存储,以最优的控制调度算法和合理的成本,构成具有性能可接受的存储系统. 解决两个矛盾采用层次化存储体系,可以通过平衡存储介质的速度和成本得到最佳的存储效用。解决了主存容量不足与高成本的矛盾、CPU与主存速度不匹配的矛盾存储器分类RAM,随机存…

计算机网络第一讲

计算机网络第一讲 计算机网络概述考点一 1. 计算机网络的定义2. 计算机网络的组成物理组成工作方式英特网中的服务 考研中只有 TCP是可靠服务,其他都是不可靠的 面向连接的服务只有1.TCP 2.PPP 其他所有均无连接有应答服务:1.TCP 2.CSMA/CA3. 计算机网络的特点 共享4. 计算机…