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截图20160616155753

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

QQ截图20160616160015

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


  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
你好!以下是一个使用Mavlink控制无人机的地面站的示例代码: ```python import time from pymavlink import mavutil # 连接到无人机 master = mavutil.mavlink_connection('/dev/ttyUSB0', baud=57600) # 设置指令为GUIDED模式 mode = 'GUIDED' custom_mode = '4' # 对应的MAV_MODE_GUIDED的值 master.mav.set_mode_send( master.target_system, mavutil.mavlink.MAV_MODE_FLAG_CUSTOM_MODE_ENABLED, int(custom_mode)) # 等待模式切换成功 while True: current_mode = master.mode_mapping()[mode] if master.mode == current_mode: break time.sleep(1) # 发送起飞指令 master.mav.command_long_send( master.target_system, master.target_component, mavutil.mavlink.MAV_CMD_NAV_TAKEOFF, 0, 0, 0, 0, 0, 0, 0, 0) # 等待起飞完成 while True: msg = master.recv_match(type='GLOBAL_POSITION_INT', blocking=True) if msg.get_type() == 'GLOBAL_POSITION_INT': if msg.relative_alt > 10: # 这里假设10米为起飞高度 break time.sleep(1) # 发送导航指令 target_altitude = 20 # 目标高度为20米 master.mav.command_long_send( master.target_system, master.target_component, mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 0, 0, 0, 0, 0, 0, 0, target_altitude) # 等待导航完成 while True: msg = master.recv_match(type='GLOBAL_POSITION_INT', blocking=True) if msg.get_type() == 'GLOBAL_POSITION_INT': if msg.relative_alt > target_altitude - 1: # 允许误差为1米 break time.sleep(1) # 发送返航指令 master.mav.command_long_send( master.target_system, master.target_component, mavutil.mavlink.MAV_CMD_NAV_RETURN_TO_LAUNCH, 0, 0, 0, 0, 0, 0, 0, 0) # 断开连接 master.close() ``` 这个示例代码使用了`pymavlink`库来与无人机通信。你需要将`/dev/ttyUSB0`替换成你的无人机串口地址,并根据你的需求修改起飞高度和目标高度等参数。请确保你已经安装了`pymavlink`库。 希望这个示例能帮到你!如果你有任何问题,请随时提问。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值