RRT路径规划算法详细C#

RRT是通过随机节点进行路径规划的(寻找的路径不是最优路径)

 

我们先设置 障碍物(黑色),起点(绿色点),终点(红色点)

图一

因为是通过节点进行寻找路径,先设置下节点的属性

父节点pre,节点位置data,两个构造函数

class Node
    {
        public Node pre;
        public Point data;
        public Node() { }
        public Node(Node pre, Point data)
        {
            this.pre = pre;
            this.data = data;
        }
    }

 在图中通过随机数产生一个节点P(randomX,randomY),我们假设随机节点为P(图中的蓝色点)

图二

然后寻找距离节点P点最近的节点nearest,图中P的nerest就是起点绿点

寻找最近点判断的代码:

double shortLength = Math.Sqrt((nearest.data.X - randomNode.X) * (nearest.data.X - randomNode.X) + (nearest.data.Y - randomNode.Y) * (nearest.data.Y - randomNode.Y));
            double tempLenght;
            for (int i = 1; i < allNode.Count; i++)
            {
                tempLenght = Math.Sqrt((allNode[i].data.X - randomNode.X) * (allNode[i].data.X - randomNode.X) + (allNode[i].data.Y - randomNode.Y) * (allNode[i].data.Y - randomNode.Y));
                if (shortLength > tempLenght)
                {
                    nearest = allNode[i];
                    shortLength = tempLenght;
                }
            }

从nearest点向随机点P方向进行直线延伸,延伸距离lenght设为30,距离nearest长度为30处的点为newNode,接下来把nearest和newNode进行连接(具体length的大小,依照最小障碍物的大小与地图的大小决定,lenght太小了,可能导致寻路时间过长)

在进行P和newNode相互连接前,要判断两点之间是否有障碍物。怎么进行相连时障碍物的判断?我这里是每相隔距离5进行判断下,30的长度,所以一共判断6下。如果两点间有障碍物,放弃相连,否则则进行连接。如图四是放大的黄线,对线进行6点的均匀取样

如何知道是不是障碍物呢?我这里有个比较简单的思路。因为我的障碍物是黑色,除障碍物外其他物体不是黑色,所以没次进行取点判断时,如果发现改点为黑色,就判定为障碍物,放弃连接

 

图四

 判断障碍物代码:

 public Boolean opConnet(Point front, Point back)//以一个阀值的长度连接radomNode和nearest
        {
            int dtx = back.X - front.X, dty = back.Y - front.Y;
            double opLength;
            opLength = Math.Sqrt(dtx * dtx + dty * dty);
            int check = (int)(opLength / 5);
            for (int i = 1; i <= check; i++)
            {
                Color color = map.GetPixel((front.X + (dtx * i) / check), (front.Y + (dty * i) / check));
                int colorNum = color.R + color.G + color.B;
                if (colorNum<15/*map.GetPixel((front.X + (dtx * i) / check), (front.Y + (dty * i) / check)).Name == "ff000000"*/)
                {
                    return false;
                }
            }
            return true;
        }

如果可以连接,这把newNode保存到一个list中

然后判断终点是否在newNode附近,如果终点在newNode附近(附近在这里的定义也是距离小于30,具体的情况要有自己的情况而定),则把newNode和终点连接,否则继续生成随机点,重复上述步骤,直到终点在新的newNode附近。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值