ROS学习笔记之——Navigation
目录
Publishing Sensor Streams over ROS
Costmap Configuration (local_costmap) & (global_costmap)
Navigation Stack
首先看看整个导航的包是怎么样的
tf Transform
首先不同坐标系之间的tf变换要明确,详细可以参考博客《ROS学习笔记之——ROS之tf变换》以及
Sensor Information
导航包中采用了来自sensors的信息来进行避障(avoid obstacles)。并且假设这些传感器发布的数据是sensor_msgs/LaserScan或者sensor_msgs/PointCloud
关于具体消息的定义,可以参考:
- http://docs.ros.org/en/api/sensor_msgs/html/msg/LaserScan.html
- http://docs.ros.org/en/melodic/api/sensor_msgs/html/msg/PointCloud.html
下面补充一下在ROS中发布sensor的消息流的相关知识
Publishing Sensor Streams over ROS
http://wiki.ros.org/navigation/Tutorials/RobotSetup/Sensors(有介绍怎么发布 LaserScan消息以及PointCloud消息)
机器人导航的过程中,需要各种sensors来提供定位、避障等功能。如 lasers, cameras, sonar, infrared, bump sensors(碰撞传感器)等等。然而,ros中的导航只接收数据格式为sensor_msgs/LaserScan或者sensor_msgs/PointCloud形式的消息。
sensor_msgs/LaserScan以及sensor_msgs/PointCloud消息都带有tf帧以及时间这两个独立的信息。这些信息都存储在header中。一共有三种类型的header
#Standard metadata for higher-level flow data types
#sequence ID: consecutively increasing ID
uint32 seq
#Two-integer timestamp that is expressed as:
# * stamp.secs: seconds (stamp_secs) since epoch
# * stamp.nsecs: nanoseconds since stamp_secs
# time-handling sugar is provided by the client library
time stamp
#Frame this data is associated with
# 0: no frame
# 1: global frame
string frame_id
seq field为从给定发布服务器发送消息时自动增加的标识符相对应。
stamp field存储时间信息
frame_id field存储消息所对应的tf帧
Odometry Information
导航包需要由nav_msgs/Odometry 发布的里程计的消息
http://wiki.ros.org/navigation/Tutorials/RobotSetup/Odom(相关的message的发布可以参考)
导航包会采用tf来确定机器人在世界坐标下的位置并将传感器数据与静态地图相关联。然而,tf不提供机器人的速度。因此导航包需要里程计发布变换以及nav_msgs/Odometry(http://docs.ros.org/en/melodic/api/nav_msgs/html/msg/Odometry.html) 消息来包含速度信息。
Base Controller
导航包中,通过geometry_msgs/Twist消息发布速度命令到“ cmd_vel”话题上机器人的基本坐标系(base coordinate frame)中。
Mapping
导航包并不是需要地图才可以运行。但是还是有比较好
Costmap Configuration (local_costmap) & (global_costmap)
导航包中利用两个costmap来存储世界坐标系的障碍物信息。其中一共costmap用于做全局的路径规划,意味着在整个环境中制定长期计划。而另一个则是用于做局部的路径规划以及避障。
http://wiki.ros.org/costmap_2d
costmap_2d这个包提供了2D costmap的实现,通过从世界地图中获得sensor data,建立2D或者3D的数据占用格( occupancy grid )。以及2D costmap的膨胀成本( inflates costs)(基于占用格( occupancy grid )和用户指定的膨胀半径(inflation radius))
costmap是一个package,用在move_base的global_map和local_map当中。用于将laser扫面数据或者点云数据转化成一个2d的网格地图
简单来说,地图中分成几部分
灰色部分:安全区域,robot运动在该区域不会发生碰撞
红色部分(代表有障碍物):危险区域,robot的footprint覆盖到该色网格就肯定会发生碰撞
蓝色部分(代表机器人内切半径(inscribed radius)膨胀inflated的障碍物):风险区域,robot在该区域有可能发生碰撞
红色多边形(red polygon ):robot在地图中所占的区域( footprint of the robot)
为了避免碰撞( collision),机器人的footprint应该切勿与红格相交,并且机器人的中心点切勿越过蓝格
运动规划
运动规划(Motion Planning)是一个过程,用来寻找从起始状态到目标状态的移动步骤。运动规划常常需要在运动受到约束的条件下找到最优解。
参考资料
http://moorerobots.com/blog/post/3
http://wiki.ros.org/navigation/Tutorials/RobotSetup
https://blog.csdn.net/jinking01/article/details/104193666(costmap)