/// <summary> /// 扩展树 /// </summary> /// <param name="iTaskIndex">无人机/任务编号</param> /// <param name="iStageIndex">阶段编号</param> /// <param name="mRRTTree">RRT树</param> /// <param name="mRRTNearNode">最近节点</param> /// <param name="mRRTNewNode">新生成节点</param> /// <returns>1,是否有效(安全); 2,如果有效(安全),是否到达目标</returns> protected bool ExpandTree(int iTaskIndex, int iStageIndex, ref List <RRTNode> mRRTTree, RRTNode mRRTNearNode, RRTNode mRRTNewNode) { //设置是否到达目标的标志 bool isReachTarget = false; // if (mRRTNewNode != null) { //设置节点编号 mRRTNewNode.NodeIndex = mRRTTree.Count; //设置父节点 mRRTNewNode.ParentNode = mRRTNearNode; //设置是否在路径上 mRRTNewNode.IsInRRTPath = 0; //增加新节点 mRRTTree.Add(mRRTNewNode); //到达目标点 if (DistanceBetweenTwoNode(mRRTNewNode, RRTNode.ConvertUAVStateToNode(AlgoInput.UAVTask[iTaskIndex].Stages[iStageIndex].TargetState)) <= RRTParameter.Error) { //设置到达标记 isReachTarget = true; //此判断防止直接选择目标点作为新节点的时候,重复增加目标点到树中 - liuwei.2011.11.28增加 if (mRRTNewNode.NodeLocation != AlgoInput.UAVTask[iTaskIndex].Stages[iStageIndex].TargetState.Location) { //------------------------将目标点作为最后一个节点加入路径中---------------------// RRTNode mRRTTempNewNode = new RRTNode(); //设置节点编号 mRRTTempNewNode.NodeIndex = mRRTTree.Count; //设置父节点 mRRTTempNewNode.ParentNode = mRRTNewNode; //设置是否在路径上 mRRTTempNewNode.IsInRRTPath = 0; //新节点位置 mRRTTempNewNode.NodeLocation = AlgoInput.UAVTask[iTaskIndex].Stages[iStageIndex].TargetState.Location; //增加新节点 mRRTTree.Add(mRRTTempNewNode); //------------------------将目标点作为最后一个节点加入路径中end------------------// } } else { isReachTarget = false; } } return(isReachTarget); }
/// <summary> /// 按照一定概率选择目标点或者随机生成一个新节点 /// </summary> /// <param name="iTaskIndex">无人机/任务编号</param> /// <param name="iStageIndex">阶段编号</param> /// <param name="mRRTTree">RRT树</param> /// <returns>节点</returns> protected RRTNode RandomConfigurationOrTargetConfiguration(int iTaskIndex, int iStageIndex, List <RRTNode> mRRTTree) { //新节点 RRTNode mRRTNode = null; //是否直接把目标点当作新点 if (m_Random.NextDouble() > m_RRTParameter.ChooseTargetThreshold) { mRRTNode = RandomConfiguration(iTaskIndex, iStageIndex, mRRTTree); } else { mRRTNode = RRTNode.ConvertUAVStateToNode(AlgoInput.UAVTask[iTaskIndex].Stages[iStageIndex].TargetState); } // return(mRRTNode); }
/// <summary> /// 判断新结点到目标连线是否安全, 若安全则直接连接目标点 /// </summary> /// <param name="iTaskIndex">无人机/任务编号</param> /// <param name="iStageIndex">阶段编号</param> /// <param name="mRRTCurrentNode">当前节点</param> /// <param name="mRRTTree">RRT</param> /// <returns>1,是否有效(安全); 2,如果有效(安全),是否到达目标</returns> protected bool DirectlyToTarget(int iTaskIndex, int iStageIndex, RRTNode mRRTCurrentNode, ref List <RRTNode> mRRTTree) { bool isReachTarget = false; //进一步判断新结点到目标连线是否安全, 若安全则直接连接目标点 if (IsSafeLine(mRRTCurrentNode.NodeLocation, AlgoInput.UAVTask[iTaskIndex].Stages[iStageIndex].TargetState.Location)) { //设置为到达 isReachTarget = true; //设置目标点为最后一个新结点, 并将当前节点设置为她的父节点 mRRTCurrentNode = RRTNode.ConvertUAVStateToNode(AlgoInput.UAVTask[iTaskIndex].Stages[iStageIndex].TargetState, mRRTCurrentNode); //设节点编号 mRRTCurrentNode.NodeIndex = mRRTTree.Count; //设置是否在路径上 mRRTCurrentNode.IsInRRTPath = 0; //增加新节点 mRRTTree.Add(mRRTCurrentNode); } return(isReachTarget); }