我有mBot机器人,我想对其进行编程以遵循这一原则。到目前为止,它可以通过任何大于90°的线。

我希望它也能够通过90°角。像这样:



问题是我的mBot机器人只有2条线跟随传感器(它们相距5 mm,线宽2 cm),所以我不能只使用传感器。



在大多数情况下,它只是走到线路上,而应该转弯时却错过了线路(在白色),然后返回正轨。一旦回到黑线,它就会再次尝试前进,但会变成白色,而不是转弯。这无休止地发生。

有时它会来回移动并意外转过角度,但这甚至不是解决方法,更不用说解决方案了。

这是一个测试过程竞赛第一轮比赛的结果。 />

如果机器人从15或20方块进入,则无法通过20方块(因此,如果机器人从某个角度进入并旋转90度,则基本上会卡住)。

根据机器人当前看到的内容,传感器值可以读取为0、1、2或3:



0-在行
1-在行的右侧
2-在行的左侧
3-在行

我当前的伪代码程序:

loop forever:
    if (on the right of the line):
        turn_left()
    if (on the left of the line):
        turn_right()
    if (on the line):
        go_forward()
    if (not on the line):
        go_backwards()


那么我该如何急转弯呢?

评论

从图像中很难分辨是两个传感器安装在中心线的左侧还是右侧,或者它们一个安装在另一个的前方?

很棒的编辑!您的机器人可以一次通过瓷砖20,但不能连续两次通过吗?

@ BendingUnit22啊,忘了提及它(现在已编辑)。它不能连续两次通过20块,但是问题是,如果机器人从相对直线(5或10)进入它,它只能通过20块。如果从一个角度(15或20)进入,它会卡住。

@Janekmuric-很棒的编辑,充满了细节。现在,我可以确切地看到问题所在了,不幸的是我仍然无法解决它:(

@Personia您应该问一个新问题!只需确保遵循提问准则即可。

#1 楼


如果机器人从15或20方块进入,则无法通过20方块(因此,如果机器人从某个角度进入并旋转90度,则基本上会卡住)。


以某种方式来自斜线,使您的机器人更有可能垂直于90度转弯移动,从而卡在来回循环中。也许如果它向后缓慢移动,它可能会检测到只有一个传感器导通的时刻,这会导致转弯。但这毕竟是一场比赛,所以我们不要倒退,尤其不要太慢。

我不确定不同传感器值的图像在比例尺上是否准确。看起来这条线并不比两个传感器分开的粗。现在想象一下边缘情况,两个距离是相同的:传感器之间的距离与线的粗细一样。在这种情况下,机器人只能真正沿着直线的确切方向移动。由于上述原因,这对于90°的转弯来说非常糟糕。传感器距离与线条粗细之间的比例似乎在机器人的行为方式中发挥了作用。您无法更改线的粗细或传感器的距离,但是我认为重要的是要考虑这些值产生的影响或至少可能产生的影响。你认为是线。您也可以通过跟随其边缘来跟随一条线。代码看起来像这样:

loop forever:
    if (on the right of the line):
        turn_left()
    if (on the left of the line):
        go_forward()
    if (on the line):
        turn_left()
    if (not on the line):
        turn_right()


由于边缘只是一条线,其行为或多或少取决于传感器的距离,而不是传感器之间的比率。传感器的距离和线的粗细。我去看看它的行为是如何变化的。

速度可以不断变化的比率是。 turn_left()是多少度,go_forward()是多少毫米?
玩弄这些值会导致机器人的行为不同,甚至可能更好。


从理论上讲,

总的来说,您想用两个输入控制系统:角速度和径向速度。设置任何一个都会影响另一个。在您的情况下,径向速度控制回路会跳动并变得不稳定:永远来回运动。重要的是该系统应该在角速度增加时做出反应(以进行90°的硬弯),但径向速度却发疯了。

这表明两者之间的相互作用没有得到很好的控制,需要进一步研究。

改变两个速度之间的比率实际上会改变控制器的增益。降低两个速度意味着每行进距离会获得更多的传感器读数,从而导致更高的采样率,这通常会导致系统更稳定。
可以尝试的方法


改变角速度和径向速度,但是保持它们的比率不变,看看是否改变了任何东西
改变两者之间的比率,看看是否改变了机器人的行为。特别是在不同类型的瓷砖上。哪种比例最适合用于直形瓷砖,什么比例适合于弯曲瓷砖。
同时尝试1.和2.在线方法和在线边缘方法,看看是否能获得不同的结果。


评论


$ \ begingroup $
这实际上可以工作。我现在没有家里的机器人,但我将在学校进行测试。既然第一轮比赛已经结束,我可以说很多人追求速度,而不是准确性或效率。他们的机器人很快就会发疯,他们希望那会过去。由于统计上有400多名参与者,因此至少有一名将进入前三名。克服运气的唯一方法是制造一个可以在整个阶段通过并获得所有积分的机器人,而不管时间如何。 (我得到270/275分,但我不在前3名:p)
$ \ endgroup $
–伴奏
16年5月5日在8:17

$ \ begingroup $
我的方法是通过在变量每次来回添加一个变量来检测它是否卡住。一旦超过限制,它就会急转弯。问题在于,当卡住时,有时会来回移动并起作用,但有时会沿随机方向(包括左右)移动,因此无法检测是否卡住了。另一个有趣的想法是,机器人进入一个程序块,并使用某种算法确定它是哪种程序块(有5种程序块),然后按照预先编程的一组规则移动以通过该程序块。
$ \ endgroup $
–伴奏
16年5月5日在8:25



$ \ begingroup $
我终于可以尝试您的答案了,我对结果感到非常惊讶。这比我的方法好得多!
$ \ endgroup $
–伴奏
16年5月24日在12:07

#2 楼

抱歉,我没有生产线跟踪机器人的经验,我使用超声波传感器,所以这个答案可能有点天真,并且有各种各样的原因使您无法做到这一点。

您的机器人前进并意识到它失去了界限。假设行进的距离不是“很远”,小于机器人的长度的1/2,则您应该能够完成360次并找到两条线。其中一条线与您开始旋转的位置大约成180度(这可以通过电动机的匝数来衡量,如果是步进的话),这不是您要查找的线,您需要遵循另一个。

有帮助吗?

评论


$ \ begingroup $
这个主意似乎不错,但是当您进行更好的观察时,机器人每次必须旋转时都会“失去”直线。当它“丢失”这条线时,它只是向后寻找它,因此进行360度转弯会占用大量时间。同样,如果您的机器人尝试沿直线相反的方向旋转360度,则会倒退。我也被允许使用超声波传感器(在比赛中),但在这种情况下它们将毫无用处,因为一切都在2D平台上。
$ \ endgroup $
–伴奏
16年4月30日在7:57

$ \ begingroup $
机器人可以当场吗?如果是这样,请更改程序,以便当它松开后,然后换行而不是向后移动,它将进行360度旋转并找到两条可能的行。这可能需要一段时间,但比失去路径和无法完成课程要花费更少的时间。
$ \ endgroup $
–代码大猩猩
16年5月2日在20:16

$ \ begingroup $
将传感器分开放置会起作用吗?如果它们相距20毫米,那么只有一个人会读过这条线。当两个传感器都没有读取一条线时,它可以摆动一下,然后再次找到该线。如果两个传感器都读取了该线,则该线正在转弯,您需要朝刚开始看到该线的传感器的方向转向。
$ \ endgroup $
–代码大猩猩
16年5月2日在20:24

$ \ begingroup $
由于传感器已焊接,因此无法移动传感器。并且进行360度旋转不仅会非常慢,而且有时可能会检测到3或4行,只有1条是正确的方法。无论如何,比赛的第一轮比赛今天结束了,我的机器人过去了。 (将会进行更多回合,因此这仍然是一个悬而未决的问题。
$ \ endgroup $
–伴奏
16年5月3日在18:55

$ \ begingroup $
@Janekmuric-恭喜,其他各回合,祝你好运。
$ \ endgroup $
–代码大猩猩
16年5月4日在12:31

#3 楼

我有一个类似的想法,例如@Bending Unit 22,它不是遵循这条线,而是遵循其边缘。因此,您只能使用一个传感器来检测线(例如,仅使用左侧的传感器(蓝点))。右传感器(绿点)表示表面为白色。此事件在下图中用绿色圈出。
如果两个传感器都看不到直线,则机器人应向左转,直到左侧传感器回到轨道上。这是事件,在下图中用蓝色圈出。

基本上,可能存在以下两种行跟随状态:




默认状态当机器人的一个传感器在线时而另一个传感器离线时。

如果其中一个事件发生,则转向状态。机器人可能会停止转动,直到左侧的传感器重新回到线上或右侧的传感器离开线上为止。由于我们可以假定方向是已知的并且机器人没有移动,因此我们可以打开最大速度(或者至少可以尝试看看它是如何工作的)。当然,您可以在机器人运动时对其进行测试。



以前,当您的机器人失去连线时,没有方向信息,因此只能向后希望找到界限。

这只是一种理论,但我认为值得尝试或者只是推进您的项目。

您提到您不能使用更多的传感器,但可以在当前硬件上进行修改吗?

我检查了传感器是否具有数字输出,这表示[行]-[无行],信息不多。但是,如果您可以将红外传感器的输出电压连接到一些模拟引脚,则可以得到更高的分辨率。基本的线检测传感器是红外光电二极管和光电晶体管对。就像您的机器人上的机器人一样,它的模块上还有更多内容,这是Makeblock页面上的更新版本:右)您的机器人具有以前的版本,可能使用了其他传感器。图像中的这个是Vishay的TCRT500。

如果我们看一下原理图级别:红色圆圈。现在,如果有足够的反射红外光,则晶体管将导通,并且输出将下拉至GND。如果反射的红外光不足,则晶体管将不会导通,并且输出将通过电阻上拉以提供电压。但是它不能像开关一样工作,因此输出可以是0-V_Supply之间的任何值。对于给定的光谱分布(本例中为IR),光电流与照度成线性比例关系。因此,正如我说过的,输出电压可以在0 V和VCC(共5 V)之间变化。模拟信号。

当IR LED照亮线路边缘时,可能反射了一半或更多的光,因此晶体管可以稍微导通。这意味着输出不会在0 V附近下拉,而是大约2V。但是不是0 V(这是完整的白色表面),这很重要,因为这意味着它可以部分检测到

现在回到比较器,它将光电晶体管的输出电压与参考电压进行比较。它检查信号是在参考之上还是之下,并将其输出相应地设置为LOW或HIGH。

如果该参考电压为2.5 V,则您的模块将说,当输出电压高于2.5V时,它将检测到线路,因此带有2 V信号的信息将被视为白色表面,因为我们看到了边缘,因此我们损失了分辨率。

现在,如果您可以使用ADC读取整个模拟范围,则分辨率会更高,并且可能会实现更精细的控制算法。

评论


$ \ begingroup $
明天我可能会测试您和@Bending Unit 22的想法。我有2门计算机科学课程,所以我可能会有足够的时间。 +1
$ \ endgroup $
–伴奏
16年5月5日在18:19

$ \ begingroup $
如果传感器二极管之间的距离更大,我想这样做会更好(尽管可能正好相反)。无论如何,我不确定将IR-LED的输出电压连接到某些模拟引脚的意思。传感器是数字的(据我所知),但是即使它们是模拟的,我也不认为会有所不同,因为一个线传感器二极管无论如何都只能处于两种状态(无论在线还是不在)。
$ \ endgroup $
–伴奏
16年5月5日在18:26

$ \ begingroup $
是的,也许传感器太近了。我还编辑了我的问题,并添加了更多详细信息。
$ \ endgroup $
– Bence Kaulics
16年5月5日在19:30

$ \ begingroup $
感谢您的解释,很好的编辑。我认为如果一条线是渐变的,这会更有用,但是我会尝试用它做些事情,因为机器人有时可能无法在奇怪的光照条件下检测到该线。
$ \ endgroup $
–伴奏
16年5月6日在5:38

$ \ begingroup $
通常,比较器的参考引脚上有一个电位计,用于改变参考电压。因此,也许您可​​以在那些光线较暗的条件下调整/校准传感器。
$ \ endgroup $
– Bence Kaulics
16年5月6日在8:16

#4 楼

问题似乎是您的机器人通过垂直于线移动其传感器来起作用。当直线变得垂直时,机器人将失去横向移动将直线带回到传感器中心的假设。唯一的解决方法是更改​​传感器配置(添加更多(如有必要)以消除这种歧义。

评论


$ \ begingroup $
我正在比赛中,不允许添加更多传感器:(
$ \ endgroup $
–伴奏
16年4月30日在7:53

$ \ begingroup $
在这种情况下,您将需要添加脚本化行为(类似于您提到的使机器人在失去线路时进行备份的行为,我认为这是基于软件的),以尝试解决歧义。尝试将拐角切成45度并查看是否在一条线上收尾是执行此操作的一种方法。
$ \ endgroup $
–伊恩
16年4月30日在13:49

#5 楼

在我的配置中,我有一个主要的跟随机制的PID算法。然后,如果汽车下线并且所有6个传感器都检测到白色,我将进入一个单独的例程。这告诉汽车转向最后看线的方向。这对我来说似乎可以达到45度转弯。

#6 楼

看来您可以有4种可能的读数(w,w),(w,b),(b,w)和(b,b)。因此,该程序决定在每种情况下该做什么。为了帮助确定下一步行动,也可以使用过去的历史记录。因此,由您决定多少历史有用或实用。我建议使用某种状态图,但是请使用您已经熟悉的任何状态图。

现在,在您的伪代码中,您左转还是右转多少?您每次阅读之间的距离是多少?您能测量每个车轮走了多远吗?是否可以向后走直到找到线?您的前进和后退动作有多直?这些问题只是您在优化策略时要考虑的一些注意事项。确定您是刚越过一条直线的边缘,直线已经弯曲还是(如果已经弯曲)了多少!

直线机器人竞赛的重点是每个构建者都可以设计(和测试)他们的策略。