托运动物程序复杂吗?
这个题目我两年前做过,当时用python做了个简单的模拟器,用来让初学者体验下托运物的流程(因为之前写过几篇有关搬运机器人相关文章,有人让我做做简单模拟),正好最近在研究基于图形的编程,就顺便把之前的python代码用了用,改了下图形界面,重新写了控制逻辑和碰撞检测,并把实验的视频重录了一下。 这里把视频放在文末做为彩蛋,因为知乎视频好像不能放大,放大的话画质又不好,所以干脆放个链接吧 其实刚开始也想过用其他语言来重做这一实验,比如C++或java,但由于平时主要用的还是python,就想到了之前写的那个simpy库,就想试一试再用python来做这个实验会发生什么,结果出乎意料之外的速度竟然能够完成。(后来查询了相关资料才知道simpy是支持并发执行的,而多线程执行的话会快很多!) 下面贴出python版本的代码(为了阅读方便,把代码放到了github上) 关键部分的代码 上面是本次实验的核心代码,其中最重要的两个函数就是move_obj()和check_collision(),这两个函数的功能分别对应着移动对象以及检测碰撞。 在初始化的时候,我们设置每个球需要运动的时间,并根据时间计算出每次的步数,然后通过time.sleep()函数让程序以一定频率不断重复运行,同时为了防止出现死锁,我们在每循环一次后,都重置一下变量i,确保下一次从0开始计数。 当程序运行到move_obj()时,就会进入循环中,根据当前的步数和每步的最大位移,来计算当前应该移动到的位置,并将新的坐标传递给canvas的draw()方法在屏幕上绘制出来,这样当循环结束后,我们就看到了物体按照预先设定的路径进行了移动。 为了避免每次循环都对整个列表进行遍历,我们使用了list comprehension来实现对每个物体单独的处理,这样可以大大提升性能。
测试 用python模拟运输的过程虽然非常便捷,但测试结果并不能够真实反映现实情况,为了能够更为贴近实际,我们用Arduino连接传感器并自制了一个运送装置来进行实际测试。 测试中我们将一个加特林电风扇的叶片通过螺旋桨传动的方式驱动一个小车,并且通过传感器检测小车上一枚硬币的位置,当检测到硬币到达指定位置时,加特林风扇将会停止运转。我们设计了三种不同的路线,让小车沿着路线进行行驶,从而验证不同路线下的花费时间和最终成功的概率。 经过多次尝试,我们发现当设计好的道路曲折且距离较远时,使用python模拟的结果与真实实验结果相差较大,此时无论是使用多线程还是多进程都无法解决速度慢的问题,但当我们改变策略,让机器人在行进的过程中做一些简单的事(此处可以使用模拟),然后再达到目的地后执行一些其他操作时,却意外地获得了不错的效果——速度大幅度提升。可能的原因是当机器人处于行进过程中时,由于每一步的数据需要实时更新,所以采用单线程模式会使得前面的行动导致后面无法实时跟进,而如果采用多线程的话就能够实现同时进行,从而解决了速度慢的问题。