主要内容

调优三维矢量场直方图控制器在三维场景中的避障

类的参数进行调优controllerVFH3D系统对象™导航多旋翼无人机在障碍环境中使用激光雷达传感器。使用uavScenario对象创建障碍环境。在多旋翼无人机上安装激光雷达传感器以获得障碍物的位置。使用uavWaypointFollower对象的目标位置controllerVFH3D对象。使用PID控制器将无人机移动到所需的无障碍方向。

使用无人机场景创建障碍场景

从工作空间中删除所有变量并关闭所有图形。

清晰的关闭所有

创建一个无人机场景,并设置仿真更新速率为2hz。

scene = uavScenario(UpdateRate=2);

在场景中添加多边形障碍网格。

addMesh(场景,“多边形”,{[8 2; 12 2; 12 2; 8 2],[0 10]}, 0.651 *(1、3))addMesh(场景,“多边形”,{[18 8; 22 8; 22日12;18 12],[0 10]},0.651 *(1、3))

在3D中可视化这个场景。

show3D(现场);

图中包含一个轴对象。axis对象包含两个patch类型的对象。

创建多旋翼制导模型和无人机航路点跟踪器

创建multirotor指导模型。

型号=多旋翼;

创建路径点跟踪器。设置无人机类型,每个航路点的过渡半径,以及无人机要遵循的航路点。

wf = uavWaypointFollower(UAVType=“multirotor”...TransitionRadius = 1,...路点=[0 0 -5;0 20 -5;20 20 -5]);

创建无人机平台和安装传感器

指定无人机的初始姿态。

uavPose = [0 0 -5 pi/2 0 0]';

创建一个四旋翼平台使用东北向下(NED)参考框架。指定初始位置和方向。

plat = uavPlatform(“无人机”场景,...ReferenceFrame =“内德”...InitialPosition = uavPose(1:3)”,...InitialOrientation = eul2quat (uavPose (4:6) '));

为可视化添加一个四旋翼网格。添加一个旋转,以定位网格到无人机机体框架。

updateMesh(平台,“quadrotor”,{1.5},[0 0 0],eul2tform([0 0 pi]))

创建一个统计传感器模型,为激光雷达传感器生成点云。

lidarmodel = uavLidarPointCloudGenerator(AzimuthResolution=0.3324099,...ElevationLimits = 30 [-10],...AzimuthLimits = 60 [-60],...ElevationResolution = 0.5,...MaxRange = 10,...UpdateRate = 2,...HasOrganizedOutput = true);

创建一个激光雷达传感器,并将传感器安装在四旋翼上。指定相对于无人机机身框架的传感器安装位置。

激光雷达“激光雷达”、平台、lidarmodel...MountingLocation=[0 0 -0.4],...MountingAngles=[0 0 180]);

设置模拟和可视化场景

想象场景。从地板网格中移除边缘。

图(1)[ax,plotFrames] = show3D(场景);ax.Children(结束)。线型=“没有”

更新绘图视图以获得更好的可视性。

40 xlim (ax, [-10]) ylim (ax, 40 [-10]) zlim (ax, 20[0])视图(ax, 2)轴(ax,“平等”)持有(ax,“上”

图中包含一个轴对象。axis对象包含3个patch类型的对象。

配置ControllerVFH3D对象和集成的路径点追随者

创建一个controllerVFH3D对象。配置HistogramResolution而且MaxAge的属性controllerVFH3D目的提高避障能力。一个低HistogramResolutionValue捕获大多数障碍点,但增加了计算时间。您可以使用MaxAge属性存储先前时间步长的障碍点,以计算稳定的无障碍方向,并避免局部极小值。设置传感器相关参数。

vfh3D(直方图分辨率=5,...MaxAge = 0,...HorizontalSensorFOV = lidarmodel。AzimuthLimits,...VerticalSensorFOV = lidarmodel。ElevationLimits,...SensorLocation =激光雷达。MountingLocation,...SensorOrientation =激光雷达。安装角度([3 2 1]));

导航逻辑使用两个超前距离:一个用于航路点跟踪器,另一个用于controllerVFH3D对象。路径点跟踪器的前视点是controllerVFH3D对象。从控制器输出的期望方向计算出PID控制器的期望位置controllerVFH3D对象。航路点跟踪器的较大前视距离可确保目标位置在期望位置之前。这改善了PID位置控制器的跟踪。

指定所需点沿无障碍方向的前视距离%方向,以及用于航路点跟随器。lookaheadOA = 2;lookaheadWF = 6;设置无人机初始状态。无人机的状态空间是位置,线速度,姿态欧拉角,角速度,推力和积分误差。uavPosition = uavPose(1:3);uavOrientation = eul2quat(uavPose(4:6)')';intErr = [0;0;0];initialState = [uavPosition(1);uavPosition (2);uavPosition (3);...0;0;0;uavPose (4);0;0;0;0;0;0; intErr];%设置PID控制器参数。KP = 15;Kd = 12;Ki = 0.005;Kyaw = 10;设置模拟开始时间和积分间隔。tStart = 0;tStep = 0.1;%解决时间点。hStep = tStep/10;%迭代次数。numIter = 200;存储时间和状态。tTotal = 0 (numIter*(tStep/hStep+1),1);%状态数等于模型状态数加上%积分误差。numStates = numel(model.state)+3;(numIter*(tStep/hStep+1),numStates);

调优ControllerVFH3D对象

controllerVFH3D对象具有许多属性,必须对这些属性进行调优才能获得所需的避障行为。

调整激光雷达传感器范围

修改避障算法的行为可以通过改变传感器的距离限制来修改controllerVFH3D对象。

vfh3D。DistanceLimits = [0.1 5];

无人机路径权重

通过改变与目标方向、先前方向和期望方向相关的权重来修改无人机的路径。

vfh3D。TargetDirectionWeight = 5;vfh3D。PreviousDirectionWeight = 2;vfh3D。CurrentDirectionWeight = 2;

无人机半径

修改无人机半径和安全距离属性,以控制无人机接近障碍物。

vfh3D。VehicleRadius = 0.5;vfh3D。安全距离= 0.5;

模拟无人机避障场景

设置模拟。然后,迭代位置,并在每次激光雷达传感器更新时显示场景。推进场景,移动无人机平台,更新传感器。

设置(场景)%模拟idx = 1:numIter [isupdated,lidarSampleTime,pt] = read(lidar);xLidar =重塑(pt.Location(:,:,1),[],1);yLidar =重塑(pt.Location(:,:,2),[],1);zLidar =重塑(pt.Location(:,:,3),[],1);sensorPoints = [xLidar yLidar zLidar];[targetPosition,~,desYaw] = wf(uavPose(1:4),lookaheadWF);[desiredDirection, desireddyaw,status] = vfh3D(uavPosition,uavOrientation,...sensorPoints targetPosition);可视化直方图。图(2)显示(vfh3D PlotsToShow =“二维膨胀直方图”);沿无障碍方向选择所需位置。* uavPosition = uavPosition + lookaheadOA*所需的方向;[t,y] = ode23(@(t,x)exampleHelperDerivative(t,x,model,desiredPosition, desireddyaw,kp,kd,ki,kyaw),...tStart:hStep:tStart + tStep,initialState);%存储数据。tTotal ((idx-1) * (tStep / hStep + 1 + 1: idx * (tStep / hStep + 1)) = t;州((idx-1) * (tStep / hStep + 1 + 1: idx * (tStep / hStep + 1):) = y;%更新状态。uavPosition = y(end,1:3)';uavOrientEul = y(end,7:9)';uavOrientation = eul2quat(uavOrientEul')';tStart = t(结束);initialState = y(end,:);绘制路径。desPosition = plot3(desiredPosition(2),desiredPosition(1),-desiredPosition(3),“.g”、家长= ax);tgtPosition = plot (targetPosition(2),targetPosition(1),-targetPosition(3),“r”、家长= ax);goalPosition = plot3(wf.Waypoints(end,2),wf.Waypoints(end,1),-wf.Waypoints(end,3),“ob”、家长= ax);legend(ax,[desPosition tgtPosition目标位置],[“想要的位置”“目标位置”“目标”])如果isupdated使用快速更新来移动平台可视化框架。show3D(场景,家长= ax,时间= lidarSampleTime FastUpdate = true);移动平台。move(plat,[uavPosition' y(end,4:6) zeros(1,3) eul2quat(uavOrientEul') zeros(1,3)]);drawnowlimitrate结束%提前场景模拟时间。推进(现场);更新场景中的所有传感器。updateSensors(scene) uavPose = [uavPosition;quat2eul (uavOrientation ',“ZYX股票”) ');结束

图中包含一个轴对象。axis对象包含603个类型为patch、line的对象。这些对象表示期望位置、目标位置、目标。

图中包含一个轴对象。标题为2D膨胀直方图的axis对象包含112个类型为line, patch的对象。这些对象表示目标、期望。

可视化的路径

可视化UAV通过环境的路径。

图(3)plot3(状态(:,2),状态(:1),状态(:,3)标题(“无人机路径”)包含(“东(m)”) ylabel (“北(m)”) zlabel (“高度(米)

图中包含一个轴对象。标题为UAV Path的axis对象包含一个类型为line的对象。

Baidu
map