玩转树莓派

    返回首页    发表留言
本文作者:李德强
          第十五节 源代码
 
 

        这是一个开源的四轴飞行器控制项目,使用树莓派3b型做四轴飞行器的控制器,通过gpio引脚读取摇控器的输入pwm信号,计算mpu-6050陀螺仪的读数,然后对欧拉角和旋转角速度做平衡修正,最后通过gpio引脚并对四轴上的4个电调输出.

##################################################################################################

免责声明:

    此四轴飞行控制程序没有任何商业性质和盈利目的,您可以免费使用此四轴飞行控制程序.
    如果在使用过程中由于您的操作不当或程序错误而出现意外事故本程序的作者和开发社区并不承担任何责任.

##################################################################################################

注意事项:

    1.四轴飞行器不是玩具,在安装和使用时请一定要注意安全,并远离人群,确保自己和他人安全的情况下飞行.

    2.在安装和调试四轴飞行器时不要为电动机安装螺旋桨,当程序调试成功并且摇控器校准成功之后,在确认您可以正常通过键盘或摇控器来操控电动机,并且确认电机转动完全正常之后才可以根据实际情况安装螺旋桨.
    
    3.在安装螺旋桨时必须先断开4个电机的电源,再为电机安装螺旋桨,并将螺旋桨的桨叶与电机转子轴锁死,以免在电机高速转动时螺旋桨发生松动,进而出现射桨,断桨等危险情况.
    
    4.在程序运行过程中,所有的键盘按键字符均为大小写字母敏感字符.在对程序做参数调整时请注意按键的大小写.例如'q'和'Q'是两个不同的字符.
    
##################################################################################################

版本说明:

    程序的源代码使用git仓库来管理,通常有两个重要的分支master主分支和develop开发分支.
    develop分支上的代码通常非常不稳定并有很多错误.
    master分支上的代码通常是比较稳定的.
    tag版本号由3部分组成"v[大版本号].[中版本号].[小版本号]".
    例如: v1.0.53
    v  : version
    1  : 大版本号,通常是在有非常大的功能变化或特性变化时会发布新的大版本.
    0  : 中版本号,通常是在修改了一些功能性问题时发布.中版本号为偶数时表示此版本已经进行过试飞测试;而中版本号为奇数时表示此版本只是理论计算,并没有进行过实际试飞测试,可能存在问题和错误.
    53 : 小版本号,通常是源代码修改提交过的次数.
    
    
##################################################################################################

使用方法:

    1.安装四轴飞行器可惜时请参见setup_X和setup_I.
        1)安装X型:mpu-6050陀螺仪正方向对准电机0和1的中间位置,顺时针方向为电机0,电机1,电机2,电机3,请参见setup_X.png安装示意图.
          修改
        2)安装I型:mpu-6050陀螺仪正方向对准电机0,顺时针方向为电机0,电机1,电机2,电机3,请参见setup_I.png安装示意图.


    2.下载源代码,并拷贝到您的树莓派上,用网线连接到莓派上,并通过pc机ssh远程到树莓派上执行这些命令.

    3.修改include/driver.h文件中摇控器接收机和电调的gpio引脚编号,编号是wiringPi的编号.

    4.执行make命令,编译源代码.如果编译成功则在源代码目录下生成一个可执行文件"release/bin/quadcopter".

    5.执行su -c 'release/bin/quadcopter --test 15 0 3000' 命令测试您的gpio和电机,参数说明如下:
        --test [wringPi引脚编号] [电机运转速度0~1000] [测试时长0~30000毫秒]
        测试时需要让电机0和电机2转动方向为顺时针;电机1和电机3转动方向为逆时针.如果您的某一个电机转动方向不正确仅需将电机的3根电源线的任意2根反接即可.
    
    6.执行su -c 'release/bin/quadcopter --ctl' 命令显示并校准您摇控器的3个通道输入pwm信号时长.
        [BF: 1600 LR: 1600 PW: 1100] --> [BF: 1600 LR: 1600 PW: 1100]
        BF:表示"前/后",也就是摇控器上控制"前/后"通道的数值,校准时"前/后"通道必须被调节到中心点.
        LR:表示"左/右",也就是摇控器上控制"左/右"通道的数值,校准时"左/右"通道必须被调节到中心点.
        PW:表示"油门",也就是摇控器上控制"油门"通道的数值,校准时"油门"通道必须被调节到最低.
        按"S"保存(Save的首字母)当前参数; 
        按"L"载入(Load的首字母)上次保存的参数.
        
    7.执行su -c 'release/bin/quadcopter --fly' 命令进行飞行模式.按键q,w,e,r,t,y,u,i,o,p可以用于切换显示不同的参数.各按键的具体含义如下:
        q : [v: ]——当前速度
        w : [xyz: ]——当前欧拉角
        e : [ctlxy]——摇控器角度
        r : [g: ]——当前角速度
        t : [pid: ]——外环欧拉角的PID参数
        y : [vpid: ]——内环角速度的PID参数
        u : [ctl zero: ]——摇控器6通道基准
        i : [PID/VPID ]——当前调参键对哪一种PID起作用
        * : 切换当前调参对象PID还是VPID
        
        0 : 速度归零
        1 : 调参幅度为0.01
        2 : 调参幅度为0.1 
        3 : 调参幅度为1
        7 : 对P参数增加0.1 (假设调参幅度为0.1)
        8 : 对I参数增加0.1 (假设调参幅度为0.1)
        9 : 对D参数增加0.1 (假设调参幅度为0.1)
        4 : 对P参数减少0.1 (假设调参幅度为0.1)
        5 : 对I参数减少0.1 (假设调参幅度为0.1)
        6 : 对D参数减少0.1 (假设调参幅度为0.1)
        + : 速度增加10,最大值为1000
        - : 速度减少10,最小值为0
        F : 电机解锁
        J : 电机锁定
        S:保存(Save的首字母)当前参数;
        L:载入(Load的首字母)上次保存的参数.
    
    8.当程序运行时,电机处于锁定状态(停止转动),不可以通过油门控制电机的转动.
        摇控器操作:
            将摇控器油门拉至最低,将方向拉至最左侧,并等待3秒以上时间,则电机解锁;
            将摇控器油门拉至最低,将方向拉至最右侧,并等待3秒以上时间,则电机锁定(停止转动).
        键盘操作:
            按下'F'键则电机解锁;
            按下'J'键则电机锁定(停止转动).
            
    9.在电机解锁时:
        摇控器的油门增加,电机加速;摇控器的油门减小,电机减速.
        按下键盘按键'+'电机加速;
        按下键盘按键'-'电机减速;
        按下键盘按键'0'电机停转;
    
    10.停止调试需要按以下顺序操作:
        1)将油门拉至最低或按下键盘'0'键,使电机停转;
        2)将摇控器油门拉至最低,将方向拉至最右侧,并等待3秒以上时间(或按下'J'键),电机锁定;
        3)关闭四轴飞行控制程序;
        4)关闭摇控器;
        5)断开电机的电源.
        6)调试结束.

##################################################################################################
 


        最后,非常感谢大家的支持!提供完整的程序代码(Linux 环境 gcc 6.1.1)

        由于程序不断更新,程序的具体使用方法请参见源代码中README文件。

项目地址:git@github.com:magicworldos/PA-Quadcopter.git
下载地址:https://codeload.github.com/magicworldos/PA-Quadcopter/zip/master
注意,由于程序在不断更新,此教程中的内容只可用于v4.2.267版本,其它版本的内容与使用方式可能会有不同。
    返回首页    返回顶部
#1楼  匿名  于 2016年11月09日16:29:32 发表
 
实际上对于欧拉角的PID控制中使用到角微分,其实就是旋转角速度,所以对PID控制中原来使用了欧拉角的PID控制和角速度的PID控制,其实是多余的,因为那是我对PID控制理解的还不太透彻。现在的源代码中只有一个PID函数用于计算欧拉角的平衡补偿,而且效果还很不错。代码简洁、逻辑清晰。
#2楼  Five  于 2016年12月02日22:06:38 发表
 
如果在虚拟机编译树莓派上的程序,是否还需要搞一套 交叉编译环境。
#3楼  李德强  于 2016年12月05日09:14:26 发表
 
感谢您的支持!如果您手上有树莓派的话建议直接使用树莓派编译和运行程序。交叉编译实际上是在某一个环境下编译另一个环境下可执行程序的过程。请确定您的虚拟机是什么环境,您的程序需要在哪里运行,如果是在虚拟机中运行就不需要交叉编译,而如果您想通过在虚拟机里编译,并将编译好的程序直接拷贝到树莓派上运行就需要交叉编译了。
#4楼  njxxcs  于 2016年12月26日19:48:31 发表
 
具体的指令能介绍下吗?
#5楼  李德强  于 2016年12月29日22:58:31 发表
 
有四种不同的模式: 飞行模式--fly 陀螺仪读数模式--gyro 摇控器校准模式--ctl 电机调试模式--test
#6楼  李德强  于 2016年12月29日23:00:09 发表
 
由于程序没有加入环境变量的处理,执行程序时需要在程序的根目录下执行可执行文件.例如: ./release/bin/quadcopter --gyro
#7楼  小老柯  于 2017年03月04日19:29:31 发表
 
你好 我如果想使用MPU6050,如何才能取得舊版程式?,謝謝你!
#8楼  小老柯  于 2017年03月04日19:47:18 发表
 
你好,想跟你請教 是否能留下跟你即時聯絡方式,例如維信之類的,想跟你請教程式問題。謝謝你!
#9楼  李德强  于 2017年03月07日07:03:56 发表
 
谢谢您的支持!

如有问题,您可以在这里给我留言,或者给我写邮件。lideqiang83@163.com
#10楼  njxxcs  于 2017年06月29日23:59:51 发表
 
是否会在日后升级程序版本,使其更加的完善。
#11楼  李德强  于 2017年07月03日10:31:21 发表
 
谢谢您的支持!

程序会做升级的,不过我业余时间有限,只好慢慢来。
#12楼  匿名  于 2017年07月09日20:23:42 发表
 
你好 ,我想用树莓派直接输出pwm,不用光耦可以吗?我现在尝试没有成功。
#13楼  匿名  于 2017年07月09日22:52:35 发表
 
PWM输出引脚是可以修改的吗?是,应该怎么修改呢,不是的话,现在的引脚是什么呢?忘告知,感谢!
#14楼  李德强  于 2017年07月10日09:55:15 发表
 
树莓派中任意一个GPIO引脚都可以产生PWM信号,但是需要我们自己编程使其产生固定频率的PWM信号,比如对一个GPIO引脚输出高电平并持续1.5ms,再对其输出低电平持续0.5ms即可,高低电平持续时间自己控制,高电平时长即是pwm有效的取值。

如果需要产生多路PWM信号只需使用多线程技术,比如需要4路PWM信号就需要创建4个线程。
#15楼  beta  于 2017年12月16日20:01:19 发表
 
你好,这个树莓派3飞控实时性怎么样?有经过飞行测试吗
#16楼  李德强  于 2017年12月17日09:11:27 发表
 
树莓派的实时性的确没有实时系统好,但我实际飞行了,效果还可以,在生成 pwm 信号时实时性差一点
#17楼  匿名  于 2017年12月17日14:03:31 发表
 
谢谢~ 我在学习你的教程,做一个二轮差速小车。那我心里有底啦
#18楼  匿名  于 2017年12月23日21:11:43 发表
 
你好,为什么在执行陀螺仪读数时会出现Segmentation fault?
#19楼  李德强  于 2017年12月24日07:43:56 发表
 
请检查陀螺仪的接线是否有问题,并确认i2c的设备号是否正确
#20楼  匿名  于 2017年12月24日15:29:29 发表
 
检查过接线没问题,设备号也正确,但是总会出现:

pi@raspberrypi:/usr/MBH_ARobotThatCanFly-master/release/bin $ ./quadcopter --gyro mpu6050

Can not load library ./lib/libmpu6050.so

Segmentation fault

现在执行其他命令也会出现Can not load library ./lib/XXXXX.so Segmentation fault,但使用其他的驱动可以读取陀螺仪的数据,中间我刷过几次系统,也换过陀螺仪,但没有效果。

希望得到您的帮助
#21楼  李德强  于 2017年12月25日15:09:31 发表
 
非常感谢您的支持!由于这一版程序在使用时并没有使用环境变量,所以在程序执行的路径方面会有很多问题。

执行程序时要在“程序的根目录”执行可执行文件,即:sudo ./release/quadcopter --gyro mpu6050否则会无法读取路径。

我现在正在抽时间编写《树莓派无人机的教程》并要对这些文章做重新的整理与优化,建议跟公众号中的文章一起学习。
#22楼  匿名  于 2017年12月25日18:06:50 发表
 
你好,请问你的公众号是多少
#23楼  李德强  于 2017年12月26日09:48:03 发表
 
公众号:编程外星人
#24楼  匿名  于 2018年01月13日17:21:02 发表
 
你好,根据你的教程我搭建了一架无人机。请问为什么在运行过程中3号电机会停转,就是一推油门其他三个电机正常转动但3号电机会慢慢减速停转,但通过test命令测试电机是没有问题的
#25楼  李德强  于 2018年01月13日23:14:36 发表
 
请不要给电机安装螺旋桨,做以下测试:

安装了陀螺仪之后,油门推起,程序会根据当前姿态进行补偿电机的值,请尝试在油门推到过半甚至推到最大时,看看电机转动情况,并转动飞机,使其在各个角度倾斜,看看电机的转动是否有变化。

如有问题可以关注公众号“编程外星人”加入我们的技术交流群。
#26楼  攸霬  于 2018年02月24日14:09:56 发表
 
谢谢!支持!
#27楼  503  于 2018年06月08日10:05:25 发表
 
你好!我给你邮箱发了一份信,请查看
  看不清?点击刷新

 

  Copyright © 2015-2018 问渠网 辽ICP备15013245号