关于惊群效应

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于惊群效应相关的知识,希望对你有一定的参考价值。

参考技术A

什么是惊群,这篇文章写的很好:
举一个很简单的例子,当你往一群鸽子中间扔一块食物,虽然最终只有一个鸽子抢到食物,但所有鸽子都会被惊动来争夺,没有抢到食物的鸽子只好回去继续睡觉, 等待下一块食物到来。这样,每扔一块食物,都会惊动所有的鸽子,即为 惊群 。对于操作系统来说,多个进程/线程在等待同一资源是,也会产生类似的效果,其结 果就是每当资源可用,所有的进程/线程都来竞争资源,造成的后果:
参考
1)系统对用户进程/线程频繁的做无效的调度、上下文切换,系统系能大打折扣。
2)为了确保只有一个线程得到资源,用户必须对资源操作进行加锁保护,进一步加大了系统开销。

对于惊群效应的场景描述,最常见的就是对于socket操作符的accept操作的描述。当多个用户进程/线程同时监听同一个端口时,由于实际上一个请求过来,只有一个进程/线程accept成功,所以就会产生惊群效应。

实际上这是一个很古老的问题。linux操作系统在内核层面很早就解决了这个问题,一个请求过来,内核只会唤醒一个进程来accept,这样就没有惊群现象了。但是在很多场景下,只要有竞争,就可能会出现惊群效应。比如常见的生产者-消费者模型,一般来说消费可能会比较耗时,所以消费者会有多个。当突然有生产者往队列里面投了一个job时,这些消费者就会一哄而上去队列中抢这个job,这就发生了惊群效应。

一个基本的线程池框架也是基于生产者-消费者模型的。也就是说只要用到了进程池或者线程池,你可能就避免不了要处理惊群效应带来的问题。所以 你能感觉到惊群效应的无处不在了吗 。。。

那么对于线程池这个模型,我们怎么解决它可能出现的惊群问题呢?

一个线程池的定义一般如上所示:有最大线程数限制max_threads,当前线程数curr_threads和空闲线程数idle_threads,然后还有线程互斥锁,还有线程条件变量, 每个线程条件变量对应一个唯一线程 ,然后还有一个线程任务队列(链表)。为什么需要线程条件变量和线程任务队列这些??

消费者一般在等待任务和处理任务的过程中,处理逻辑可以简化为:

如果生产者有任务了,就会通过内核通知消费者。生产者的通知过程可简化为:

注意上面用的是pthread_cond_signal,这个是根据进程条件变量来通知某一个等待消费的线程,而不是用pthread_cond_broadcast函数来广播给所有等待任务的消费者,这样就不会产生惊群效应。

pthread_cond_signal函数的作用上面也说了,是根据条件变量发送信号给一个正在休眠等待消费的线程,这个休眠消费线程获取到这个信号后马上激活,进行消费。

如果某一时刻,所有的消费线程都在进行各自的消费,此时又有一个生产者发送了一个任务,现在没有空闲消费者来接怎么办??

在这种情况下,生产者调用pthread_cond_signal函数也会立刻返回,只不过此时不是根据条件变量通知一个消费线程来accept,而是将此任务放到线程池队列中去,等待有空闲的消费线程过来取。

上面说了一个条件变量对应一个消费线程(意思就是每次都能根据当时的条件找到唯一的一个消费进程),那条件变量到底是什么呢??

条件变量的作用就是筛选出一个最合适的消费线程。那生产者生产了一个任务后,是怎么根据条件变量筛选出那个最合适的消费线程的呢??

假设有多个消费线程正在休眠,首先根据各消费线程优先级的高低确定哪个线程接收到信号开始继续执行。如果各线程优先级相同,则根据等待时间的长短来确定哪个线程获得信号。

在上面这种机制下,我们能保证生产者生产了一个任务后只会通知唯一的一个消费者线程,所以不会出现惊群效应。等等,到目前为止,咱们定义的线程池中,pthread_mutex好像并没有用到呢??

刚刚我们只是假设有pthread_cond_signal这种函数来保证每个任务只通知一个唯一的消费进程,那如果有的系统没有这样的单一通知机制,只有pthread_cond_broadcast函数这种广播机制怎么办??

此时pthread_mutex这个线程池互斥锁便派上用场了。在只有pthread_cond_broadcast函数这种广播机制的情况下,通过一个线程互斥锁,给每一个消费者线程创建一个条件变量......(好像原文后面说的不是很清楚)

【大意】:在线程池中,增加一组线程条件变量,对应于每一个线程。增加任务的时候,如果有空闲线程,那么只通知某一个空闲线程,并且将其置忙。忙与闲,可以通过条件变量来表征,用一个链表表示(类似连接池)。
如果所有线程都忙,那么就将任务加入全局队列,并且通知所有消费者(这时惊群是很小的,除非所有线程都刚好同一时刻完成任务,同一时刻争夺资源,否则只有极少数线程会发生惊群)。

上面也说道了linux在操作系统层已经避免了惊群效应的出现,但是nginx作为一个移植性非常高的web服务器,它自己也实现了一套避免出现惊群效应的机制。

关于穿越机FPV视频果冻效应的讨论

关于穿越机FPV视频果冻效应的讨论

这里讨论下穿越机FPV视频果冻效应的问题,看了好多B站的视频。从逻辑上讲,主要的问题来自硬件,软件调参只能解决软件参数导致振动加剧的问题(说明参数调的不是那么特别好),无法本质上解决硬件导致的振动问题。

【1】萌新穿越机改pid出现抖动?
【2】自带高清果冻还是很厉害
【3】达尔文花飞练习
【4】399达尔文套机1公里小远航第二次
【5】达尔文FPV,室内室外通吃,稳飞10分钟续航
【6】穿越机果冻的五大硬件原因 -TimmyRC 5 Reasons Your Setup Has Jello

1. 名词定义

果冻效应,指在生产生活中像果冻一样产生的变形和颜色变化。

2. 摄像原理

在我们谈视频产生果冻效应之前, 先了解一下数码相机的摄像原理。

2.1 快门分类

首先,数码相机的重要部件就是快门:

  • Global shutter (全局快门)
  • Rolling shutter (卷帘快门)

2.2 常见传感器

  • CMOS传感器的相机多数使用卷帘快门,它是通过图像传感器逐行曝光的方式实现的。在曝光开始的时候,图像传感器逐行扫描逐行进行曝光,直至所有像素点都被曝光。

当然,所有的动作在极短的时间内完成,一般不会对拍摄造成影响。

  • CCD传感器的相机多数采用全局快门,因此一帧所有像素是在同一时间段内进行曝光。

相较于卷帘快门,具有拍摄高速物体更优的性能(如果快门速度不够,容易模糊)。

2.3 卷帘拍摄

当运动(高速移动)物体,卷帘快门进行拍摄的时候,会发现物体发生形变。而全局快门,如果曝光速度不够通产是图像的模糊。

注:这里也是为什么卷帘快门拍摄容易带来果冻效应的原因。

3. 产生原因

果冻的形成是摄影机本身的特性决定的,当拍摄物体相对于相机高速运动或快速振动时,用卷帘快门方式拍摄,逐行扫描速度不够,拍摄结果就可能出现“倾斜”、“摇摆不定”或“部分曝光”等情况。这种卷帘快门方式拍摄出现的现象,就定义为果冻效应。

注:通常来说全局快门不太可能出现果冻。如果曝光时间过长,拍摄高速运动或者在振动的情况下拍摄,会导致图像模糊。

4. 解决方法

对于FPV视频来说,要解决【CMOS/CCD】传感器卷帘快门方式拍摄下果冻效应,就得:硬件减振(避免摄像头卷帘快门工作方式下的“倾斜”、“摇摆不定”或“部分曝光”等情况)。

4.1 振动出处

  1. 机架问题:炸机(断裂),螺丝松动
  2. 动平衡问题:炸机(桨叶损坏,电机轴歪)
  3. 飞控减振: 飞控晃动,飞控振动
  4. 飞控受力:电线压迫飞控、器件压迫飞控
  5. 设备共振:电机 + 桨叶 + 机架
  6. 操作手抖

注:关于操作问题,这个首先需要大家根据自己的情况排除,也可以通过日志数据看RC stick的数据来确认。

4.2 软件方法(辅助作用)

  1. 【摄像头】曝光时间调小(解决果冻,越小越好)

暗场景,曝光时间不够可能比较暗,需要根据实际使用情况权衡。如果厂家做出来的产品正常使用都会导致果冻,相信这个产品也不太好卖。当然这是一个辅助定位问题的方法。

  1. 【飞控】陀螺仪滤波(避免飞控由于振动数据导致的误动作:软件调整平衡飞机)

为什么说辅助的原因就是这里,不管怎么软件滤波,振动始终在物理世界存在。除非是PID非常不合理导致的问题。

4.3 硬件方法(直接办法)

  1. 【机架】拧紧螺丝

金属疲劳,起降/飞行振动 螺丝松动导致机臂机身松动。

  1. 【机架】更换机架

由于炸机导致机臂开列或者某些部件松动固定不牢,导致飞行期间振动。
也可能是机架本身比较软 或者 与电机、桨叶产生共振。

  1. 【动平衡】更换桨叶

桨叶损坏,动平衡被破坏,有专门的工具可以测试,如果损坏需要立即更换(通常炸机的桨叶,有缺损,有弯折,需要立即更换)。

  1. 【动平衡】更换电机 或 轴承

炸机 或 长时间使用导致轴承磨损或者弯曲,可以使用测试软件单独电机(脱桨)测试稳定性。
比如:Bad Quadcopter Motor | REAL WORLD BLACKBOX TROUBLESHOOT

  1. 【飞控减振】增加飞控减振橡胶垫 或者 橡胶螺柱

飞控板上SMT有陀螺仪芯片,因此板子如果硬连接在机架上,振动能够非常轻易的影响陀螺仪,干扰数据。可以通过减振脚垫来物理屏蔽,长时间橡胶如有损坏,请更换。

  1. 【飞控受力】重新整理飞控板子周边,电线不要顶住机架,电解电容等大型外挂器件不要接触飞控板,进而影响陀螺仪

为了走线美观,电机线可能会贴着机架,绕过机架上的铝管,某些AIO的飞控板会直接焊接电机线,从而传递到振动。
电池电源外接的电解电容如果碰到飞控板也会带来振动,尽量保证飞控板仅仅是减振螺柱固定到飞控机架上即可。

  1. 【设备共振】更换部件(桨叶、电机、机架)使得不产生共振

这种问题是最头疼的,通常来说桨叶的更换最为方便,多选择其他品牌或者好的口碑的桨叶来进行测试。
使用前面的电机动平衡测试方法来确保电机本身没有问题。

  1. 【摄像头】更换全局快门摄像头

从硬件的角度来说更换CCD(通常全局快门)是一个方法。但是从实际情况看,CMOS摄像头在比较好的硬件减振情况下,也是不应该有果冻的。

5. F450试验机遇到的问题

5.1 现象

  • F450试验机:飞行过程发现,地面呈现水波纹,高楼有扭动,视频自arm以后,有明显的振动。

【1】BetaFlight Kakute F7 AIO F450 +ELRS(915Mhz)+500mW 红色桨叶,全新
【2】BetaFlight Kakute F7 AIO F450 + TX12 + ELRS(915Mhz) 红色桨叶,全新
【3】BetaFlight Kakute F7 AIO F450试飞 白色桨叶,不全新

  • F450相关视频(别人家的),也有果冻情况。

【1】F450,PX4固件,无云台挂载相机firefly(小方狗二代)1080p30fps
【2】F450航拍
【3】山寨F450第一次航拍
【4】F450飞行
【5】F450 clone FPV
【6】F450 SPF3 MANUAL TEST FLIGHT
【7】F450 - motor failure - 4.2km
【8】F450 frame racestar 2312 980kv brushless motors 9 inch apc propellers beta flight f4 emaxx 45 amp
【9】Drone f450
【10】DJI F450 vibrations
【11】F450 vibration readings no props
【12】F450 Clone Vibration Issue
【13】DJI F450 Stock Blades without Stabilisers to test Vibration - Go Pro Hero 2

  • F450相对较好的情况,较多减震工作,依然存在一些振动

【1】10寸机带你看日出日落。F450已老,尚能穿越否(二)
【2】DJI F450 Flame Wheel Lighting 100kph 62mph flight with 3s lipo
【3】F450 Drone 2017
【4】DJI F450 Super Whoop

5.2 测试

  1. 【无果冻】静止(电机不转):模拟信号雪花点
  2. 【无果冻】运动(电机不转):模拟信号雪花点,大FOV视频畸变(正常)
  3. 【无果冻】静止(电机带桨叶转):有明显上下振动(抖动)
  4. 【有果冻】运动(电机带桨叶转):果冻效应明显
  5. 【有果冻】悬停(第三人称,飞机悬停稳定):第一人称FPV视角,有水泼纹(大楼图像晃动)
  6. 【有果冻】离地越高,地面水波纹效应越明显
  7. 【有果冻】新桨叶问题依旧

老桨叶(白色,最早视频模糊,但是果冻相较好不少) 新桨叶(红色,果冻更多更强)。历史视频显示,新桨叶果冻效果厉害

  1. 视频显示机臂上的天线振动厉害(怀疑桨叶 + 机架,引起振动)

某次试飞,将Rx天线(绑在机臂上)正好放在了FPV摄像头拍摄区域,发现明显的振动(也就是说机臂上是有振动的)。

5.3 减震改善

  1. 【无效】飞控板增加减振胶垫

其实飞控板的陀螺仪上是有泡沫垫与飞控板连接的,有避震效果)
例如:Soft Mount Your Quadcopter Flight Controller | BUILD TIP

  1. 【无效】电机增加减震垫

增加一定的软连接来减少电机和桨叶带来的振动。

  1. 【无效】更换新桨叶(新购买)

问题依然存在,稍有改善

  1. 【无效】电机振动:测试每个电机无轴承(弯曲变形)问题

电机(不带桨叶),无明显振动。
方法:平放桌上,通过地面站单独控制每个电机独立转动,看陀螺仪数据是否平滑
实际测试情况看,陀螺仪无任何波动,但是手稍微抬一下飞机,陀螺仪数据就变化明显
例如:
Troubleshoot Your Quadcopter Vibration Problems | Moto Test suggest clean motor vibration
Motor Vibration, acc_lpf_hz, and you

  1. 【无效】摄像头增加软连接

摄像头减震,两种方法:

  1. 3M泡沫双面胶垫底+软胶带固定
  2. 棉花+单股电线软线,防震软连接

6. 【排除】摄像头内部振动(PCBA)

Troubleshoot Your Quadcopter Vibration Problems | Camera PCB board issue
这里采用的是Caddx Ant 1200TVL 4:3,也就是说实际上直接固定住PCBA和有外壳的摄像头还不太一样。经检查也没有镜头松动的现象。

5.4 其他改善

  1. 使用PDB分电板上的12V/5V(独立)供图传和摄像头,并增加2200uF + 0.01uF滤波

期望减少电源干扰雪花点,横波纹等
比如:punch throttle caused gero issue,Gyro Noise Troubleshoot | MINI QUAD BLACKBOX

  1. 陀螺仪软件滤波(日志数据显示,低频数据信号,数据完美)

期望减少飞控由于干扰数据的误动作,收效甚微。

  1. 曝光时间未做调整

仍然采用自动(全场景几乎都有果冻,所以没做过多测试),毕竟这个果冻是比较厉害的

  1. 增加摄像头屏蔽(锡箔接电池地)

怀疑480Hz PWM控制线或者飞控电磁干扰,屏蔽CMOS模拟摄像头(屏蔽干扰,锡箔纸接GND) ,有一定效果,果冻效应依旧存在

5.5 初步结论

怀疑:电机910KV和桨叶带来的振动,与F450机架(软)共振,导致固定频率振动。

证据:滤波(干净)前日志显示锯齿状振动频率, 滤波后陀螺仪数据完美,且第三人称看飞机飞行稳定,但FPV视频果冻。


5.6 改进方向

  1. 【更换】更硬材质的机架(小机架5寸,炭纤维材质;非廉价机架F450 10寸 尼龙塑料材质)
  2. 【更换】大KV值电机(高频小幅度振动,容易被减震部件吸收)
  3. 【采用】电机与机架的TPU防震(之前是自己做的1mm橡胶垫圈,可能没有TPU打印专用的好)
  4. 【采用】飞控防震垫圈(陀螺仪虽然有泡沫吸收振动,但是从滤波前后看,吸收的还是不够)

6. 总结

PS:高人也请多多指点,评论留言,看看是否还有哪些可能与因素没有考虑到,万分感谢!

注:暂时保留该章节,待后续更新改进后的效果。

7. 参考资料

【1】果冻效应rolling shutter
【2】四轴飞控DIY集成FPV功能
【3】四轴飞控DIY简明步骤介绍

以上是关于关于惊群效应的主要内容,如果未能解决你的问题,请参考以下文章

uWSGI Apache 处理 惊群效应的方式 现代的内核

Nginx惊群效应引起的系统高负载

多线程环境下的惊群现象

nginx惊群问题的解决方式

分布式锁

关于蝴蝶效应