【发布时间】:2017-08-08 01:44:43
【问题描述】:
我正在使用 MATLAB 打印我的仿真结果。结果涉及无人机的轨迹和无人机必须访问的航路点。无人机应该配备一个摄像头,其范围视图为 10x10。现在,该图将无人机的轨迹显示为一条访问航路点的线。是否可以显示相机的足迹,而不是实际轨迹?我希望它绘制矩形相机的视图以显示该区域的详尽覆盖范围。可以选择将点绘制为正方形、十字形或圆形,但是否可以设置这些点的边界?
提前谢谢你
【问题讨论】:
我正在使用 MATLAB 打印我的仿真结果。结果涉及无人机的轨迹和无人机必须访问的航路点。无人机应该配备一个摄像头,其范围视图为 10x10。现在,该图将无人机的轨迹显示为一条访问航路点的线。是否可以显示相机的足迹,而不是实际轨迹?我希望它绘制矩形相机的视图以显示该区域的详尽覆盖范围。可以选择将点绘制为正方形、十字形或圆形,但是否可以设置这些点的边界?
提前谢谢你
【问题讨论】:
使用标记大小来指示范围视图的问题在于,您的航点的数据单位与标记大小之间没有直接关系。换句话说,标记大小的值10 并不一定意味着方形标记的一侧将是 10 个数据单位长(由轴的缩放和限制定义)。
另一种方法是在补丁与无人机轨迹对齐的每个航点处绘制正方形 patches。以下是您可以执行此操作的方法:
% Generate some sample data:
N = 20; % Number of waypoints
x = cumsum(5.*rand(1, N)); % X coordinates of UAV
y = cumsum(5.*rand(1, N)); % Y coordinates of UAV
% Compute vectors parallel and perpendicular to the trajectory at each point:
v = [diff(x); diff(y); zeros(1, N-1)]; % Vectors (1 per column)
v = bsxfun(@rdivide, v, sqrt(sum(v.^2, 1))); % Normalize each column to a unit vector
v = v(:, [1 1:end]); % Replicate a vector for starting point
vCross = cross(v, [zeros(2, N); ones(1, N)]); % Perpendicular vector
% Generate patch coordinates:
R = 10; % Range view
xPatch = [x+(R/2).*(v(1, :)+vCross(1, :)); ...
x+(R/2).*(v(1, :)-vCross(1, :)); ...
x-(R/2).*(v(1, :)+vCross(1, :)); ...
x-(R/2).*(v(1, :)-vCross(1, :))];
yPatch = [y+(R/2).*(v(2, :)+vCross(2, :)); ...
y+(R/2).*(v(2, :)-vCross(2, :)); ...
y-(R/2).*(v(2, :)+vCross(2, :)); ...
y-(R/2).*(v(2, :)-vCross(2, :))];
% Plot the patches and trajectory:
patch(xPatch, yPatch, [0 0.3 0], 'FaceAlpha', 0.25, 'EdgeColor', 'none');
hold on;
plot(x, y, '-', 'Color', [0.8 0 0], 'Marker', '.', 'MarkerSize', 12);
axis equal;
这是一个示例图:
【讨论】:
作为第一次尝试,您可以将标记形状指定为正方形并设置恒定的标记大小,例如
plot(x,y,'s','markersize',10)
这里的x 和y 是向量,包含无人机坐标。字母's'设置标记形状为正方形,大小设置为10。
实际上,无人机轨迹是在 3D 空间中定义的,其中不同的离地高度对应于不同的足迹大小和形状。考虑到这一点需要更多的努力。
这还假设点的间距足够近,否则标记之间会有空白区域。
【讨论】: