224.25K
Category: programmingprogramming

Программирование роботов VEX IQ на языке С++

1.

Программирование
роботов VEX IQ
На языке С++

2.

Базовая программа
// Include the IQ Library
#include "iq_cpp.h"
// Allows for easier use of the VEX Library
using namespace vex;
Подключение библиотеки для роботов IQ
Подключение пространства имен vex
float myVariable;
Объявление вещественной переменной
// "when started" hat block
int whenStarted1() {
return 0;
}
Объявление функции whenStarted1
Функция возвращает результат 0
int main() {
whenStarted1();
}
Объявление функции main – она запустится при запуске программы.
Вызов функции whenStarted1

3.

Типы данных
int myNumber=10; - целочисленный -2147483648 .. 2147483647
double myDouble = 1.5; - вещественный
bool myBoolean = true; - логический, true или false
char myString[] = "my string"; - строковый
int myArray[3] = { 1, 2, 3 }; - одномерный массив
int my2DArray[3][3] = {
{ 0, 1, 2 },
{ 3, 4, 5 },
{ 6, 7, 8 },
}; - двумерный массив

4.

Условия
if ( условное выражение ){
//действие в случае истины
}
else { //необязательная часть
//действие в случае лжи
}
if ( условное выражение ){
//действие 1
}
else if(условное выражение 2) {
//действие 2
}
else {
//действие 3
}
(условное выражение? Если истина : если ложь)

5.

Цикл while
while (condition){
// действие
}
int i=0;
while (i<3) i=i+1;
int i=0;
while (i<100){
i=i*2;
}

6.

Цикл do-while
do {
// действие
} while (condition)
int i=0;
do i=i+1while (i<3) ;
int i=0;
do {
i=i*2;
} while (i<100)

7.

Цикл for
for (initialization; condition; increment/decrement)
{
// код, требующий повторения
}
int count=0;
for(int i=0; i<100; i=i+10){
count++;
}

8.

Методы для работы с экраном
Brain.Screen.print(“qwerty”); - вывод строки qwerty на экран
Brain.Screen.print("Integer: %d", 5 + 10); - поддерживается
форматированный вывод
Brain.Screen.setCursor(row, col); - устанавливает курсор вывода в
ряд row (от 1 до 5) и столбец col (от 1 до 21)
Brain.Screen.newLine(); - переводит вывод на следующую строку
Brain.Screen.clearScreen(); - полностью очищает экран
Brain.Screen.clearLine(1); - очищает строку с указанным номером

9.

Форматированный вывод
Код
Результат
Описание
“count is %d boxes”, 123
count is 123 boxes
Целое число
“count is: %6d”, 123
count is 123
Целое число на не менее 6 символов
“%f”, 0.255678
0.255678
Дробное число
"%8f result", 0.256
0.256000 result
Дробное число на не менее 8 символов
"%.8f result", 0.256
0.25600000 result
Дробное число с 8 цифрами после запятой
"%.1f result", 0.256
0.3 result
Дробное число с 1 цифрой после запятой
"my %6.1f result", 0.256
my 0.3 result
Дробное число на не менее 6 символов и с 1 символом
после запятой
“symbol %c", name[i]
symbol a
Отдельный символ на i-ой позиции в строке name
“name is %s”, name
name is Ivan
строка
“value is 50%%”
value is 50%
Символ процента

10.

Звук
Brain.playSound(sound); - воспроизводит мелодию sound. Варианты siren; wrongWay; wrongWaySlow; fillup; headlightsOn; headlightsOff;
tollBooth; alarm; tada; doorClose; ratchet; wrench; siren2; ratchet2; alarm2;
powerDown;
Brain.playNote(octave, note, duration); - воспроизводит ноту note (от 0 до
6) из октавы octave (от 1 до 7) и продолжительностью duration
миллисекунд
Brain.playNote(octave, note); - включает звучание ноты note (от 0 до 6) из
октавы octave (от 1 до 7)
Brain.soundOff(); - выключает звучание
wait(time, units); - делает задержку time. Units – seconds или msec

11.

События
Brain.Button.pressed(callback); - при нажатии кнопки Button
происходит вызов функции callback
Определение процедуры callbackFunction
void callbackFunction() {
Brain.Screen.print("Callback Function Called.");
}
создается привязка процедуры callbackFunction к событию
нажатия кнопки
int main() {
Brain.Button.pressed(callbackFunction);
}

12.

События
Brain.Button.released(callback); - при отпускании кнопки Button
происходит вызов функции callback
Brain.Timer.event(callback, time); - устанавливает callback-функцию,
которая будет запущена по истечении времени time миллисекунд.
event myEvent = event(callbackFunction); - создание собственного события
myEvent, по которому будет вызываться callbackFunction.
myEvent.broadcast(); - приводит к наступлению события myEvent,
запускает callback и не останавливает выполнение основной программы.
myEvent.broadcastAndWait(); - приводит к наступлению события myEvent
и ставит на паузу всю остальную программу, пока не выполнится событие.

13.

Дополнительные функции Brain
Brain.Timer.reset(); - обнуляет счетчик времени
Brain.Timer.value() – возвращает дробное количество секунд со
времени последнего обнуления времени.
Brain.Screen.column() – возвращает текущую колонку курсора
Brain.Screen.row() – возвращает текущий ряд курсора
Brain.Button.pressing() – возвращает true, если кнопка сейчас
нажата, иначе false. Кнопки buttonUp, buttonDown, buttonCheck
Brain.Battery.capacity(percent) – возвращает текущий заряд
батареи робота в процентах.

14.

Трансмиссия
Для создания трансмиссии нужно
переключиться на вкладку управления
устройствами и добавить новое
устройство, выбрать DRIVETRAIN 2MOTOR, указать в какие порты
подключены левый и правый моторы, и,
если есть, то гироскоп. Затем нужно
указать размер (длину окружности)
колеса, передаточное отношение от
мотора и направление движения
вперед. Без использования гироскопа
потребуется указать еще ширину колеи и
длину трансмиссии.

15.

Движение трансмиссии
Drivetrain.drive(direction); - запускает трансмиссию двигаться
прямо в направлении direction (forward или reverse), скорость по
умолчанию - 50 оборотов в минуту.
Drivetrain.driveFor(direction, distance, units); - запускает движение
трансмиссии в направлении direction (forward или reverse), на
расстояние distance единиц измерения units (inches или mm).
Разрешен 4 параметр логического типа, отвечающий за то, ожидать
завершения действия или нет.
Drivetrain.stop(); - останавливает движение трансмиссии.

16.

Поворот трансмиссии
Drivetrain.turn(direction); - включает поворот трансмиссии в
направлении right или left.
Drivetrain.turnFor(direction, angle, degrees); - поворачивает трансмиссию
в направлении right или left на angle градусов. Разрешен 4 параметр
логического типа, отвечающий за то, ожидать завершения действия или
нет.
Drivetrain.turnToHeading(heading, degrees); - поворачивает трансмиссию
в направлении heading (0.00 до 359.99 градусов по гироскопу). Разрешен
4 параметр логического типа, отвечающий за то, ожидать завершения
действия или нет.
Drivetrain.turnToRotation(rotation, degrees); - поворачивает
трансмиссию на rotation градусов, что может быть больше 360 градусов.
Разрешен 4 параметр логического типа, отвечающий за то, ожидать
завершения действия или нет.

17.

Настройки движения
Drivetrain.setDriveVelocity(velocity, units); - задает скорость движения в
процентах percent (-100 до 100) или в оборотах в минуту rpm (-127 до 127)
Drivetrain.setTurnVelocity(velocity, units); - задает скорость поворота
Drivetrain.setStopping(brakeType); - задает способ остановки brake, coast или
hold
Drivetrain.setTimeout(time, seconds); - устанавливает таймаут (дробное число
секунд), по истечении которого трансмиссия перестанет двигаться, если не
смогла достичь нужного положения.
Drivetrain.setHeading(heading, degrees); - устанавливает направление
гироскопа в градусах от 0 до 359.99
Drivetrain.setRotation(rotation, degrees); - устанавливает текущее положение
поворота, может быть отрицательным.
calibrateDrivetrain(); - калибрует трансмиссию при использовании гироскопа

18.

Мотор
Motor.spin(direction); - запускает вращение мотора в направлении
forward или reverse
Motor.spinFor(direction, rotation, units); - вращает мотор в
направлении forward или reverse, на rotation градусов degrees или
оборотов turns. Разрешен 4 параметр логического типа,
отвечающий за то, ожидать завершения действия или нет.
Motor.spinToPosition(rotation, units); - устанавливает мотор в
позицию rotation градусов или оборотов. Разрешен 3 параметр
логического типа, отвечающий за то, ожидать завершения действия
или нет.
Motor.stop(); - останавливает движение мотора.

19.

Настройки мотора
Motor.setPosition(position, units); - устанавливает значение энкодера в
position градусов или оборотов
Motor.setVelocity(velocity, units); - устанавливает скорость вращения
моторов (-100..100 percent или -127..127 rpm)
Motor.setStopping(brakeType); - устанавливает способ остановки мотора
coast, brake или hold.
Motor.setMaxTorque(value, percent); - устанавливает максимальный
крутящий момент мотора в процентах (0..100).
Motor.setTimeout(time, seconds); - устанавливает таймаут (дробное
число секунд), по истечении которого мотор перестанет двигаться, если
не смог достичь нужного положения.

20.

Показания моторов
Motor.isDone() – сообщает true, если мотор завершил свое
действие или false, если еще нет.
Motor.isSpinning() – сообщает true, если мотор вращается или false,
если нет. Возвращает false после вызова Motor.spin()
Motor.position(units) – возвращает текущее положение энкодера в
градусах degrees или оборотах turns
Motor.velocity(units) – возвращает текущую скорость вращения
мотора в процентах percent или в оборотах в минуту rpm.
Motor.current(units) – возвращает текущую силу тока, которая
подается на мотор в процентах percent или амперах amp.

21.

Группа моторов
Методы управления группой моторов
аналогичны методам управления
отдельными моторами. Также можно
управлять отдельными моторами из
группы, обращаясь к ним
MotorGroup1MotorA и
MotorGroup1MotorB

22.

Bumper
Bumper.pressed(callback) - определяет callback-функцию, которая
сработает при нажатии на кнопку-бампер.
Bumper.released(callback) - определяет callback-функцию, которая
сработает при отпускании кнопки-бампера.
Bumper.pressing() – возвращает true, если кнопка-бампер нажата,
false – если нет.

23.

Distance
Distance.foundObject() – возвращает true если в поле зрения
датчика есть некоторый объект, иначе false.
Distance.distance(units) – возвращает дистанцию в миллиметрах
mm или дюймах inches

24.

Гироскоп
Gyro.calibrate(calibrationType); - выполнение калибровки гироскопа с
целью исключения дрифта, способом calNormal (2 секунды), calSlow (4
секунды), calExtended (8 секунд).
Gyro.setHeading(heading, degrees); - задает направление гироскопа в
heading градусов (0 .. 359.99).
Gyro.setRotation(rotation, degrees); - задает текущий угол поворота
гироскопа в градусах.
Gyro.heading() – возвращает текущее направление гироскопа
Gyro.rotation() – возвращает текущий угол поворота гироскопа
Gyro.rate() – возвращает угловую скорость поворота гироскопа в
градусах в секунду.

25.

TouchLED
TouchLED.setColor(color); - задает цвет подсветки, возможны варианты
red, green, blue, white, yellow, orange, purple, red_violet, violet, blue_violet,
blue_green, yellow_green, yellow_orange, red_orange. colorType::none –
выключает подсветку.
TouchLED.setFade(fade); - задает скорость изменения цвета, slow, fast, off
TouchLED.setBrightness(brightness); - устанавливает яркость от 0 до 100
TouchLED.pressed(callback) - определяет callback-функцию, которая
сработает при нажатии на TouchLED.
TouchLED.released(callback) - определяет callback-функцию, которая
сработает при отпускании TouchLED.
TouchLED.pressing() – сообщает true, когда TouchLED нажат, иначе false.

26.

Color
Color.setLight(brightness, percent); - задает яркость подсветки датчика
освещенности в процентах от 0 до 100
Color.isNearObject() – возвращает true если рядом есть объект или
поверхность, иначе false.
Color.detects(color) – возвращает true, если датчик определил переданный
цвет. Возможны варианты red, green, blue, white, yellow, orange, purple,
red_violet, violet, blue_violet, blue_green, yellow_green, yellow_orange,
red_orange и colorType::none – ничего.
Color.colorname() – возвращает цвет под датчиком. Варианты red, red_violet,
violet, blue_violet, blue, blue_green, green, yellow_green, yellow, yellow_orange,
orange, red_orange.
Color.hue() – возвращает оттенок цвета от 0 до 360 по модели HSV
Color.brightness() – возвращает яркость, определенную датчиком от 0 до 100

27.

Controller
На момент добавления контроллера
все остальные моторы должны быть
добавлены, и нажатие на кнопки
позволяет добавить управление
трансмиссией или отдельными
моторами, задать направление
движения. Для первоначальной
связи с контроллером, его нужно
подключить к блоку кабелем
Ethernet, после этого будет
налажена и радиосвязь.

28.

Управление стиками
Controller.AxisA.changed(axisMoved) - определяет callbackфункцию, которая сработает при изменении положения оси стика.
Поддерживаются оси AxisA (левый, вверх-вниз), AxisB (левый,
вправо-влево), AxisC (правый вверх-вниз), AxisD (правый вправовлево).
Controller.AxisA.position() – возвращает текущее положение оси,
целое число от -100 до 100. Когда стики отпущены – все оси в
положении 0.
RemoteControlCodeEnabled = false; - запрещает управление
контроллером, по умолчанию true.

29.

Кнопки контроллера
Кнопки ButtonEUp, ButtonEDown, ButtonFUp, ButtonFDown,
ButtonLUp, ButtonLDown, ButtonRUp, ButtonRDown.
Controller.ButtonEUp.pressed(callback) - определяет callbackфункцию, которая сработает при нажатии на кнопку EUp.
Controller.ButtonEUp.released(callback) - определяет callbackфункцию, которая сработает при отпускании кнопку EUp.
Controller.ButtonEUp.pressing() – сообщает true, когда EUp нажата,
иначе false.

30.

Недокументированные возможности
Distance.changed(callback) – вызывает функцию callback, когда
изменилось показание датчика
Distance.setMaximum(200, mm); - задает максимальную дальность
определяемого датчиком расстояния
Distance.objectDetected(callback); - вызывает функцию callback, когда
датчик определил в поле видимости объект
Brain.Timer.time() – Возвращает время в целых миллисекундах
Brain.Terminal.print(“text”); - вывод в терминал (пока недоступен)
int r = rand(); - сгенерирует случайное число от 0 до RAND_MAX (скорее
всего это 32767);
int r = rand() % 10 + 1; - сгенерирует случайное число от 10 до 1.

31.

Недокументированные возможности
Brain.Screen.printAt(4,10,"str"); - печатает str в 4 ряду и 10 столбце
Brain.Screen.setPenWidth(5); - задает толщину линии в 5 пикселей
Brain.Screen.setPenColor(colorType::red); - задает цвет
«карандаша» для рисования
Brain.Screen.setFillColor(colorType::red); - задает цвет «заливки»
для рисования
Brain.Screen.drawPixel(50,50); - ставит пиксель в координатах 50,50
Brain.Screen.drawLine(x1,y1,x2,y2); - рисует линию из точки х1,у1 в
х2,у2 толщиной, заданной функцией setPenWidth

32.

Недокументированные возможности
Brain.Screen.drawRectangle(x1,y1,x2,y2); - рисует прямоугольник из
точки х1,у1 в х2,у2 толщиной, заданной функцией setPenWidth. Доступен
пятый параметр – цвет закраски
Brain.Screen.invertRectangle(x1,y1,x2,y2); - инвертирует пиксели в
области прямоугольника из точки х1,у1 в х2,у2
Brain.Screen.drawCircle(x1,y1,radius); - рисует окружность из точки х1,у1
радиусом radius. Доступен четвертый параметр – цвет закраски.
Brain.Screen.invertCircle(x1,y1,radius); - инвертирует пиксели в области
окружности из точки х1,у1 радиусом radius.
Brain.playNote(octave, note); - включает звучание ноты note (от 0 до 6) из
октавы octave (от 1 до 7)
Brain.soundOff(); - выключает звучание

33.

Недокументированные возможности
Drivetrain.arcade(drivePower, turnPower, percent); - включает движение
по дуге. drivePower – процентный показатель скорости прямолинейного
движения (положительные вперед, отрицательные назад), turnPower –
процентный показатель направления поворота (0 – прямо,
отрицательные влево, положительные вправо)
DrivetrainGyro.calibrate(calExtended,false); - калибровка гироскопа,
подключенного к трансмиссии, за 8 секунд, без ожидания окончания.
DrivetrainGyro.isCalibrating(); – возвращает true, если гироскоп
находится в состоянии калибровки, иначе false.
DrivetrainGyro.setTurnType(left); - устанавливает направление
положительного счета градусов гироскопа
DrivetrainGyro.changed(callback); - вызывает функцию callback, когда
изменилось показание датчика

34.

Недокументированные возможности
TouchLED.on(colorType::red, brightness = 100 ); - включает подсветку заданным
цветом и яркостью
TouchLED.on(hue,brightness = 100 ); - включает подсветку заданным оттенком
от 0 до 360 и яркостью
TouchLED.on(red, green, blue, brightness = 100 ); - включает подсветку смесью
красного, зеленого и синего цветов с заданной яркостью. Каждый цвет от 0 до
255.
TouchLED.off() – выключает подсветку
TouchLED.setBlink(colorType::red, onTime = 0.25, offTime = 0.25 ); - включает
мигание подсветки заданным цветом, с периодом включения и выключения в
секундах.
TouchLED.setBlink(hue, onTime = 0.25, offTime = 0.25 ); - включает мигание
подсветки заданным оттенком от 0 до 360, с периодом включения и
выключения в секундах.

35.

Многопоточность
thread th = thread(callback); - создает и запускает поток, в котором
начинает выполняться функция callback
th.get_id(); – позволяет получить текущий идентификатор потока.
th.interrupt(); - завершает выполнение потока th
th.join(); - позволяет текущему потоку «встать на паузу» до тех пор,
пока не закончит свою работу поток th.
th.joinable(); - возвращает true, если для потока можно вызвать
join. Иными словами, когда поток работает – true, иначе false.
this_thread::sleep_for(1000) – позволяет тому потоку, в котором
вызван метод, «заснуть» на 1000 миллисекунд.

36.

Мьютексы
mutex m = mutex(); - создает объект mutex
m.lock(); - захватывает мьютекс
m.try_lock(); - возвращает true, если удалось захватить мьютекс и
захватывает его, иначе возвращает false и не захватывает.
m.unlock(); - освобождает мьютекс.
English     Русский Rules