.. _tutorial_uav_leader_follower_zh:

无人机Leader follower集群编队实现
=======================================

.. figure:: ../img/swarmuav_leaderfollower/swarm_sitl_3uav_leader_follower.png
   :height: 450 px
   :width: 750 px
   :scale: 100 %
   :align: center

Leader-Follower 模型是多智能体系统中普遍接受的研究范式,其中一个智能体被指定为 Leader (领队者),而其他智能体则充当 Follower (跟随者)并与其邻域保持相对距离以实现编队。
在本教程中,我们将向读者展示一个执行无人机 Leader-Follower 集群编队实现的示例。

1.任务说明
--------------

根据 Leader-Follower 模型,可以通过控制 Leader 飞到指定位置来实现无人机群飞行任务。Leader 可以接受自主服务呼叫的命令或仅来自手动控制的命令。
该演示是在状态机的基础上构建的,S_FORMATION_LEADER_FOLLOWER 子任务枚举表示无人机集群处于 leader-follower 机动状态。

2.如何运行
------------

.. hint::

        DASA 代码库正在快速开发迭代中,因此建议用户参考我们产品随附的最新用户手册。

2.1 SITL 虚拟仿真
^^^^^^^^^^^^^^^^^^^^

SITL仿真可以在基于虚拟环境的Gazebo引擎中进行(参考 :ref:`tutorial_swarm_sim`)。
在目录 ~/DASA_space/catkinws_swarmdemo/scripts 中提供了3 台无人机集群虚拟仿真的启动脚本。

首先必须使用 Gazebo 引擎启动 SITL 节点:

::

        cd  ~/DASA_space/catkinws_swarmdemo/scripts/sitl
        bash start_sitl_nodes_3uavs.sh


用户只有在Gazebo界面出现后才能启动其他swarm节点:

::

        cd  ~/DASA_space/catkinws_swarmdemo/scripts/sitl
        bash start_leaderfollower_mission_swarm_nodes_3uavs.sh


然后无人机群将自动启动任务。 用户可以使用 RequestLeaderVehicleCmd 服务向 Leader 发送请求。 以下命令将请求 Leader (uav1) 移动到位置 [5.0, 5.0, 5.0]。

::

        cd ~/DASA_space/catkinws_swarmdemo/
        source devel/setup.bash
        rosservice call /uav1/swarm_mission/request_leader_cmd "leader_behavior_id: 1
        params:[5.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]"


2.2 飞行测试
^^^^^^^^^^^^^^^^

首先在飞行测试之前完成定位设置(参考 :ref:`tutorial_indoor_loco`:)。用户远程登录这些飞行器后,可以使用以下脚本启动 3 架无人机的 leader-follower 任务节点:

::

        cd  ~/DASA_space/catkinws_swarmdemo/scripts/test
        bash start_indoor_leaderfollower_mission_3uavs.sh


然后可以通过将这些机器设置为offboard和解锁状态来启动任务。


3.视频演示
-------------

以下视频包含 SITL 虚拟仿真 和飞行测试的演示:

.. raw:: html

    <iframe src="https://player.bilibili.com/player.html?aid=996369183&bvid=BV1Bs4y1z7U4&cid=1133661511&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true" width="95%" height="450">
    </iframe>