自治智能体转向力之路径跟随算法

Craig Reynolds的路径跟随算法:
假设一小车在某处运动,则若小车以恒定速度继续运动,则可以预测过一段时间,小车所处的位置,可以通过这个位置计算小车与道路之间的距离,若距离足够近,则说明小车正在沿路径运动,如果距离太远,则表明小车离路径太远,则需要转向。

单段路径跟随:

1.计算小车未来位置

    // 首先创建速度向量的副本
    PVector predict = velocity.get(); 
    
    // 单位化向量,并将向量向前延申25像素
    predict.normalize(); 
    predict.mult(25);
    
    // 将向量加上当前位置,计算未来的位置
    PVector predictpos = PVector.add(position,predict);
  1. 计算法线交点
  // 点p在线段ab上的法线交点位置计算
  PVector getNormalPoint(PVector p, PVector a, PVector b) {
    // 向量ap
    PVector ap = PVector.sub(p, a);
    // 向量ab
    PVector ab = PVector.sub(b, a);
    // 向量ab归一化
    ab.normalize(); 
    // Project vector "diff" onto line by using the dot product
    ab.mult(ap.dot(ab));
    PVector normalPoint = PVector.add(a, ab);
    return normalPoint;
  }
  1. 计算点p到线段ab的距离
    /*  ---- 3. 计算小车与法线交点的距离 ----  */
    float distance = PVector.dist(predictpos, normalPoint);  
 
  1. 若p到线段ab的距离大于某值,则转向
  /*  ---- 4. 当预测距离 > 能接受的最大距离,则作用转向力 ----  */
    if(distance > path.radius)
    { 
       // 计算道路的方向
      PVector dir = PVector.sub(b, a);
      dir.normalize();
      dir.mult(10);  // This could be based on velocity instead of just an arbitrary 10 pixels
      PVector target = PVector.add(normalPoint, dir);
 
      seek(target);
    }  

多路径跟随

为了寻找目标位置,我们必须找到线段上的法线交点。
交点的选择要满足两个条件:

  1. 这个交点必须在路径内
    若不再路径内,则选择终点作为法线交点,并将路径设置为下一路径
  2. 这个点为距小车最近的法线交点
    在这里插入图片描述
// 路径跟随算法
  PVector follow(Path path)
  {
    /*  ---- 1. 预计小车的未来位置 ----  */
    // 首先创建速度向量的副本
    PVector predict = velocity.get(); 
    
    //
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值