仓鼠的速度

养了一只熊类仓鼠,每天晚上疯狂跑轮。据我熬夜的时候观察,长达三四个小时连续不断。轮子有轻轻的嗡嗡声,小爪子打在跑轮的内壁上,嗒嗒嗒嗒。据二猫查资料,仓鼠每天要跑8.4公里,不然不舒服。据说有人录了视频,他家仓鼠跑了5个多小时。

那么,时速多少呢?我想实测一下。

1. 技术方案的逐步退化

最初考虑,在跑轮上贴张小纸片,当跑轮带动小纸片切断光源时,红外传感器检测到转了一圈。用树莓派,或者用 arduino 记录红外传感器的信号,然后显示在LED上并且上传到手机APP或者小程序上。最后一步,数据由树莓派上推到服务器,然后从APP或小程序周期下拉。

又考虑,这得把树莓派翻出来,arduino放哪了?得在PC机上安装开发环境,好几个G,只能干这个,没啥别的用处。

要不,不用树莓派或arduino,换成PC机?

红外传感器上行咋接PC?把红外传感器换成摄像头?那么,需要 OpenCV,也许训练AI识别小纸片?

摄像头,手机就有……

总之,从捕捉跑轮转动这个动机出发,考虑用手机,手动,一次性的解决方案。如此对付。

2.速度

求速度的话,可以从视频信号中抽取出仓鼠腿的移动。这样 步频 可以从视频中观察 每秒小腿儿倒腾的次数 得到,步幅,可以在整理箱或跑轮上粘贴坐标纸作为背景。但是如果亲眼看到仓鼠跑轮,就会放弃这个想法。因为小腿倒腾得实在太快了,在频闪50Hz的日光灯下看不太清楚。通过手机的摄像头看,有虚影。仓鼠无影脚。

所以,准备采用上节中提到的通过跑轮间接测量。

(1)跑一圈的位移

跑轮直径标称25cm。我把手掌张开比划了一下作为交叉验证,大致差不多。根据圆的周长公式可以求得周长为 25*3.14=78.5cm。仓鼠每驱动跑轮转一周,虽然事实上并无位移,简称 跑一圈,行进距离计为78.5cm。以下为跑轮大致侧视角度,直尺用于作为参照物,其量程不够测量25厘米。

(2)跑轮转速 跑轮每转一圈所花费时间的测量

在跑轮的外圈表面上用马克笔做明显标记,称为 mark。我打了3个加号“+”,排成一行,与跑轮的轴平行。以下为跑轮的顶视角度。

把手机摄像头近距离对准mark,开启视频录制功能。在仓鼠奔跑的中间阶段,速度较为稳定时,开始录制,十几秒后停止。保存视频。以上,录制多次得到多个视频文件。

把上述视频用 anlink 传到 PC 机,以下在PC机上操作。

用视频编辑工具 shotcut 打开视频文件中的一个。

在filters 中 选择 timer 加入。之所以选用这个过滤器的原因,是因为 shotcut默认的时间戳为 xx:yy:zz 格式,其中最后一个冒号后为30进制,而不是60进制,需要换算。我在最初使用的时间不知道那是30进制,算了几次时间感觉不对,逐帧查看时间戳才找到原因。

逐帧向后翻,找到如下图所示,mark刚刚显露出来的时候。

在 output 的 track 上打标记。

同时,由于 filter | timer 的效果,时间戳会显示在视频的当前帧上。

为每个要计时的时刻按如上方法打标记。把所有标记抄写到 excel 中,求出每两个时间戳的时间差。

求时间差的平均值 0.895333333 秒。

以上表明,仓鼠跑轮周圈0.9秒左右。不到1秒,25厘米,一“拿”多长的的跑轮,就要转一圈。快不快?

(3)速度

根据上述数据 周长 78.5cm,转速 0.90秒左右,求得仓鼠速度为

=3.14*0.25/0.895333333=0.876768429 米/秒。约每秒跑将近1米。

合 3.156366345公里/小时。比我快速徒步6公里/小时或5公里/小时略慢,比我漫步时还要快一些。现在如果持续三四个小时,我不知道自己能不能走到3公里/小时这么快。

(4)关于精度和误差的讨论

我最担心的是测量精度不够,特别是亲眼看到仓鼠的小腿跑出虚影的时候。在跑轮上与在地面上不同,仓鼠的脚没有与地面保持相对静止的那个时间段,脚一直在随着跑轮的转动而移动,所以更难测量。当然,在地面上有另外的困难,可能需要镜头拉远,才能看到仓鼠的脚不止一次落地。

先做了个可行性的技术原型,用手机摄像头在暗光下,人手动转跑轮,速度差不多与仓鼠转得在相同数量级,能够明显看到mark标记在镜头里出现。那么,差不多能测出来。

大约1秒钟跑轮转1圈。1秒钟,手机视频采样30帧,因此测量的时间间隔,即时间分辨率为 1/30 约0.033秒。上述测得的每圈花费时间0.90秒左右,考虑到时间分辨率,应为0.90-0.03~0.90+0.03,即0.87秒~0.93秒。

以上是对测量精度的考虑。

测量误差我的考虑有问题。从跑轮正上方拍摄,计时的时机是mark出现在边缘,还是mark到达正中间?mark在正中间附近时,线速度在视野中投影的值 比 在边缘要 大。因此,相同的mark位移误差时,mark在正中间对应的时间误差更小。所以mark在正中间可以测得更精确的时刻。但是我测量的时间没有考虑到这一点。后来又考虑到,多次测量取平均值,在累加的过程中会把这一误差消除掉,所以保留了这一方案。

(5)小结

仓鼠奔跑每秒跑将近1米。

2.步频

仓鼠跑起来嗒嗒嗒,每秒多少步呢?求步频。想起来我练跑步的时候,tiger和zhumao分别告诉我,不要那么大的步子,对心脏压力太大,小步倒腾,倒腾的频率要高。仓鼠深得其中精髓。

(1)原理

观看仓鼠奔跑侧面的视频,同时听声音,可以知道仓鼠的两只前脚仅负责支撑,并且产生的声音较小;仓鼠两条后腿后蹬是主要动力,并且会产生“嗒”的一声。

我们测量这些嗒声音之间的时间间隔。

(2)音频

用 ffmpeg 把上述视频转为 mp3格式。

>ffmpeg -i 1.mp4 1.mp3

(3)测量嗒声的时间间隔

用 audacity 打开得到的mp3文件。

上图中,较亮颜色为选中的区段,3个红色箭头所指的,就是发出嗒嗒声的位置。因为声音轻微,所以看起来振幅不明显。上图中右下角是来自窗口下边缘的截图,需要注意的是选中部分时长为0.294秒。

可以看出,大约0.3秒,嗒声3次。即每0.1秒跑出一步。

为了现象更明显,对声音做 normalize ,得到下图。大约0.5秒,共5次踏步。

能够看出/听出,在每次嗒的时候,波形较密集地穿越了零点,即频率较高。转换成频谱可以看到,此处有几个与其他部分相比频率较高的峰。

再看一段,0.3秒左右3次踏步。

(4)小结

每0.1秒跑出1步,合每秒10步。

3.步幅

步幅可以用 速度/步频 大致算出。

0.9 (米/秒) / 10(步/秒) = 0.09米/步

9厘米!每步9厘米这么大的步子。耗子全身抻直了大约12厘米也没有多长啊,一步这么远么?

考虑到仓鼠行动时在跑轮上,而不是在地面上。所以,此时的步幅为每次跨步跑轮转过的边缘长度长,与地面上每两次跨步间的地面距离不同。人类在跑步机上和在地面上的跨步、步频,还有能耗,也是不同的。由于在跑步机上不需要推动身体,仅需要每步保持抬起身体,据说更容易一些。不过,仓鼠确实向身后以线速度推动了滚轮,转动惯量转换为线速度再与仓鼠的质量相比,不知道哪个更大,差多少。

4. 总结

周长接近1米的跑轮,仓鼠每1秒钟转1圈,这1秒钟1圈仅10步,每条后腿迈步5步。

无论速度1米/秒、步频10步/秒、步幅10厘米/步,都远比我原以为的要厉害。真快啊!每天看它跑个不停,我都觉得人生美好、积极向上、阳光开朗,它可真是享受生活。

 

Leave a Reply

Your email address will not be published. Required fields are marked *