首先,我们需要确定您的程序是如何流动的。
它是否执行一个命令,等待,然后执行下一个命令?还是它同时执行命令?(例如,移动并做其他事情)
我想您会希望它按顺序执行命令,而不是您的电机系统可能不支持的一些复杂线程。
为了让您的机器人缓慢移动,我建议创建一个 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
}
请记住在您的操作完成时更改状态。
您完全有可能必须将线程用于异步解决方案,因此您从传感器接收反馈的方法不会在等待机器人移动时卡住,而是可以继续轮询。虽然线程超出了这个答案的范围,但是那里有很多资源。