使用C++进行机器人实时编程

5
我正在使用C++和OpenCV进行机器人项目的开发。在这个步骤中,我遇到了一个问题,具体如下:
我有两个方法moveRight()moveLeft(),它们在我的代码中被连续调用,但问题是第二个方法不执行,因为第一个方法需要时间(机器人移动的时间),但当我在它们之间加入Sleep(5000)时(我猜测五秒足够了),一切都可以正常运行。
有什么编程解决方案可以避免使用Sleep(因为它会导致其他问题)?

你尝试过多线程吗? - vsz
我创建了一个机器人控制程序,用于处理计算机硅片。它可以在移动过程中无缝更改路线,可能基于硅片通过激光光带时收集的数据。这不是一个简单的问题。我使用了实时操作系统,并配备了定制硬件,以提供反馈以将控制器与机器人同步。题目中提供的信息远远不足以开始回答问题。如果这是一个商业项目,我可能能够提供咨询服务。 - Jive Dadson
也许这个问题更适合在http://robotics.stackexchange.com/而不是StackOverflow中进行。 - Constantin
3个回答

6
你可以尝试添加一个间接层。添加一个执行操作的队列,将移动左右的动作加入队列中,在其他地方(不同的线程)正确地执行队列中的操作,等待前一个操作完成后再执行下一个操作。理想情况下,你需要一种检查操作是否完成的方法,这样你就可以以事件驱动的方式编码它。

你说得对,事实上我可以获取完成/未完成操作的事件。因此,我必须创建一个队列来存储所有我的操作,并从中逐个执行它们,考虑到每个先前操作的等待时间。我想这样的队列可以是一个列表或函数指针,不是吗?非常感谢,Karthik。 - Houssam Badri
@HoussemBdr 很高兴听到我能帮上忙。是的,函数指针列表可能是最简单的情况,但我猜您最终会想要传递参数,然后一个函数对象家族会更好,或者一个基本的命令结构,在出列端实现所有逻辑。另外,如果答案解决了您的问题,是否可以将其标记为已接受的答案? - Karthik T
谢谢,我对函数参数没有问题,所以第一个解决方案是最好的。 - Houssam Badri
我填好了行动队列,但是每个行动都需要机器人的上下文(即在那个特定时间它的实际位置)。那么,我该怎么纠正呢? - Houssam Badri
@HoussemBdr 我想你需要持有一个指针(或更好的是引用)来指向机器人?每个动作,或整个队列。 - Karthik T
显示剩余2条评论

2
在机器人技术中,你绝不能“瞎猜”。你应该知道测量你的运动所需的时间,并将其用于代码中。例如,经常调用moveRight()函数并检查其运行时间。当它正在运行时,使其返回true,并将其作为调用moveLeft()的条件。

1
可以使用计时器,在执行MoveRight()时将计时器设置为5秒,计时结束后执行Moveleft()。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接