# RTK循迹模块使用说明
## 工作原理

卫星接收接收到的WGS84坐标（即经纬度），并不能直接提供给导航和路径规划使用，需要将其转换为平面直角坐标系的坐标。因此al_rtk_ros_driver 将 WGS84坐标转换为ENU坐标后输出。 在转化过程中需要指定一个ENU坐标系的原点坐标，即ENU坐标系的x=0,y=0 对应的经纬度是多少。 为了使用上的方便，al_rtk_ros_driver 会将第一次收到RTK固定解的经纬度坐标设置为ENU坐标系原点。当然您也可以通过参数关闭此功能手动设置。



获得平面直角坐标后，并不能直接用于导航定位，主要原因在于

1.卫星接收机的定位数据频率太低（1Hz）

2.仅有位置无法获悉方向。

因此，需要将卫星的ENU坐标与里程计进行融合，输出频率更高的位姿以提供给定位导航算法。

这一过程是由Autolabor自行研发的一个简单位置融合算法实现的，源代码位于/src/navgation/location_fusion/simple_fusion.cpp 

在launch文件中相应配置为。

![](imgs/location_fusion.png)



此融合算法的原理也很简单， 将里程计输出的一系列位置点与ENU的一系列位置点进行匹配。 并发布 odom 坐标系和 map 坐标系之间的变换（我们的卫星定位是绝对的，使用map坐标系）。

在进行路线录制时，按照里程计每一定间隔记录base_link 位于 map坐标系的坐标，作为路线的“路点”。 一系列路点组成了一条路线。

循迹过程中 path_server 会将路线从文件中读出，并作为/recorded_path 话题发布。

LoopPathPlanner 作为全局路径规划器在收到/recorded_path.的数据后，将结合机器人的位置决定将路线未走到的部分作为全局路径规划发布，并为局部路径规划器指定下一个目标。

在完成整条路线后，如果设置loop 和 round都设置为true， 则LoopPathPlanner则会路点顺序反转，实现从路线结尾走回到路线开始。

默认配置中，使用teb_local_planner作为局部路径规划器,以实现遇到障碍物灵活的绕行行为。

因为teb_local_planner主要使用优化的方法进行路径规划，其行为较为灵活的同时较不为可控，可能出现预期之外的行为。这种预期之外的行为不一定适应所有使用情景。

如果需要严格循线的效果，可将teb路径规划器更换为carrot_planner 或者自行开发局部路径规划算法。





