Этот пример демонстрирует, как управлять роботом, чтобы следовать за желаемым путем с помощью Средства моделирования Робота. Пример использует Чистый контроллер следования траектории Преследования, чтобы управлять симулированным роботом вдоль предопределенного пути. Желаемый путь является набором waypoints заданное явным образом или вычисленное использование планировщика пути (обратитесь к Планированию пути в Среде Различной Сложности). Чистый контроллер следования траектории Преследования для симулированного робота с дифференциальным приводом создается и вычисляет команды управления, чтобы следовать за данным путем. Вычисленные команды управления используются, чтобы управлять симулированным роботом вдоль желаемой траектории, чтобы следовать за желаемым путем на основе Чистого контроллера Преследования.
Примечание: Начиная в R2016b, вместо того, чтобы использовать метод шага, чтобы выполнить операцию, заданную Системой object™, можно вызвать объект с аргументами, как будто это была функция. Например, y = step(obj,x)
и y = obj(x)
выполните эквивалентные операции.
Задайте набор waypoints для желаемого пути для робота
path = [2.00 1.00; 1.25 1.75; 5.25 8.25; 7.25 8.75; 11.75 10.75; 12.00 10.00];
Установите текущее местоположение и целевое местоположение робота, как задано путем.
robotInitialLocation = path(1,:); robotGoal = path(end,:);
Примите начальную ориентацию робота (ориентация робота является углом между заголовком робота и положительной Осью X, измеренной против часовой стрелки).
initialOrientation = 0;
Задайте текущее положение для робота [x y тета]
robotCurrentPose = [robotInitialLocation initialOrientation]';
Инициализируйте модель робота и присвойте начальное положение. Симулированный робот имеет кинематические уравнения для движения двухколесного робота с дифференциальным приводом. Входные параметры к этому симулированному роботу линейны и скорости вращения.
robot = differentialDriveKinematics("TrackWidth", 1, "VehicleInputs", "VehicleSpeedHeadingRate");
Визуализируйте желаемый путь
figure
plot(path(:,1), path(:,2),'k--d')
xlim([0 13])
ylim([0 13])
На основе пути, заданного выше и модель движения робота, вам нужен контроллер следования траектории, чтобы управлять роботом вдоль пути. Создайте контроллер следования траектории, использующий controllerPurePursuit
объект.
controller = controllerPurePursuit;
Используйте путь, заданный выше, чтобы установить желаемый waypoints для контроллера
controller.Waypoints = path;
Установите контроллер следования траектории параметры. Желаемая линейная скорость установлена в 0,3 метра/секунда для этого примера.
controller.DesiredLinearVelocity = 0.6;
Максимальная скорость вращения действует как предел насыщения для вращательной скорости, которая установлена в 2 радианах/секунда для этого примера.
controller.MaxAngularVelocity = 2;
Как правило предварительное расстояние должно быть больше, чем желаемая линейная скорость для сглаженного пути. Робот может сократить углы, когда предварительное расстояние является большим. В отличие от этого маленькое предварительное расстояние может привести к нестабильному поведению следования траектории. Значение 0,5 м было выбрано для этого примера.
controller.LookaheadDistance = 0.3;
Контроллер следования траектории обеспечивает сигналы элемента управления вводом для робота, который использование робота управлять собой вдоль желаемого пути.
Задайте целевой радиус, который является желаемым порогом расстояния между итоговым местоположением робота и целевым местоположением. Если робот на этом расстоянии от цели, это остановится. Кроме того, вы вычисляете текущее расстояние между местоположением робота и целевым местоположением. Это расстояние постоянно проверяется по целевому радиусу и остановкам робота, когда это расстояние меньше целевого радиуса.
Обратите внимание на то, что слишком маленькое значение целевого радиуса может заставить робота пропускать цель, которая может привести к неожиданному поведению около цели.
goalRadius = 0.1; distanceToGoal = norm(robotInitialLocation - robotGoal);
controllerPurePursuit
объект вычисляет команды управления для робота. Управляйте роботом с помощью этих команд управления, пока он не достигнет в целевом радиусе. Если вы используете внешнее средство моделирования или физического робота, то контроллер, выходные параметры должны быть применены к роботу и системе локализации, может быть обязан обновлять положение робота. Контроллер достигает 10 Гц.
% Initialize the simulation loop sampleTime = 0.1; vizRate = rateControl(1/sampleTime); % Initialize the figure figure % Determine vehicle frame size to most closely represent vehicle with plotTransforms frameSize = robot.TrackWidth/0.8; while( distanceToGoal > goalRadius ) % Compute the controller outputs, i.e., the inputs to the robot [v, omega] = controller(robotCurrentPose); % Get the robot's velocity using controller inputs vel = derivative(robot, robotCurrentPose, [v omega]); % Update the current pose robotCurrentPose = robotCurrentPose + vel*sampleTime; % Re-compute the distance to the goal distanceToGoal = norm(robotCurrentPose(1:2) - robotGoal(:)); % Update the plot hold off % Plot path each instance so that it stays persistent while robot mesh % moves plot(path(:,1), path(:,2),"k--d") hold all % Plot the path of the robot as a set of transforms plotTrVec = [robotCurrentPose(1:2); 0]; plotRot = axang2quat([0 0 1 robotCurrentPose(3)]); plotTransforms(plotTrVec', plotRot, "MeshFilePath", "groundvehicle.stl", "Parent", gca, "View","2D", "FrameSize", frameSize); light; xlim([0 13]) ylim([0 13]) waitfor(vizRate); end
Если желаемый набор waypoints вычисляется планировщиком пути, контроллер следования траектории может использоваться тем же способом. Во-первых, визуализируйте карту
load exampleMaps
map = binaryOccupancyMap(simpleMap);
figure
show(map)
Можно вычислить path
использование алгоритма планирования пути PRM. Смотрите Планирование пути в Среде Различной Сложности для деталей.
mapInflated = copy(map); inflate(mapInflated, robot.TrackWidth/2); prm = robotics.PRM(mapInflated); prm.NumNodes = 100; prm.ConnectionDistance = 10;
Найдите путь между местоположением конца и запуском. Обратите внимание на то, что path
будет отличаться из-за вероятностной природы алгоритма PRM.
startLocation = [4.0 2.0]; endLocation = [24.0 20.0]; path = findpath(prm, startLocation, endLocation)
path = 8×2
4.0000 2.0000
3.1703 2.7616
7.0797 11.2229
8.1337 13.4835
14.0707 17.3248
16.8068 18.7834
24.4564 20.6514
24.0000 20.0000
Отобразите расширенную карту, планы действий и итоговый путь.
show(prm);
Вы задали контроллер следования траектории, выше которого можно снова использовать для вычисления команд управления робота на этой карте. Чтобы снова использовать контроллер и переопределить waypoints при сохранении другой информации тем же самым, используйте release
функция.
release(controller); controller.Waypoints = path;
Установите начальное местоположение и цель робота, как задано путем
robotInitialLocation = path(1,:); robotGoal = path(end,:);
Примите начальную ориентацию робота
initialOrientation = 0;
Задайте текущее положение для движения робота [x y тета]
robotCurrentPose = [robotInitialLocation initialOrientation]';
Вычислите расстояние до целевого местоположения
distanceToGoal = norm(robotInitialLocation - robotGoal);
Задайте целевой радиус
goalRadius = 0.1;
Управляйте роботом с помощью контроллера выход на данной карте, пока это не достигнет цели. Контроллер достигает 10 Гц.
reset(vizRate); % Initialize the figure figure while( distanceToGoal > goalRadius ) % Compute the controller outputs, i.e., the inputs to the robot [v, omega] = controller(robotCurrentPose); % Get the robot's velocity using controller inputs vel = derivative(robot, robotCurrentPose, [v omega]); % Update the current pose robotCurrentPose = robotCurrentPose + vel*sampleTime; % Re-compute the distance to the goal distanceToGoal = norm(robotCurrentPose(1:2) - robotGoal(:)); % Update the plot hold off show(map); hold all % Plot path each instance so that it stays persistent while robot mesh % moves plot(path(:,1), path(:,2),"k--d") % Plot the path of the robot as a set of transforms plotTrVec = [robotCurrentPose(1:2); 0]; plotRot = axang2quat([0 0 1 robotCurrentPose(3)]); plotTransforms(plotTrVec', plotRot, 'MeshFilePath', 'groundvehicle.stl', 'Parent', gca, "View","2D", "FrameSize", frameSize); light; xlim([0 27]) ylim([0 26]) waitfor(vizRate); end