Ультразвуковой датчик Lego NXT-RobotC

Я новичок в программировании, поэтому мне нужна помощь с моим роботом NXT, управляемым ультразвуковым датчиком. Он подключен к двигателю (A), и я хотел бы, чтобы он сканировал комнату от центральной линии робота до 90 ° влево и 90 ° вправо с шагом 30 ° (всего семь измерений), сохранял данные в массив и на основе наибольшего расстояния направьте моего робота в направлении измерения, чтобы избежать препятствий. Это вообще возможно? Или есть какое-то лучшее решение? Любые советы или предложения более чем приветствуются.


person Strma    schedule 21.04.2013    source источник


Ответы (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, иначе вам пришлось бы использовать относительные движения). В противном случае я не знаю, насколько легко это было бы сделать на графическом языке программирования, который вы используете изначально.

person dukky    schedule 21.04.2013
comment
Спасибо Андреас за ответ со скоростью света :) - person Strma; 21.04.2013
comment
Я программирую с помощью RobotC, и функции rotateTo нет, но MotorEncoderTarget выглядит близко... MotorTop в вашем примере - это имя задействованного двигателя? - person Strma; 21.04.2013
comment
motorTop — это просто имя объекта, являющегося экземпляром класса RegulatedMotor, который содержит методы для управления двигателем. - person dukky; 21.04.2013

Я бы предложил прикрепить ультразвуковой датчик к сервоприводу с углом поворота 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.

person Sniz    schedule 16.05.2013