无人车采用纯跟踪算法跟随离线路径(ROS,C++实现)第二部分 实车验证

这个项目是采用在户外让无人车跟踪已知路径,主要是采用ROS,C++来实现。这边具体方案采用了人工开车获取离线轨迹,然后采用纯跟踪算法完成对路径的跟随,上一个文章是已经讲了整体思路,并且附上部分代码
具体了解的可以参考这个链接
无人车采用纯跟踪算法跟随离线路径(ROS,C++实现)第一部分
现在是对整体代码实车测试的效果做一个验证,验证过程中发现存在很多代码能力不足导致的错误,所以熟练掌握C++,ROS在做项目过程中很重要,我这里也是边做项目,边学习课程。

获取已知路径

因为是要获取车辆跟踪的已知路径,所以是需要人工这边去采集路径的,打开定位传感器代码,然后人为开车跑一遍,速度不要太快,频率10hz就可以了,因为我这边实际采集的是经纬度数据,我这边代码的逻辑是以起点建立地图,然后经纬度转成东北天,然后录用的数据实际上就是一个个二维点了,然后后面我跟踪这个txt文件里面的数据点就可以了,下面这个是我跑的一个轨迹图,整车后面就是跟踪这个轨迹。
在这里插入图片描述

跟踪路径

因为代码跟思路在上一篇是已经写过了,所以这边是直接说一下整体实车情况和目前的一些疑惑。
自己是做过车辆转角的变化波动图和这个误差图,实车的成功跑动,但是就不放图了,有这方面研究的可以一块讨论,现在是说几个自己没有理解的点:
1.因为自己用的定位传感器的自身坐标和自己定的这个东北天坐标系,自己理解不够深入的问题,车辆只能在初始位置的时候就车头朝北,不然获取出来的路径都是负方向的,这个就是我坐标系转换的错误,后面可能得考虑换个坐标系来确定。
2.因为整车我是跑低速的情况,所以在进行跑动的时候,可以先对获取的轨迹大致看一遍,去除掉一些在录轨迹的时候一些错误的操作,比如起步和结束的时候停的时间太长了,但是轨迹还是一直在录。
3.因为纯跟踪实际上就是一个前视距离为主要的一个参数,所以在直道的时候可以给长一些,在我这个路径下面的,我是给了1.5m,在弯道还是处在一些明显误差,但是在直道是几乎没有误差存在的,自己拿数据测了下,基本上是直道2cm左右,弯道5cm左右。

总结

整体是完成了一个基本的路径跟踪功能,后续有机会会在车上完成通过激光雷达聚类获取障碍物,然后车辆在跟踪的过程中实时避障,欢迎各位大佬一块交流交流

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
跟踪算法(pure pursuit algorithm)是一种用于自主车辆导航的算法,它是基于车辆与路径之间的距离来计算车辆下一步要采取的行动。该算法基于假设,即路径是由一系列连续的线段组成的,并且车辆在每个时间步长内只能前进一段距离。在每个时间步长内,跟踪算法会计算车辆与路径之间的最短距离,并将车辆的目标点设置为路径上与车辆最近的点。然后,算法会计算车辆应该前进的距离和方向,并将这些信息作为控制器的输出。 以下是使用Python实现跟踪算法的示例代码: ``` python import math class PurePursuit: def __init__(self, lookahead_distance): self.lookahead_distance = lookahead_distance def get_target_point(self, path, current_pos): min_distance = float("inf") target_point = None for i in range(len(path)-1): p1 = path[i] p2 = path[i+1] distance = self.distance_to_line(p1, p2, current_pos) if distance < min_distance: min_distance = distance target_point = self.get_closest_point_on_line(p1, p2, current_pos) if target_point is None: target_point = path[-1] return target_point def calculate_steering(self, current_pos, current_heading, target_point): dx = target_point[0] - current_pos dy = target_point - current_pos alpha = math.atan2(dy, dx) - current_heading return alpha def distance_to_line(self, p1, p2, p3): return abs((p2-p1)*p3 - (p2-p1)*p3 + p2*p1 - p2*p1) / math.sqrt((p2-p1)**2 + (p2-p1)**2) def get_closest_point_on_line(self, p1, p2, p3): dx = p2 - p1 dy = p2 - p1 u = ((p3-p1)*dx + (p3-p1)*dy) / (dx*dx + dy*dy) x = p1 + u*dx y = p1 + u*dy return x, y def get_control(self, path, current_pos, current_heading): target_point = self.get_target_point(path, current_pos) alpha = self.calculate_steering(current_pos, current_heading, target_point) distance = math.sqrt((target_point-current_pos[0])**2 + (target_point-current_pos)**2) speed = distance / self.lookahead_distance return speed, alpha ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值