松灵机器人scout mini小车 自主导航(3)——建图导航仿真

news/2024/11/16 13:37:26/文章来源:https://www.cnblogs.com/binbin2002/p/18296477

松灵机器人Scout mini小车建图导航仿真

在之前的文章中,我们已经介绍了如何在gazebo和rviz对scout mini小车进行仿真,并且测试了添加自定义的传感器,在本文章中将进一步介绍如何利用scout mini小车 在仿真环境中建图和导航。
仓库链接: https://gitee.com/agent-explorer/robotics/tree/master/scout_mini_navigation

1.仿真环境准备

直接复制仓库链接:https://gitee.com/agent-explorer/robotics/tree/master/scout_mini_navigation 。
进入到scout_mini_navigation中,配置好ROS环境后直接运行setup.bash脚本,自动安装相关环境。

sudo bash setup.bash
catkin_make
source devel.setup.bash

这里需要注意:在setup.bash过程中可能出现gazebo有关包错误,可以自行官网下载

2. 仿真建图

2.1 运行gmapping

在确保安装好gazebo模型之后(后续地图会用到gazebo模型,需要提前下载),直接使用gmapping建图。

roslaunch scout_gazebo_sim scout_mini_gmapping.launch

打开以下窗口则证明gmapping正常工作。

img
img

2.2 环境探索建图

之后打开一个新的终端,运行键盘控制节点,控制小车探索环境:

rosrun tele_twist_keyboard teleop_twist_keyboard.py

控制车辆在地图中行走,直到将整幅地图构建完毕

img

2.3 地图保存

运行下面命令保存构建好的地图

cd src/scout_gazebo_sim/maps/
rosrun map_server map_saver -f testmap

即可在工作空间看到保存的地图:

img

这里需要注意testmap.yamlimage属性是相对路径,如果是绝对路径则会出现问题

2.4 自主导航

启动导航launch

roslaunch scout_gazebo_sim scout_mini_navigation.launch

看到如下界面代表成功启动:
img
img

点击2D Nav Goal 选择目标点,小车可以完成自主导航。

img

3.传感器配置

在之前的文章中介绍了如何自定义添加相机传感器,本章将进一步介绍如何添加激光雷达imu两个传感器,相关配置均在 scout_description/urdf/empty.urdf中。

3.1 添加激光雷达

Gazebo提供了ray标签用于自定义激光雷达,ray包含了scanrange两个属性。scan描述激光雷达水平和垂直方向上的采样线数,range定义每束激光的属性。

Code
<ray><scan><horizontal><!--- 水平方向上生成 720 条采样线 ---><samples>720</samples><!--- 返回的范围数据点的个数 = 分辨率 * 样本数 ---><resolution>1</resolution><!--- 最大和最小角度,弧度制。决定激光雷达扇形的范围 ---><min_angle>-2.09439504</min_angle><max_angle>2.09439504</max_angle></horizontal></scan><range><!--- 每个采样线的 最小距离 和 最大距离 以及 分辨率  ---><min>0.05</min><max>8.0</max><resolution>0.01</resolution></range><noise><!--- 添加高斯噪声 ---><type>gaussian</type><mean>0.0</mean><stddev>0.01</stddev></noise>
</ray>

ray 标签支持的所有属性可以在 http://sdformat.org/spec?ver=1.6&elem=sensor#sensor_ray 找到

之后我们还需要添加 Gazebo 雷达插件广播我们雷达的信息:

Code
<plugin name="sensor_ray_controller" filename="libgazebo_ros_laser.so"><topicName>/scan</topicName>  <!--- 雷达信息广播话题名 ---><frameName>sensor_ray</frameName>  <!--- 和雷达 link 名称一致 --->
</plugin>

可用插件可以在 https://classic.gazebosim.org/tutorials
tut=ros_gzplugins#Tutorial:UsingGazebopluginswithROS 找到

3.2添加IMU

方法和激光雷达类似,标签属性 http://sdformat.org/spec?ver=1.6&elem=sensor#sensor_imu 。
插件信息 https://classic.gazebosim.org/tutorials?tut=ros_gzplugins#IMUsensor(GazeboRosImuSensor) 。

3.3 Odom发布

在仿真中,我们使用libgazebo_ros_p3d.so插件广播odom。这个插件用于在仿真中获取任意 link 的位姿真值,并通过 odom 格式的消息进行广播。

其具体配置笔者加加在了src/scout_description/urdf/scout_mini.gazebo 中的第 30~39 行:

Code
<plugin name="p3d_base_controller" filename="libgazebo_ros_p3d.so"><alwaysOn>true</alwaysOn><updateRate>50.0</updateRate><bodyName>base_link</bodyName> <!--- 广播 base_link 的位姿真值---><topicName>odom</topicName> <!--- topic 名称,这里作为 odom 进行广播 ---><gaussianNoise>0.01</gaussianNoise><frameName>world</frameName> <!--- 参考坐标系,根据 odom 定义,这里选择世界原点 ---><xyzOffsets>0 0 0</xyzOffsets><rpyOffsets>0 0 0</rpyOffsets>
</plugin>

4. ROS相关配置

在小车自主建图过程中,最重要的几个ROS包以及功能对应如下:

├── move_base :导航包,根据参照的消息进行路径规划;
├── gmapping :根据激光数据建立地图;
├── amcl : 用于在已知地图中定位;
└── mapserver :用于保存地图为YAML格式
此外还有:
|——robot_pose_ekf :是 ROS 中实现多传感器融合输出机器人位姿的程序包。

4.1 robot_pose_ekf

robot_pose_ekf 是 ROS 中实现多传感器融合输出机器人位姿的程序包。其基本原理是利用扩展卡尔曼滤波,利用多种传感器实现机器人位姿的最优估计。官方百科:http://wiki.ros.org/robot_pose_ekf
在本例中其配置如下:

Code
<node pkg="robot_pose_ekf" name="robot_pose_ekf" type="robot_pose_ekf"><param name="output_frame" value="odom" /> <!--- 发布 tf 名为 odom ---><param name="base_footprint_frame" value="base_link"/> <!--- 建立 output_frame->base_link 的 tf 变换---><param name="freq" value="50.0"/><param name="sensor_timeout" value="1.0"/><param name="odom_used" value="true"/> <!--- 使用原始 odom 信息---><param name="odom_data" value="odom"/><param name="vo_used" value="false"/> <!--- 不使用视觉里程计 --->
</node>

4.2 gmapping

在建图环节,我们使用的是gmapping,它可以只用 激光雷达里程计 信息进行建图,其启动文件位于 src/scout_gazebo_sim/launch/scout_mini_gmapping.launch 对于本例中使用 2D 激光雷达小型场景 中建图,gmapping 可以达到相当不错的效果。官方文档:http://wiki.ros.org/gmapping

gmapping 本身需要订阅 tfscan 两个话题以获取 tf 变换数据 和 激光雷达数据。

其次,gmapping 需要 激光雷达坐标 到 base_link 的 tf 变换(本例中由 robot_state_publisher 包自动发布):
img

以及 odom 和 base_link 之间的变换(由 robot_pose_ekf 发布融合数据):
img

在正确配置 tf 树以及 topic 后即可让我们的车辆开始运动,gmapping 会实时更新地图数据。

4.3 map_server

官方文档地址:http://wiki.ros.org/map_server

用于提供map_servermap_saver 功能。其中 map_saver 是一个命令行工具,用于保存地图数据为 YAML 格式的文件:

YAML
image: map1.pgm # 地图对应图片的路径名;可以是绝对路径,也可以相对于 YAML 文件位置的相对路径. 用不同的像素颜色描述世界中每个cell的占用状态。白色像素表示free,黑色像素表示occupied, 其它颜色像素表示unknown
resolution: 0.050000 # 分辨率 米/像素
origin: [-50.000000, -50.000000, 0.000000] # 地图左下像素的2-D姿势(x,y,yaw),yaw 为逆时针旋转角度(YAW = 0表示无旋转)。系统的许多部分目前忽略了 yaw
negate: 0 # 是否翻转黑白像素代表的含义
occupied_thresh: 0.65 # 占用概率大于此阈值的像素被认为是完全占用的
free_thresh: 0.196 # 用概率小于此阈值的像素被认为是自由的

当作为 map_server 使用时创建一个 map_server 节点,利用从磁盘读取的地图数据提供 ROS 服务。map_server 的当前实现将 MAP 图像数据中的颜色值转换为三元占用值:Free(0),占用(100)和未知(-1)。

一个简单的 launch 例子如下:

<node pkg="map_server" type="map_server" name="map_server" args="$(find scout_gazebo_sim)/maps/$(arg map_name).yaml" output="screen"><param name="frame_id" value="map"/>
</node>

4.4 amcl

amcl 是一个用于 2D 移动机器人的定位系统,其实现了自适应(或 KLD 采样)蒙特卡洛定位方法,该方法使用粒子群算法来跟踪机器人在已知地图上的位姿,仅使用已知地图和激光雷达信息即可运行。官方文档:http://wiki.ros.org/amcl

其配置信息位于 src/scout_gazebo_sim/param/amcl_params_diff.yaml 一般情况下保持默认即可。

4.5 move_base

官方文档地址:http://wiki.ros.org/move_bas

move_base 就是我们导航系统的核心组件了,给定一个地图上的目标,它会尝试计算全局路径和局部路径用于导航。使用两个规划器(全局和局部)的意义在于,全局路径可以很理想,但是在移动过程中难免会存在遇到障碍物等问题,这时候就需要局部规划指导机器人移动。其接口信息如图所示(来源:http://wiki.ros.org/move_base)

img

其配置信息如下:

Code
<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen"><rosparam file="$(find scout_gazebo_sim)/param/costmap_common_params.yaml" command="load" ns="global_costmap" /><rosparam file="$(find scout_gazebo_sim)/param/costmap_common_params.yaml" command="load" ns="local_costmap" /><rosparam file="$(find scout_gazebo_sim)/param/local_costmap_params.yaml" command="load" /><rosparam file="$(find scout_gazebo_sim)/param/global_costmap_params.yaml" command="load" /><rosparam file="$(find scout_gazebo_sim)/param/planner.yaml" command="load" /><param name="base_global_planner" value="global_planner/GlobalPlanner" /><param name="planner_frequency" value="1.0" /><param name="planner_patience" value="5.0" /><param name="base_local_planner" value="base_local_planner/TrajectoryPlannerROS" /><param name="controller_frequency" value="5.0" /><param name="controller_patience" value="15.0" /><param name="clearing_rotation_allowed" value="true" />
</node>

相关的参数内容较多,除 tf 广播信息 和 节点名称 外大部分参数保持默认信息即可,如有需要可对照官方文档进行修改

5.结语

对于scout_mini 仿真导航的相关介绍到这里就结束了,作为初学者或者使用者,大部分时候我们并不关心软件包或者插件背后的算法实现。笔者同样建议在深入学习其背后原理之前先对其效果有直观感受,在会用的基础上进行深入,如此才能更快理解算法为什么要这样设计以及如何编写属于自己的程序。

参考链接:https://anthonysun256.github.io/scout_mini_navi/

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

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

相关文章

ComfyUI进阶篇:ControlNet核心节点

前言: ControlNet_aux库包含大量的图片预处理节点,功能丰富,适用于图像分割、边缘检测、姿势检测、深度图处理等多种预处理方式。掌握这些节点的使用是利用ControlNet的关键,本篇文章将帮助您理解和学会使用这些节点。 目录 一、安装方法 二、模型下载 三、Segmentor节点 四…

面对百度的无期徒刑,幸好还有微软的必应

昨天我们通过【i博客园】公众号发布文章 被百度降权的经历:没有百度的日子,是百度给的无期徒刑 时发现,百度不但没有回心转意,反而对园子的处罚更加严厉了,博客主站(www域名)的新发内容一天内0收录。而在去年9月21日我们完全解除对百度蜘蛛的屏蔽后(详见博文),9月25日…

2024-07-11 npm publish报错合集

报错1:This package has been marked as private npm ERR! 你的包被设为私有模式了。npm ERR! code EPRIVATE npm ERR! This package has been marked as private npm ERR! Remove the private field from the package.json to publish it.原因:你发布的包被标记为私有了,如…

midjourney 入门操作

midjourney 入门操作 settings面板选择模型当从 V6 切换到 Niji模型时,Current suffix会添加参数default V6面板功能介绍RAW Mode功能--style raw 使用的是另一种模式,对于已经熟练掌握提示功能并希望对图像进行更多控制的用户来说,这种模式可能会很有效。使用--style raw 制…

FFT

这东西对初中生挺友好的。前置知识复数 形如 \(a+bi(a,b\in \mathbb{R})\) 的数叫复数,其中 \(i^2=-1\)。 复数乘法:\((a+bi)(c+di)=ac-bd+(ad+bc)i\)。乘法分配律即可。复平面 以 \(a\) 为 \(x\) 轴,\(b\) 为 \(y\)轴所组成的平面叫复平面。每个复数都对应复平面上一点。单…

R语言将多景遥感影像拼接在一起的方法

本文介绍基于R语言中的raster包,遍历文件夹,读取文件夹下的大量栅格遥感影像,并逐一对每一景栅格图像加以拼接、融合,使得全部栅格遥感影像拼接为完整的一景图像的方法~本文介绍基于R语言中的raster包,遍历文件夹,读取文件夹下的大量栅格遥感影像,并逐一对每一景栅格图像…

使用pyqt5制作简单计分桌面应用

这是一个自己写的使用pyqt5制作简单计分桌面应用的实例,包含完整代码,希望对大家有所帮助。制作这个小程序的起因是因为有个艺术类比赛需要设计这个一个桌面程序,方便统分。这是一个自己写的使用pyqt5制作简单计分桌面应用的实例,希望对大家有所帮助。制作这个小程序的起因…

Linux-Cgroup V2 初体验

本文主要记录 Linux Cgroup V2 版本基本使用操作,包括 cpu、memory 子系统演示。1. 开启 Cgroup V2 版本检查 通过下面这条命令来查看当前系统使用的 Cgroups V1 还是 V2 stat -fc %T /sys/fs/cgroup/如果输出是cgroup2fs 那就是 V2,就像这样 root@tezn:~# stat -fc %T /sys/…

Linux系统基础学习

系统目录结构 登录系统之后输入ls命令查看系统目录系统常用的目录/bin 存放着最常用的命令,包括用户和系统管理员都会使用的命令。 /boot 存放启动linux的核心文件,包括内核文件、引导文件、镜像文件 /dev 存放着 Linux 系统中所有的设备文件,如硬盘、CD-ROM等 /home 用户的…

《穷查理思维模型实战课程——一个月一场》

好久好久没更新了。穷查理思维模型实战课程——一个月一场 查理芒格的去世,让了当今没有孔子在世。但是他的智慧会让我们继续前行。

.Net Windows Forms(窗体程序)在服务端运行不了的问题

.Net Windows Forms(窗体程序)在服务端运行不了的问题(本机可以) 原因:是在Form1的构造函数中多了这几行,在服务端找不到配制文件。//DomSqlMapBuilder builder = new DomSqlMapBuilder();//ISqlMapper mapper = builder.Configure(@"..\..\App_Data\SqlMap.config…

基于业财一体化和数据集成的费用协同管理系统-虎珀

某药企,作为高新技术企业、也是中国医药工业百强。其业务集药物研发、生产、销售、商业批发和国际营销为一体,为进一步提升集团内部费用管理的精细化与标准化水平,该企业决定引入先进的信息化费用核算系统,将其作为集团费用管理体系中的重要组成部分。 此系统要能够适应不同…