我正在研究一种能够使用网络摄像头进行运动检测的机器人.我在C#中这样做
机器人移动得太快,所以我想在很短的时间间隔内打开/关闭它以降低速度.
例如,它将启动发动机然后等待0.5秒并将其关闭,此循环每2秒重复一次.这样,它的速度不会太快.我想将它包含在一个名为Move()的函数中
我只是不知道该怎么做,特别是因为我的运动检测代码每秒运行20次.根据障碍物的位置,我可能需要禁用Move()功能并激活让机器人移动到其他方向的其他功能.
关于我应该从哪里开始的任何想法/建议?
非常感谢!
首先,我们需要确定您的程序如何流动.
它执行一个命令,等待,然后执行下一个命令吗?或者它是否同时执行命令?(例如,移动并做其他事情)
我想你会希望它按顺序执行命令,而不是你的电机系统可能不支持的一些复杂的线程.
为了让你的机器人慢慢移动,我建议你创建一个Move()方法,它接受一个参数,你希望它花费多少时间移动,如下所示:
public void Move(int numberOfSeconds) { while (numberOfSeconds > 0) { myRobot.MotorOn(); Thread.Sleep(2000); myRobot.MotorOff(); Thread.Sleep(500); numberOfSeconds -= 2; } }
这不是确切的,但这是一种做法.
然后,如果您再调用Move(10),您的机器人将移动10秒钟,并且每2秒钟暂停半秒钟.
关于您的程序流程问题,您可能希望将其视为指令列表:
向前停止检查物体是否在物体上旋转以向前移动
等等
所以在你的主程序控制循环中,假设调用是同步的(即你的程序在执行命令时停止,就像在上面的Move方法中那样),你可以简单地拥有一堆IF语句(或者一个开关)
public void Main() { // What calculations should the robot do? If (someCalculations == someValue) { // Rotate the robot to face the object robot.RotateRight(10); } else if (someOtherCalculation == someValue) { // We are on course, so move forward Move(10); } }
这可能会帮助您开始.
但是,如果您的机器人是异步的,也就是说,代码在机器人正在运行时保持运行(例如您不断地从运动传感器获得反馈),则必须以不同方式构建程序.Move()方法可能仍然有效,但您的程序流程应该略有不同.您可以使用变量来跟踪状态:
public enum RobotStates { Searching, Waiting, Hunting, Busy, }
然后在主循环中,您可以检查状态:
if (myRobotState != RobotStates.Busy) { // Do something }
记住在操作完成后更改状态.
您完全有可能必须使用线程进行异步解决方案,因此从传感器接收反馈的方法不会等待机器人移动,但可以继续轮询.虽然线程超出了这个答案的范围,但是有很多资源.