5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)

标题: 多旋翼通用避障开源项目 [打印本页]

作者: 743836814    时间: 2015-6-15 21:14
标题: 多旋翼通用避障开源项目
本帖最后由 743836814 于 2015-6-21 03:15 编辑

多旋翼避障首先要确定避障系统的基本思路。

现如今市场充斥着各种飞控,原本想在开源飞控项目上进行二次开发,但感觉能力有限,又违背了通用的原则所以决定在接收机与飞控中间做一个中间层。
添加一个中间层后,所有飞控都能通用,从QQ飞控,到PX4,APM,都可以通吃。

这样就达到的通用的目的。
为什么可以达到通用的目的呢?
参考:(外部链接予以删除版主留)的帖子,航模中输出信号大多数为PWM信号,其1000为最低点,1500为中立点,2000为最高点。
开发过程中选用arduino进行开发,其语法简单,各种库丰富,是进行开发的不二之选。
  1. #include<Servo.h>;
  2. #define AIL1   22     //AIL fuyi
  3. #define ELE2   24     //ELE shengjiang
  4. #define THR3   26     //THR youmen
  5. #define RUD4   28     //RUD fangxiang
  6. unsigned long INAIL;
  7. unsigned long INELE;
  8. unsigned long INTHR;
  9. unsigned long INRUD;
  10. int OUTAIL;
  11. int OUTELE;
  12. int OUTTHR;
  13. int OUTRUD;
  14. Servo AIL;
  15. Servo ELE;
  16. Servo THR;
  17. Servo RUD;
  18. void setup()
  19. {   
  20. pinMode(AIL1,0);
  21. pinMode(ELE2,0);
  22. pinMode(THR3,0);
  23. pinMode(RUD4,0);
  24. AIL.attach(4);
  25. ELE.attach(5);
  26. THR.attach(6);
  27. RUD.attach(7);
  28. Serial.begin(9600);
  29. }
  30. void loop()
  31. {
  32. INAIL = pulseIn(AIL1, 1);
  33. INELE = pulseIn(ELE2, 1);
  34. INTHR = pulseIn(THR3, 1);
  35. INRUD = pulseIn(RUD4, 1);
  36. OUTAIL = map(INAIL,1010,2007,47,144);
  37. OUTELE = map(INELE,1010,2007,47,144);
  38. OUTTHR = map(INTHR,1010,2007,47,144);
  39. OUTRUD = map(INRUD,1010,2007,47,144);
  40. AIL.write(OUTAIL);
  41. ELE.write(OUTELE);
  42. THR.write(OUTTHR);
  43. RUD.write(OUTRUD);
  44. Serial.print("AIL=");
  45. Serial.print(INAIL);
  46. Serial.print(" ELE=");
  47. Serial.print(INELE);
  48. Serial.print(" THR=");
  49. Serial.print(INTHR);
  50. Serial.print(" RUD=");
  51. Serial.print(INRUD);
  52. delay(5);
  53. }
复制代码
这段代码主要用来读取接收机的PWM值,pluseIn()函数可以读取指定端口的电平脉冲时间。其还调用了arduino 的舵机库的舵机函数来控制,有人看出了,OUTTHR = map(INTHR,1010,2007,47,144); 这是个缩放函数,让1010-2007缩放为47-144,这里有人会问,为什么是1010-2007,为什么是47-144,我再来和同学们讲解,刚刚在取样的时候我们发现arduino读取的PWM宽度在1000-2000之间,但是有些值是大于2000的,那么我取了一个更大的区间,来“装”PWM的区间,所以是1000-2007,但是为什么要让舵机输出47-144度呢。这里要用点小技巧,羊毛出在羊身上,没错我们让arduino自己给自己测脉冲时间,我们可以写一个很简单的代码,还记得刚刚那个pluseIn()函数吗,我们让任意一个端口输出一个90度的舵机角度值,也就是xxxx.write(90); 然后把这个端口接在arduino其他任意一个数字端口上,用pluseIn()去测这个90度的脉宽是多少,比如90度测出来脉冲时间是1500,大了,我们要找的是1000-2000范围的那个舵机角度,我们再来一个30度,或者170度,就这样把范围越缩越小,最后,我找出了他们之间的关系,47度的舵机输出,用pluseIn()去测量刚好在1000左右,那么地、低位就找到了,同样高位在144度上 脉冲宽度时间是2000左右,那么接下来代码大家都看懂了吧?,这里的arduino就原封不动的把接收机的信号吃进去了,又吐出来给飞控,至此,arduino已经完全潜入飞机控制系统。
(如有疑问,请查阅连接帖子)
到目前为止,中间层已经初步的建立,开始选用相关避障所需要的传感器。
出于实用和成本方面的原因,通过本人的实际购买测试,最终选用了HC-SR04超声波,价格低廉,且测量范围与精度值复合要求。

1.使用电压:DC5V
2.静态电流:小于2mA
3:电平输出:高5V
4:电平输出:低0V
5:感应角度:不大于15度
6:探测距离:2cm-450cm
7:高精度:可达3mm
接线方式,VCC、trig(控制端)、 echo(接收端)、 GND地线

本产品使用方法:一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出.一有
输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,
方可算出距离.如此不断的周期测,就可以达到你移动测量的值了~~

模块工作原理:
(1)采用IO触发测距,给至少10us的高电平信号;
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO输出一高电平,高电平持续的时间就是
超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2

超声波测距程序:
  1. const int TrigPin = 6;
  2. const int EchoPin = 7;
  3. float cm;
  4. void setup()
  5. {
  6. Serial.begin(9600);
  7. pinMode(TrigPin, OUTPUT);
  8. pinMode(EchoPin, INPUT);
  9. }
  10. void loop()
  11. {
  12. //发一个10ms的高脉冲去触发TrigPin
  13. digitalWrite(TrigPin, LOW);
  14. delayMicroseconds(2);
  15. digitalWrite(TrigPin, HIGH);
  16. delayMicroseconds(10);
  17. digitalWrite(TrigPin, LOW);

  18. cm = pulseIn(EchoPin, HIGH) / 58.0; //算成厘米
  19. cm = (int(cm * 100.0)) / 100.0; //保留两位小数
  20. Serial.print(cm);
  21. Serial.print("cm");
  22. Serial.println();
  23. delay(1000);
  24. }
复制代码

传感器选定好后便可以进行相关的程序开发了。

(草图)

避障思路。

下面是我自己写的程序,刚学,不要见笑。。。(6.14晚上21点,未测试)
(此版本程序有缺陷,待我修改。。)


Hi_Bob兄帮我建立的,在这里表示感谢。

一般我写的会发布到群里,本人写的实在不堪入目,哈哈。(扣群:四五six丝丝124二)
版规真是奇怪。




作者: Mrsail    时间: 2015-6-15 21:56
留个标记,最近也在研究这个,但是也有问题,超声波距离短,如果飞行速度过快,反应速度会不够

作者: q748169667    时间: 2015-6-15 22:08


作者: SageST    时间: 2015-6-16 00:24
做毕业设计的时候用过arduino和超声波模块    有时候超声波模块返回的距离会有异常   

不知道是我代码问题 还是模块问题   

理论上  是完全可行的     但是真正能用上的话   一定要保证不会出bug

作者: 不爱吃鱼    时间: 2015-6-16 00:34
希望早日实现,Dji那个价格实在不能接受

作者: 743836814    时间: 2015-6-16 18:08
Mrsail 发表于 2015-6-15 13:56
留个标记,最近也在研究这个,但是也有问题,超声波距离短,如果飞行速度过快,反应速度会不够

控制飞行速度即可


作者: 743836814    时间: 2015-6-18 15:43
SageST 发表于 2015-6-15 16:24
做毕业设计的时候用过arduino和超声波模块    有时候超声波模块返回的距离会有异常   

不知道是我代码问 ...

超声波可以加上滤波的


作者: 阿琨    时间: 2015-6-18 16:08
这个必须顶!希望楼主及时公布进度!!!!

作者: lvtong    时间: 2015-6-18 16:34
估计还需要PID控制

作者: luo674526417    时间: 2015-6-19 13:46
您好,我想请问一下,如果接收机是通过sbus总线连接的,arduino该如果连接呢!


作者: 743836814    时间: 2015-6-20 18:43
阿琨 发表于 2015-6-18 08:08
这个必须顶!希望楼主及时公布进度!!!!

一般会在群里交流


作者: 743836814    时间: 2015-6-20 18:44
lvtong 发表于 2015-6-18 08:34
估计还需要PID控制

嗯,会需要的


作者: Mrsail    时间: 2015-6-21 00:07
743836814 发表于 2015-6-20 18:43
一般会在群里交流

私信下群号 麻烦了

作者: HJHZJY    时间: 2015-6-21 00:30
表示支持!!关注中。。。

作者: nuaakimi    时间: 2015-6-21 03:50
方案是可行的,但是超声波传感器在这个方案里不合适。
1)。340m/s的声速,10m就要5ms,再算上那种10来块钱的超声波输出信号最少5ms。这就10ms了还是理想状态,如果多几个超声波传感器,采样率20hz撑死了,再一滤波,最后输出能有5hz吗?
2)。超声波最大的问题在于在较小的空间里来回反射,会引起互扰;某些不是很大的障碍基本不反射声波,导致漏判断(迷宫机器人不用超声波就是这个道理)。

综上,普通超声波不适合四旋翼,只有每个超声波发射的声波频率不同,传输信号以串行接口的形式的超声波传感器才可能用在四旋翼上。
建议,还是换个激光扫描仪吧。。。

作者: 宇浩轩杰    时间: 2015-6-21 09:33
很棒,赞\(≧▽≦)/

作者: Mrsail    时间: 2015-6-21 09:40
推荐楼主参考下大疆的方案,超声波和视觉识别共同作用

作者: 743836814    时间: 2015-6-21 11:07
nuaakimi 发表于 2015-6-20 19:50
方案是可行的,但是超声波传感器在这个方案里不合适。
1)。340m/s的声速,10m就要5ms,再算上那种10来块 ...

激光扫描仪最低价格两千起,普通模友恐怕难以接受


作者: 743836814    时间: 2015-6-21 11:08
Mrsail 发表于 2015-6-21 01:40
推荐楼主参考下大疆的方案,超声波和视觉识别共同作用

嗯,看过了,还挺有参考价值的






欢迎光临 5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年) (http://5imx.com/) Powered by Discuz! X3.3