![cover](https://img-blog.csdnimg.cn/032e742afe6e4facb8fa0085f9965c08.jpeg)
PX4/PIXHAWK无人机代码控制流程
网上查了很多资料,想要使用代码控制无人机,大致有三种方式基于python的DroneKit接口,基于mavros的程序控制,以及直接基于mavlink的程序开发;但总而言之,都是基于mavlink通信协议;
一般来说,无人机的飞行控制方式主要有三种,分别为遥控器,地面站以及自定义软件;其中地面站跟自定义软件广义来说可归为一类,地面站本就是被用来控制飞行器,已经被开发好的软件;但是说到地面站,通常指的是QGC(QGroundControl)和MP(MissionPlane);两者区别主要在于MP仅支持APM固件且仅支持Windows平台,QGC兼容APM/PX4固件,并且跨平台(Windows,Linux,Android,IOS);这里主要介绍如何用自己写的代码来控制无人机,首先有几个概念需要了解一下;
飞行模式(PX4):
px4固件支持10几种飞行模式,不同机型支持不同的飞行模式,以下主要基于多旋翼无人机;多旋翼主要可以分为手动模式以及自动模式;
1.手动模式
(一)位置模式:位置是一种易于飞行的RC模式,其中滚动和俯仰杆控制车辆左右和前后方向上的地面加速度(类似于汽车的油门),油门控制升降速度。
(二)高度模式:高度模式是一种相对容易飞行的RC模式,其中滚动和俯仰杆控制车辆在左右和前后方向(相对于车辆的“前部”)上的运动,偏航杆控制水平面上的旋转速度,油门控制升降速度。
(三)自稳模式:当RC控制杆居中时,手动/稳定模式可稳定多旋翼。要手动使机体移动,您可以移动摇杆使其偏离居中位置。
(四)特技模式:特技模式是用于执行特技动作的RC模式,例如翻转、翻滚。横滚、俯仰和偏航杆控制围绕各自轴的角速率,油门直接传递至控制分配。当操纵杆居中时,飞机将停止旋转,但保持其当前姿态并根据当前动量移动。
2.自动模式
(一)保持:等待飞行模式(也称为“悬停”)使无人机停止并保持其当前的GPS位置和高度(MC无人机将在GPS位置悬停,而FW无人机将在其周围盘旋)。
(二)返航:返航飞行模式用于将车辆在无障碍的路径上安全飞行至安全目的地,在那里可以等待(悬停或盘旋)或降落。
(三)任务:任务模式使车辆执行已上传至飞行控制器的预定义自主任务(飞行计划)。任务通常由地面控制站(GCS)应用程序(如QGroundControl)创建并上传;
(四)起飞:起飞飞行模式使无人机起飞到指定高度并等待进一步指令;
(五)降落:使无人机降落在开启此模式时的位置。降落后,无人机将会在一小段时间后上锁(默认情况下)。
(六)跟随:跟随模式允许多旋翼机自主保持相对于另一个系统的位置和高度,该系统使用Follow_TARGET广播其位置(可选速度)MAVLink消息。
(七)Offboard:飞机遵守 MAVLink 提供的位置,速度或姿态设定值。 设定值可以由机载计算机上运行的 MAVLink API(例如 MAVSDK(opens new window) 或 MAVROS
(opens new window))提供(通常通过串口或 wifi 连接)。
Mavlink协议:
无论是选择何种飞控,想要做二次开发,mavlink协议是永远避不开也是最重要的无人机通信协议,上面所说的地面站也是基于mavlink通信协议,所以说彻底搞清楚了mavlink协议,后面开发也会事半功倍;篇幅问题,这里就不过多介绍;
Offboard模式:
上面飞行模式中介绍过,是飞行模式中的一种;要想越过地面站,直接用自己写的几十行代码来控制无人机,Offboard模式也是必须要了解的模式;
Offboard官网介绍:
Offboard模式通过设置位置、速度、加速度、姿态、姿态角速率或力/扭矩设置点来控制飞行器的移动和姿态。
PX4必须能够以2HZ的速率连续收到MAVLink设置点消息或ROS2 OffboardControlMode 消息以确保外部控制器是正常运行的。该消息必须已经持续发送1秒钟以上PX4才能在Offboard模式下解锁或在飞行中切换至Offboard模式。如果在外部控制器给出的指令速率低于2Hz,PX4将在超时(COM_OF_LOSS_T)后退出Offboard模式,并尝试降落或执行其他一些失败保护行为。失效保护行为取决于RC遥控器是否可用,依据参数 COM_OBL_RC_ACT 的设定。
当使用MAVLink时,设定值消息既传达了指示外部控制器"正常运行"的信号也传达了设定值本身。Offboard模式下要保持位置,飞行器必须接收到一个包含当前位置设定值的消息指令。
两个要点:
1)需要以不低于2HZ的频率向PX4中写入设置点消息;
2)通过设置位置、速度、加速度、姿态、姿态角速率或力/扭矩设置点来控制飞行器的移动和姿态。
可以通过官网给出的例程来简单理解一下:
c_uart_interface_example-master源码剖析:
c_uart_interface_example是mavlink团队提供的一个演示如何用c语言调用mavlink API对飞机做offboard控制的例子程序,源码地址如下:https://github.com/mavlink/c_uart_interface_example。
下载打开文件可以看到文件结构如下:
官网程序是基于linux构建的,在readme中介绍了文件的调用过程;
给出的例程是让无人机起飞至两米高度,然后设置x方向速度,再旋转180°,最后以1m/s的速度降落,程序结束;
程序的使用:
c_uart_interface_example的可执行程序是mavlink_control,它的使用方式如下:
mavlink_control [-d <devicename> -b <baudrate>] [-u <udp_ip> -p <udp_port>] [-a]
常用的运行mavlink_control的两种形式:
1. 在本机运行mavlink_control, 仿真环境也在本机
mavlink_control -u 127.0.0.1 -a
其中:-u选项是指定PX4在127.0.0.1(本机地址)机器上运行;udp的port没有指定,缺省是14540;-a的意思是autotakeoff(自动起飞)。
2. 在offboard计算机中运行mavlink_control,将offboard计算机与安装有PX4固件的自驾仪Pixhawk做串口连接(注意,如果Pixhawk是在真实飞机上,需要卸下浆叶)
mavlink_control -d /dev/ttyUSB0 -b 57600 -a
其中:-d选项是指定串口名字,连接采用的是USB转串口电缆,所以用的设备名为ttyUSB0;-b选项是指定这个串口的通讯波特率,这个波特率需要与地面站(比如:QGroundControl)为PX4的串口(通常为TELE2)设置的波特率一致,需要核实一下,否则连不通; -a的意思是autotakeoff(自动起飞)。
源代码结构:
主程序:mavlink_control(.h/.cpp);
无人机PX4控制接口:Autopilot_interface(.h/.cpp);
通讯接口:generic_port(.h/.cpp)(接口基类),serial_port(.h/.cpp)(串口派生类),udp_port(.h/.cpp)(UDP派生类);
Mavlink通讯协议:再mavlink文件夹中,需要在官网下载c_library_v2源码复制在mavlink/include/mavlink/v2文件夹下(注意不是把整个文件夹放进去);
程序分析:
进入主程序,首先定位主函数,创建连接之后,打开连接(port->start()),调用PX4控制接口(autopilot_interface.start()),在autopilot_interface的start函数中,主要是开启了两个线程,即读线程跟写线程;
首先读线程启动,通过通讯接口接收飞控板传回的mavlink协议,然后再根据对应的msgid解码出需要的信息,保存到全局变量current_messages中。但是需要注意的是读线程跟写线程并不是同时启动的,并且写线程是需要条件触发的。
写线程的目的是为了向飞控板发送设定点(setPoint)信息,以打开offboard模式,所以需要写入的信息是local_position_ned和attitude这两条信息,只有在飞控板传回的数据中读取到这两条信息,才会开启写线程,并且开启写线程之后会持续以4HZ的频率继续发送设定点信息,至此进入off board模式的必要条件已经有了。
在这一步可能会遇到一个问题,local_position_ned信息在室外可以由GPS提供,在室内因为信号差,GPS是不能提供这个信息的,所以此时在室内是无法开启写线程的;解决办法是在无人机安装光流传感器或者去到室外;
读写线程均开启之后,就是打开offboard模式了,这一步在autopilot_interface中的toggle_offboard_control函数中,首先定义一个mavlink_command_long_t结构体com,并且设置相应参数,然后通过通信接口发送到飞控板中,写入成功就打开了offboard模式,然后解锁(arm_disarm),接下来跑完三个例程,退出offboard,关闭线程,关闭接口,程序结束;
示例中是通过set_position(),set_velocity(),void set_yaw(),来分别控制位置,速度和姿态,在offboard模式下基本能够完成基础的飞行动作;
总结:
网上查了很多资料,想要使用代码控制无人机,大致有三种方式基于python的DroneKit接口,基于mavros的程序控制,以及直接基于mavlink的程序开发;但总而言之,都是基于mavlink通信协议;
参考博客:
![Logo](https://devpress.csdnimg.cn/79de2bf0b7994defa4242ef90d5513fa.jpg)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)