0

我正在开发一个 NXT 乐高头脑风暴机器人,我正在构建带有单个反射光传感器的线路跟随机器人,我正在用 C 语言编程。

传感器将原始模拟值转换为范围为 0 - 1023 的数字值。

我必须将线的编码为黑色,然后电机将向前移动,如果没有线(白色底座)然后停止,如果有灰色(在白色和黑色线之间)然后稍微向右然后向左移动不同找到丢失的黑线。

所以代码就像

While (1)
{
a=ecrobot_get_light_sensor(port_led); //storing the A/D converted value in variable

while (a<300)   // White area
{
ecrobot_status_monitor("White Area");
nxt_motor_set_speed(port_motor_l, 0, 1); // left motor turns off
nxt_motor_set_speed(port_motor_r, 0, 1); // right motor turns off
}
while (a>=600) // Black Line
{
ecrobot_status_monitor("Black Area");
nxt_motor_set_speed(port_motor_l, 100, 1); // left motor turns on
nxt_motor_set_speed(port_motor_r, 100, 1); // right motor turns on
}

while (a>=300 || a<600) // Robot loosing the black line
{
ecrobot_status_monitor("grey Area");
nxt_motor_set_speed(port_motor_l, 50, 1); // left motor move forward
nxt_motor_set_speed(port_motor_r, -50, 1); // right motor move backward

delay_ms(200)
nxt_motor_set_speed(port_motor_l, -50, 1); // left motor move backward
nxt_motor_set_speed(port_motor_r, 50, 1); // right motor move forward
delay_ms(200)

}

问题是,如果机器人丢线,则在 200 毫秒延迟后开始顺时针移动而不停止并朝逆时针方向移动。

我的代码有什么问题?

我怎样才能在这个间隔之后停止电机,并且电机应该在这个间隔之后向其他方向移动以寻找线,然后它肯定会找到一条线

谢谢!

4

2 回答 2

1

一种解决方案是将 while(1) 循环中的所有 while 语句更改为 if 语句。

例如,在您的最后一个 while 语句中,当机器人松开黑线时,您的机器人将顺时针旋转,然后在每个方向逆时针旋转 200 毫秒,无论从传感器读取的新值如何。这是因为最后一个 while 语句将在您的 a更新之前首先完成其执行。

于 2013-11-05T01:23:20.753 回答
0

我看到几件事,

  • 缺少一些分号。我确定您的真实代码中并非如此,因为它甚至无法编译。也尝试在你的陈述中有适当的括号(更好的做法:-)

  • 您还需要在循环中重新读取传感器以避免死锁!!!

  • 同样如前所述,在大的 while 循环中使用 if/else if 语句。

  • 您可以添加一些阈值以使其更平滑:-)

祝你好运

于 2013-11-05T01:40:11.777 回答