Mavlink地面站编写之七—发送控制指令

转载请注明出处:http://www.amovauto.com/?cat=19/;  阿木UAV社区

好久没更新MAVLINK系列文章了,最近事情比较多,中间去了趟深圳(见了老朋友顺便去了趟华强北溜了圈)。所以中间耽误更新的文章,不过从航点写入到MAVLINK指令发送,关于mavlink协议部分的文章也要写完了。后面只要能够用mavlink协议发送指令,基本就可以用指令,控制无人机做任何你想做的事情了,我想如果后面要扩展,比如加入三维激光壁障模块,视觉导航什么的,也可以利用mavlink的协议接口来控制无人机了。可以在ARM或者DSP等高级处理器上运行高级视觉和壁障的算法,计算出三维坐标参数,然后通过mavlink协议给下面的飞控来飞行到指定位置。这样飞控算法和导航壁障算法就是独立的,两者之间就是接口。当然这只是抛砖引玉,无人机开发有很多方向可以去做。
言归正传,下面讲述怎么实现给APM2.8飞控板发送控制指令。在MAVLINK中有发送指令的函数包装,我们只要用即可,但是我们要清楚,指令的发送数据格式,我在发送格式和发送参数上走了不少弯路,下面做一个记录,避免后来者遇到同样的问题,一起学习这个强大的开源项目。
我们知道APM/PIX 支持很多的飞行模式:
0:Stabilize自稳,1:Acro特技,2:AltHold定高,3:Auto自动
4:Guided引导,5:Loiter留待,6:RTL返航,7:Circle绕圈
9:Land降落,11:Drift飘移,13:Sport运动,14:Flip翻转
15:AutoTune自动调参,16:PosHold定点,17:Brake暂停
目前一共16种飞行模式。
默认上电的APM飞控是在自稳模式的,比如我们要在地面站实现 按键 一键起飞到10米高空,这个功能。那么我们一定是用地面站给飞控发送指令,同时我们必须获取当前飞控的处于什么模式下面。前面我们分析心跳包格式我们知道:读取心跳包就可以知道目前飞控是处于什么模式

dmz

其中有个base_mode 和 custom_mode ,对于base_mode 我们可以找到定义

 
public enum MAV_MODE_FLAG
{
   CUSTOM_MODE_ENABLED = 1,
   TEST_ENABLED = 2,
   AUTO_ENABLED = 4,
   GUIDED_ENABLED = 8,
   STABILIZE_ENABLED = 16,
   HIL_ENABLED = 32,
   MANUAL_INPUT_ENABLED = 64,
   SAFETY_ARMED = 128,
   ENUM_END = 129,
}

这是一些枚举,这是基本模式。下面看custom_mode用户模式定义:
0:Stabilize自稳,1:Acro特技,2:AltHold定高,3:Auto自动
4:Guided引导,5:Loiter留待,6:RTL返航,7:Circle绕圈
9:Land降落,11:Drift飘移,13:Sport运动,14:Flip翻转
15:AutoTune自动调参,16:PosHold定点,17:Brake暂停

我们读取base_mode 和 custom_mode,和对这两个参数设置,就可以控制飞控系统目前处于什么模式。
用户模式目前有这么多种,如果我们要实习一键起飞的模式,我们首先要把飞控设置到Guided引导模式,然后发送takeoff指令。在mavlink协议中,我们要使用custom_mode模式,必须要把base_mode模式设置为 CUSTOM_MODE_ENABLED = 1,也就是用户模式设置使能。这是实验得出的真理啊啊.....

 
   Form1.comPort.setMode(new MAVLink.mavlink_set_mode_t
                {
                    //使能了用户模式选择
 base_mode = (byte)MAVLink.MAV_MODE_FLAG.CUSTOM_MODE_ENABLED,
                    //在指导模式下custom_mode = 4 标示指导模式
                    custom_mode = 4,
                    target_system = Form1.comPort.MAV.sysid
                });

这是MP源码的setMode函数我分别设置了基本模式和用户模式,我们跟踪可以知道 generatePacket((byte) (byte) MAVLink.MAVLINK_MSG_ID.SET_MODE, mode);这个函数发送了设置模式的指令,我们把设置好的mode传入了参数,通过这个函数发送给了飞控。也就是通过这个函数我们可以把飞控设置为任意飞行模式,但是要注意要符合逻辑。

 
   private void flybutton_Click(object sender, EventArgs e)
        {
            stabilizemode();
            System.Threading.Thread.Sleep(100);   
            if (Form1.comPort.doARM(true))
            {
                Form1.comPort.setMode(new MAVLink.mavlink_set_mode_t
                {
                    //使能了用户模式选择
base_mode = (byte)MAVLink.MAV_MODE_FLAG.CUSTOM_MODE_ENABLED,
                    //在指导模式下custom_mode = 4 标示指导模式
                    custom_mode = 4,
                    target_system = Form1.comPort.MAV.sysid
                });
                System.Threading.Thread.Sleep(300);
                bool ans =Form1.comPort.doCommand(MAVLink.MAV_CMD.TAKEOFF, 0, 0, 0, 0, 0, 0,(float)(double.Parse(alttextBox.Text)));
                if (ans == true) { flymode.Text = "GUIDE"; }
            }
        }

这是完整的设置一键起飞的函数,我们在指导模式下,向飞控发送了MAVLink.MAV_CMD.TAKEOFF指令,用的doCommand函数。这个函数后面有很多参数:  https://pixhawk.ethz.ch/mavlink/;这里有解释那些参数代表的意思,

qq%e6%88%aa%e5%9b%be20160616155753

在mavlink协议我们看到后面的一些参数填写规则,一共有7个参数,我们可以找到起飞指令怎么填写参数:

qq%e6%88%aa%e5%9b%be20160616160015

 

其实最主要的是起飞高度和坐标值,我在doCommand只传送了高度值,坐标值应该是当前坐标,就默认了。里面还有很多其他指令,可以详细看看。发送任何指令都要填写7个参数,具体怎么填,协议里面说的很清楚。很多朋友想用指令来控制输出通道PMM值,这也是可以的,填入正确的参数即可。

要通过MAVLink控制Pixhawk,可以按照以下步骤进行操作: 1. 确保你的Pixhawk固件已经正确安装并连接到你的计算机。你可以使用Mission Planner或QGroundControl等地面站软件进行设置和连接。 2. 在你选择的编程语言中,使用MAVLink库来建立与Pixhawk的通信。MAVLink库提供了与Pixhawk通信所需的API和协议。 3. 在你的代码中,首先建立与Pixhawk的串口连接。你需要指定正确的串口号和波特率来与Pixhawk进行通信。例如,在Python中,你可以使用pyserial库来实现串口通信。 4. 初始化MAVLink连接并与Pixhawk进行握手。这将确保你的计算机和Pixhawk之间建立了有效的通信。 5. 通过MAVLink消息发送指令Pixhawk。你可以使用MAVLink库提供的函数来创建和发送各种类型的消息,例如控制命令、航点、参数设置等。 6. 监听来自Pixhawk的状态和反馈信息。使用MAVLink库提供的函数解析接收到的消息,以获取飞行状态、传感器数据、姿态等信息。 7. 根据需求,处理接收到的信息并相应地调整控制指令。根据你的应用场景,你可能需要编写逻辑来处理不同的飞行模式、自动驾驶任务等。 请注意,这只是一个概述,具体的实现细节和代码可能因编程语言和应用场景而有所不同。你可以参考MAVLink库的文档和示例代码,以及Pixhawk的相关文档和资源,来更深入地了解如何通过MAVLink控制Pixhawk
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值