ROS入门(九)——机器人自动导航(介绍、地图、定位和路径规划)

ROS⼊门(九)——机器⼈⾃动导航(介绍、地图定位和路
径规划)
所⽤的学习链接:
⼀、介绍
1.实现导航的关键技术
(1)全局地图
(全局概览图:定位+路径规划)
SLAM(实现地图构建和即时定位),也称为CML (Concurrent Mapping and Localization), 即时定位与地图构建,或并发建图与定位。SLAM问题可以描述为: 机器⼈在未知环境中从⼀个未知位置开始移动,在移动过程中根据位置估计和地图进⾏⾃⾝定位,同时在⾃⾝定位的基础上建造增量式地图,以绘制出外部环境的完全地图。(如红警起始⼀⽚⿊,随着摸索出现地图)
ROS中保存地图的功能包是 map_server
传感器:如果要完成 SLAM ,机器⼈必须要具备感知外界环境的能⼒,尤其是要具备获取周围环境深度信息的能⼒。感知的实现需要依赖于传感器,⽐如: 激光雷达、摄像头、RGB-D摄像头
(2)⾃⾝定位
(确定在地图中的位置)
amcl(adaptiveMonteCarloLocalization)⾃适应的蒙特卡洛定位,是⽤于2D移动机器⼈的概率定位系统。它实现了⾃适应(或KLD采样)蒙特卡洛定位⽅法,该⽅法使⽤粒⼦过滤器根据已知地图跟踪机器⼈的姿态。
导航开始和导航过程中,机器⼈都需要确定当前⾃⾝的位置,室外可⽤GPS。室内、隧道、地下或⼀些特殊的屏蔽和弱化 GPS 信号的区域,前⾯的 SLAM 就可以实现⾃⾝定位,除此之外,ROS 中还提供了⼀个⽤于定位的功能包amcl
(3)路径规划
(全局+局部路径规划)
全局路径规划(gloable_planner)大功率白光led
根据给定的⽬标点和全局地图实现总体的路径规划,使⽤ Dijkstra 或 A* 算法进⾏全局路径规划,计算最优路线,作为全局路线局部路径规划(local_planner)
在实际导航过程中,机器⼈可能⽆法按照给定的全局最优路线运⾏,⽐如:机器⼈在运⾏中,可能会随时出现⼀定的障碍物... 本地规划的作⽤就是使⽤⼀定算法(Dynamic Window Approaches) 来实现障碍物的规避,并选取当前最优路径以尽量符合全局最优路径
(4)运动控制
(控制速度和⽅向)
导航功能包集假定它可以通过话题"cmd_vel"发布geometry_msgs/Twist类型的消息,这个消息基于机器⼈的基座坐标系,它传递的是运动命令。这意味着必须有⼀个节点订阅"cmd_vel"话题, 将该话题上的速度命令转换为电机命令并发送。
(5)环境感知
(感知周围环境)
感知周围环境信息,⽐如: 摄像头、激光雷达、编码器...,摄像头、激光雷达可以⽤于感知外界环境的深度信息,编码器可以感知电机的转速信息,进⽽可以获取速度信息并⽣成⾥程计信息。
在导航功能包集中,环境感知也是⼀重要模块实现,它为其他模块提供了⽀持。其他模块诸如: SLAM、amcl、move_base 都需要依赖于环境感知。
2.坐标系
(1)⾥程计定位(odom)
⾥程计定位:时时收集机器⼈的速度信息,计算并发布机器⼈坐标系与⽗级参考系的相对关系。
优点:⾥程计定位信息是连续的,没有离散的跳跃。
缺点:⾥程计存在累计误差,不利于长距离或长期定位。
【根据⾃⼰向什么⽅向⾛了多少路判断位置】
(2)传感器定位(map)
传感器定位:通过传感器收集外界环境信息通过匹配计算并发布机器⼈坐标系与⽗级参考系的相对关系。
优点:⽐⾥程计定位更精准;
缺点:传感器定位会出现跳变的情况,且传感器定位在标志物较少的环境下,其定位精度会⼤打折扣。
【根据⾃⼰周围环境判断位置】
(3)坐标系变换
上述两种定位实现中,机器⼈坐标系⼀般使⽤机器⼈模型中的根坐标系(base_link 或 base_footprint)
⾥程计定位时,⽗级坐标系⼀般称之为 odom
传感器定位时,⽗级参考系⼀般称之为 map。
润滑油分配器当⼆者结合使⽤时,map 和 odom 都是机器⼈模型根坐标系的⽗级,这是不符合坐标变换中"单继承"的原则的,所以,⼀般会将转换关系设置为: map -> doom -> base_link 或 base_footprint。
3.硬软件需求
(1)硬件
虽然导航功能包集被设计成尽可能的通⽤,在使⽤时仍然有三个主要的硬件限制:
它是为差速驱动的轮式机器⼈设计的。它假设底盘受到理想的运动命令的控制并可实现预期的结果,命令的格式为:x速度分量,y速度分量,⾓速度(theta)分量。
它需要在底盘上安装⼀个单线激光雷达。这个激光雷达⽤于构建地图和定位。
导航功能包集是为正⽅形的机器⼈开发的,所以⽅形或圆形的机器⼈将是性能最好的。 它也可以⼯作在任意形状和⼤⼩的机器⼈上,但是较⼤的机器⼈将很难通过狭窄的空间。
g蛋
(2)软件
安装 ROS
当前导航基于仿真环境,先保证上⼀章的机器⼈系统仿真可以正常执⾏
在仿真环境下,机器⼈可以正常接收 /cmd_vel 消息,并发布⾥程计消息,传感器消息发布也正常,也即导航模块中的运动控制和环境感知实现完毕
电触点
⼆、导航实现
1.准备⼯作
(1)安装功能包
gmapping 包(⽤于构建地图)
# sudo apt install ros-<ROS版本>-gmapping
sudo apt install ros-noetic-gmapping
地图服务包(⽤于保存与读取地图)
# sudo apt install ros-<ROS版本>-map-server
sudo apt install ros-noetic-map-server
navigation 包(⽤于定位以及路径规划)
# sudo apt install ros-<ROS版本>-navigation
sudo apt install ros-noetic-navigation
(2)新建功能包
①右键 7.19_demo01/src ,新建package catkin ,命名【nav_demo】,导⼊dependences: gmapping map_server amcl
闪光棒move_base
②在nav_demo⽂件夹下新建⽂件夹launch、map、param、config
2.SLAM建图
(1)gmapping相关
SLAM算法有多种,当前我们选⽤gmapping。
bbzs
gmapping 是ROS开源社区中较为常⽤且⽐较成熟的SLAM算法之⼀,gmapping可以根据移动机器⼈⾥程计数据和激光雷达数据来绘制⼆维的栅格地图。
gmapping 功能包中的核⼼节点是:slam_gmapping。为了⽅便调⽤,需要先了解该节点订阅的话题、发布的话题、服务以及相关参数。
订阅的Topic
tf (tf/tfMessage):⽤于雷达、底盘与⾥程计之间的坐标变换消息。
scan(sensor_msgs/LaserScan):SLAM所需的雷达信息。
发布的Topic
map_metadata(nav_msgs/MapMetaData):地图元数据,包括地图的宽度、⾼度、分辨率等,该消息会固定更新。
map(nav_msgs/OccupancyGrid):地图栅格数据,⼀般会在rviz中以图形化的⽅式显⽰。
~entropy(std_msgs/Float64):机器⼈姿态分布熵估计(值越⼤,不确定性越⼤)。
服务
dynamic_map(nav_msgs/GetMap):⽤于获取地图数据。
常⽤参数
~base_frame(string, default:"base_link"):机器⼈基坐标系。
~map_frame(string, default:"map"):地图坐标系。
~odom_frame(string, default:"odom"):⾥程计坐标系。
~map_update_interval(float, default: 5.0):地图更新频率,根据指定的值设计更新间隔。
~maxUrange(float, default: 80.0):激光探测的最⼤可⽤范围(超出此阈值,被截断)。
激光探测的最⼤范围。
所需的坐标变换
雷达坐标系→基坐标系:⼀般由 robot_state_publisher 或 static_transform_publisher 发布。基坐标系→⾥程计坐标系:⼀般由⾥程计节点发布。
发布的坐标变换
地图坐标系→⾥程计坐标系:地图到⾥程计坐标系之间的变换。
(2)建图代码
在nav_demo01/launch⽂件夹下新建 t1_slam.launch
<launch>
<!-- 设置为true表⽰当前环境是仿真环境 -->
<param name="use_sim_time" value="true" />
<!-- gamping 节点 -->
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
<!-- 设置雷达话题 -->
<remap from="scan" to="scan" />
<!-- 关键参数:坐标系 -->
<param name="base_frame" value="base_footprint" /> <!--底盘坐标系-->
<param name="odom_frame" value="odom" /> <!--⾥程计坐标系-->
<param name="map_frame" value="map" /> <!--地图坐标系-->
<param name="map_update_interval" value="5.0" />
<param name="maxUrange" value="16.0" />
<param name="sigma" value="0.05" />
<param name="kernelSize" value="1" />
<param name="lstep" value="0.05" />
<param name="astep" value="0.05" />
<param name="iterations" value="5" />
<param name="lsigma" value="0.075" />
<param name="ogain" value="3.0" />
<param name="lskip" value="0" />
<param name="srr" value="0.1" />
<param name="srt" value="0.2" />
<param name="str" value="0.1" />
<param name="stt" value="0.2" />
<param name="linearUpdate" value="1.0" />
<param name="angularUpdate" value="0.5" />
<param name="temporalUpdate" value="3.0" />
<param name="resampleThreshold" value="0.5" />
<param name="particles" value="30" />
<param name="xmin" value="-50.0" />
<param name="ymin" value="-50.0" />
<param name="xmax" value="50.0" />
<param name="ymax" value="50.0" />
<param name="delta" value="0.05" />
<param name="llsamplerange" value="0.01" />
<param name="llsamplestep" value="0.01" />
<param name="lasamplerange" value="0.005" />
<param name="lasamplestep" value="0.005" />
</node>
<node pkg="joint_state_publisher" name="joint_state_publisher" type="joint_state_publisher" />
<node pkg="robot_state_publisher" name="robot_state_publisher" type="robot_state_publisher" />
<!-- <node pkg="rviz" type="rviz" name="rviz" /> -->
<!-- 使⽤之前保存过的 rviz 配置-->
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf_gazebo)/config/t7_car.rviz" />
</launch>
(3)启动
①运⾏相关启动命令

本文发布于:2024-09-21 22:10:56,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/304191.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:地图   机器   定位   程计   坐标系   环境   实现
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议