Я новичок в программировании, поэтому мне нужна помощь с моим роботом NXT, управляемым ультразвуковым датчиком. Он подключен к двигателю (A), и я хотел бы, чтобы он сканировал комнату от центральной линии робота до 90 ° влево и 90 ° вправо с шагом 30 ° (всего семь измерений), сохранял данные в массив и на основе наибольшего расстояния направьте моего робота в направлении измерения, чтобы избежать препятствий. Это вообще возможно? Или есть какое-то лучшее решение? Любые советы или предложения более чем приветствуются.
Ультразвуковой датчик Lego NXT-RobotC
Ответы (2)
Это будет работать в некоторой степени для обхода препятствий, а для его реализации это зависит от того, что вы программируете для робота. Я знаю только lejos (java), в котором функция для получения угла будет выглядеть примерно так:
public static int scanArea(RegulatedMotor motorTop, UltrasonicSensor sonar) {
int theAngle = 0;
int largestDist = 0;
int currentDist;
for (int rotateAngle = -90; rotateAngle <= 90; rotateAngle += 30) {
motorTop.rotateTo(rotateAngle);
currentDist = sonar.getDistance();
if (currentDist > largestDist) {
largestDist = currentDist;
theAngle = rotateAngle;
}
Delay.msDelay(25);
}
motorTop.rotateTo(0);
return theAngle;
}
Если вы программируете робота на любом языке, основанном на коде, его довольно легко преобразовать (при условии, что у вас есть такие функции, как rotateTo, иначе вам пришлось бы использовать относительные движения). В противном случае я не знаю, насколько легко это было бы сделать на графическом языке программирования, который вы используете изначально.
Я бы предложил прикрепить ультразвуковой датчик к сервоприводу с углом поворота 180°, расположенному вертикально. Вы можете выполнить измерение в определенном градусе, назначив этот градус сервоприводу. Используя это:
int largestDistance = 0;
int Angle =0;
for (int servovalue = 0; servovalue <= 255; rotateAngle += 30){
Servo[servo1] = servovalue;
if (SensorValue[Sonar] > largestDist) {
largestDist = SensorValue[Sonar];
Angle = servovalue;
}
}
return Angle;
}
Предполагается, что сервопривод 1 — это ваш вертикальный сервопривод, но это должно работать, если вы программируете в RobotC.