Bin_Point
效果
基本思路
- 按照高度信息将点云分为三类
- 将每一类都放到一个通道
- 获取到一个点则相应三通道矩阵的位置++
- 所以得到一个三通道的矩阵 包含空间位置信息和在高度三个层出现的次数
实现流程
- 输入(256,256,1)的depth img
- 分割出空间点云矩阵(256,256,3)三个通道分别代表X Y Z信息
- 根据高度信息将Z的数据归类到0 1 2 0代表底层 1代表中间层 2代表高层
- 将(256,256,3)转化为(1201,1201,3)的全局地图信息 转换过程使用np.bincount
代码实现
def bin_points(XYZ_cms, map_size, z_bins, xy_resolution):
"""Bins points into xy-z bins
XYZ_cms is ... x H x W x3
Outputs is ... x map_size x map_size x (len(z_bins)+1)
"""
sh = XYZ_cms.shape
XYZ_cms = XYZ_cms.reshape([-1, sh[-3], sh[-2], sh[-1]])
n_z_bins = len(z_bins)+1
counts = []
isvalids = []
for XYZ_cm in XYZ_cms:
isnotnan = np.logical_not(np.isnan(XYZ_cm[:,:,0]))
X_bin = np.round(XYZ_cm[:,:,0] / xy_resolution).astype(np.int32)
Y_bin = np.round(XYZ_cm[:,:,1] / xy_resolution).astype(np.int32)
Z_bin = np.digitize(XYZ_cm[:,:,2], bins=z_bins).astype(np.int32)
isvalid = np.array([X_bin >= 0, X_bin < map_size, Y_bin >= 0, Y_bin < map_size,
Z_bin >= 0, Z_bin < n_z_bins, isnotnan])
isvalid = np.all(isvalid, axis=0)
ind = (Y_bin * map_size + X_bin) * n_z_bins + Z_bin
ind[np.logical_not(isvalid)] = 0
'''
我们可以看到x中最大的数为7,因此bin的数量为8,那么它的索引值为0->7
x = np.array([0, 1, 1, 3, 2, 1, 7])
索引0出现了1次,索引1出现了3次......索引5出现了0次......
np.bincount(x)
因此,输出结果为:array([1, 3, 1, 1, 0, 0, 0, 1])
如果minlength被指定,那么输出数组中bin的数量至少为它指定的数
'''
count = np.bincount(ind.ravel(), isvalid.ravel().astype(np.int32),
minlength=map_size*map_size*n_z_bins)
count = np.reshape(count, [map_size, map_size, n_z_bins])
counts.append(count)
isvalids.append(isvalid)
counts = np.array(counts).reshape(list(sh[:-3]) + [map_size, map_size, n_z_bins])
isvalids = np.array(isvalids).reshape(list(sh[:-3]) + [sh[-3], sh[-2], 1])
return counts, isvalids
函数讲解
Z_bin = np.digitize(XYZ_cm[:,:,2], bins=z_bins).astype(np.int32)
'''
我们可以看到x中最大的数为7,因此bin的数量为8,那么它的索引值为0->7
x = np.array([0, 1, 1, 3, 2, 1, 7])
索引0出现了1次,索引1出现了3次......索引5出现了0次......
np.bincount(x)
因此,输出结果为:array([1, 3, 1, 1, 0, 0, 0, 1])
如果minlength被指定,那么输出数组中bin的数量至少为它指定的数
'''
count = np.bincount(ind.ravel(), isvalid.ravel().astype(np.int32),
minlength=map_size*map_size*n_z_bins)
障碍判断
- obstacle 会在转化回来的Map(即count)的第一高度层判断是否叠加大于2
self.map = self.map + count(上文所得)
obstacle = self.map[:,:,1] >= 2
torch.scatter
基本思路
- 此处Z指向深度 Y指向高度 X指向左右
- 将rgb-d图像放进一个cnn得到 img-feature
- 将原来depth img下采样对应 img-feature的大小
- 将subsample depth img 转化为全局地图的点云
- 故地图信息为img-feature
代码实现
函数详解
有了地图信息机器人就需要路径规划到达目标点