【问题标题】:How could I resize my obstacles to be big when I enlarge my grid?当我扩大我的网格时,如何将我的障碍物调整得很大?
【发布时间】:2020-01-10 18:49:55
【问题描述】:

我正在尝试为无人机实现 3D 环境,并且随机分布了具有随机高度的障碍物。每次跑步时障碍物的位置和高度都会不同。我的问题是当我给我的网格设置 10*10 大小时,它会很好地工作并且障碍物的大小是可以接受的,但是当我将我的网格设置为例如 50*50 时,障碍物会太小并且图像不清楚。我该如何解决障碍物的大小问题?如何放大它们,但在放大网格时不会使单元格干扰?

10*10网格尺寸以下

50*50以下网格尺寸 我在 python 中的尝试

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import axes3d
import random
import matplotlib.colors as colors
import matplotlib.cm as cm

def display(elev_mp1, drone_height, risk_zone):
    fig = plt.figure()
    ax = fig.add_subplot(111,projection='3d')

    ax.plot([0],[0],[0])
    ax.plot([0],[0],[1000])

    #x = np.linspace(0,len(elev_mp1),len(elev_mp1)+1)
    #y = np.linspace(0,len(elev_mp1),len(elev_mp1)+1)
    #X,Y = np.meshgrid(x,y)
    #z = np.array([[0 for x in range(len(X[0]))]    for y in range(len(X))])

    num_bars = len(elev_mp1)*len(elev_mp1[0])
    x_pos = []
    y_pos = []

    for x in range(len(elev_mp1[0])):
        for y in range(len(elev_mp1)):
            x_pos.append(x)
            y_pos.append(y)
    z_pos = [0] * num_bars
    x_size = np.ones(num_bars)
    y_size = np.ones(num_bars)
    z_size = np.array(elev_mp1).flatten()

    color_values = []

    for x in z_size:
        if x >= drone_height:
            color_values.append([0,0,0,1])
        elif x in risk_zone:
            color_values.append([1,0,0,1])
        else:
            color_values.append([1,0,1,1])

    ax.bar3d(x_pos, y_pos, z_pos, x_size, y_size, z_size, color=color_values)

    #ax.plot_wireframe(X,Y,z)
    plt.show()

x = [[random.uniform(0,1) for i in range(10)]for j in range(10)]
elev_mp1 = np.array([[0 for i in range(len(x[0]))]for j in range(len(x))])

for i in range(len(x)):
    for j in range(len(x[0])):
        if x[i][j] <= 0.96:
            elev_mp1[i][j] = 0
        else:
            elev_mp1[i][j] = 1
drone_height = 60

risk_zone = [x for x in range(40,60)]

for x in range(len(elev_mp1)):
    for y in range(len(elev_mp1[0])):
        if elev_mp1[x][y] == 1:
            elev_mp1[x][y] = random.randint(1,100)
        else:
            elev_mp1[x][y] = 0

display(elev_mp1, drone_height, risk_zone)

【问题讨论】:

    标签: python python-3.x matplotlib 3d


    【解决方案1】:

    IIUC 障碍物的 x 和 y 大小由常量 1 定义,即由 np.ones(num_bars) 定义。

    我假设您通过使用 range(10) 硬编码设置网格大小,但是当您希望通过例如缩放障碍物时x 和 y 中的因子 5,您可以简单地将这个因子添加到大小数组的定义行:

    a = 5    # or however you want to create/control this factor in your program
    
    x_size = a * np.ones(num_bars)
    y_size = a * np.ones(num_bars)
    

    也许你应该考虑例如将网格大小设置为可变参数,将障碍物大小设置为它的一小部分,因此一旦您更改网格大小,它就会自动缩放。

    (顺便说一句:如果你有方形障碍物,你可以留下第二个大小变量并使用例如size = a * np.ones(num_bars) 用于两个方向......)

    【讨论】:

    • 我在这里设置了我的网格大小 x = [[random.uniform(0,1) for i in range(10)]for j in range(10)] 在这一行中。
    • 亲爱的你是什么意思(你可以留下第二个大小变量并使用例如 size = a * np.ones(num_bars) 用于两个方向,如果你有平方障碍物)。我该怎么做?
    • 没错,通过将10 硬编码到这一行。在脚本的开头设置一个参数grid_size = 10,相应地用它替换10s,并定义你的障碍物大小,例如x_size = .1*grid_size * np.ones(num_bars).
    • 使用 你可以留下第二个尺寸变量... 我的意思是:如果你的障碍物在 x 中的尺寸与在 y 中的尺寸相同 - 你可以 只需为两者定义一个大小变量,例如width = .1*grid_size * np.ones(num_bars)。然后在您的 barplot 命令中使用 x 和 y kwargs:ax.bar3d(x_pos, y_pos, z_pos, width, width, z_size, color=color_values)
    • 好主意,但这不会与我在循环中的网格大小相矛盾吗? x = [[random.uniform(0,1) for i in range(10)]for j in range(10)]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 2015-07-20
    • 1970-01-01
    • 2021-06-27
    相关资源
    最近更新 更多