C# - 创建四轴飞行器的任务列表

时间:2017-01-30 17:09:22

标签: c# list

我有一个多线文本框,我可以在那里为无人机编写密码。

示例:

  

10 levantar

     

10 goto 50,40

     

10转到20,20

     

10 mayday

     

10 aterrar

我想创建一个列表,逐步完成这个错误。比如:起飞,起飞后转到那个位置,当到达那个位置时转到下一个等等。

我的问题是: 有没有办法在列表中对此文本进行分组,当它完成该任务时,我只需删除列表的第一个位置并执行下一个操作?

private void executa_missao()
    {
        string[] linhas_separadas = null;
        string[] pontos_separados = null;

        for (int i = 0; i < tb_missoes.Lines.Length; i++)
        {              
            linhas_separadas = tb_missoes.Lines[i].Split(null);


            for(int k=0;k<drone.Length;k++)
            {
                listas_posicoes[k] = new List<PointF>();        
                if (linhas_separadas[0] == drone[k].ip_drone_final)
                {
                    if (linhas_separadas[1] == "goto")
                    {                  
                        pontos_separados = linhas_separadas[2].Split(',');
                        drone[k].posicao_desejada = new PointF(Convert.ToSingle(pontos_separados[0]), Convert.ToSingle(pontos_separados[1]));
                        //guarda na lista as posicoes pretendidas
                        listas_posicoes[k].Add(new PointF(Convert.ToSingle(pontos_separados[0]), Convert.ToSingle(pontos_separados[1])));
                    }
                    else if (linhas_separadas[1] == "levantar")
                    {
                        drone[k]._droneClient.FlatTrim();
                        drone[k]._droneClient.Takeoff();
                        drone[k].subir_ate_altura = true;

                    }
                    else if (linhas_separadas[1] == "aterrar")
                    {
                        drone[k]._droneClient.Land();
                    }
           }
        }

Atm正试图同时做好每一步。我想逐步完成。

1 个答案:

答案 0 :(得分:0)

使用Queue<T>代替List<T>

然后,您可以使用.Dequeue()函数获取当前命令,并将其从队列中删除。

为此行为创建示例工作代码会变得非常复杂并且需要一段时间,但基本模式看起来如此:

public abstract class Command
{
    public abstract bool IsComplete { get; }
    public abstract void Execute();
}
public static class CommandExecutor
{
    public static Queue<Command> commands;
    public static Command current;

    public static void Update()
    {
        if (commands.Count > 0
            && (current == null || current.IsComplete))
        {
            current = commands.Dequeue();
            current.Execute();
        }
    }
}

在重复间隔中调用Update()方法的位置。