0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ZED SDK でspatial-mappingを使う

Last updated at Posted at 2024-06-24

想定する読者

stereolabsのzed2, zed mini, zed x などのステレオカメラの利用者
いまどきのステレオカメラは何ができるのかを知りたい人

前提

ZED SDK 4.1
Ubuntu 20.04
ZED2i
Python 版のAPI

使い方

python3 spatial_mapping.py -h
usage: spatial_mapping.py [-h] [--input_svo_file INPUT_SVO_FILE] [--ip_address IP_ADDRESS] [--resolution RESOLUTION] [--build_mesh]

optional arguments:
  -h, --help            show this help message and exit
  --input_svo_file INPUT_SVO_FILE
                        Path to an .svo file, if you want to replay it
  --ip_address IP_ADDRESS
                        IP Adress, in format a.b.c.d:port or a.b.c.d, if you have a streaming setup
  --resolution RESOLUTION
                        Resolution, can be either HD2K, HD1200, HD1080, HD720, SVGA or VGA
  --build_mesh          Either the script should plot a mesh or point clouds of surroundings

spatial_mapping.py を実行する。

cd zed-sdk/spatial mapping/spatial mapping/python

python3 spatial_mapping.py
Press on 'Space' to enable / disable spatial mapping
Disable the spatial mapping after enabling it will output a .obj mesh file
[2024-06-19 02:28:03 UTC][ZED][INFO] init
Mesh saved under mesh_gen.obj

meshlab mesh_gen.obj

出力ファイル

--build_mesh を指定したときに得られるファイル。

mesh_gen.obj
mesh_gen_material0000_map_Kd.png
mesh_gen.mtl

mtl: マテリアル テンプレート ライブラリ
mesh_gen_material0000_map_Kd.png: メッシュと対応付けられた範囲のRGBデータ。(3チャネル)

--build_mesh を指定しないときに得られるファイル。

mesh_gen.obj
点群だけが得られる

なぜspatial mappingを使うのか

  • 単一のフレームでの点群の精度は高くない。

SPATIAL_MAP_TYPE 型


FUSED_POINT_CLOUD: SPATIAL_MAP_TYPE.FUSED_POINT_CLOUD
  pymesh = sl.FusedPointCloud() を用意する。
点群なので、surfaceデータを持たない。
MESH: SPATIAL_MAP_TYPE.MESH
 pymesh = sl.Mesh() を用意する。
メッシュなので、三角形が基本でsurfaceデータを持つ。

MAPPING_RESOLUTION 型


HIGH: MAPPING_RESOLUTION.HIGH
LOW: MAPPING_RESOLUTION.LOW
MEDIUM: MAPPING_RESOLUTION.MEDIUM

MAPPING_RANGE 型


AUTO: MAPPING_RANGE.AUTO
LONG: MAPPING_RANGE.LONG
MEDIUM: MAPPING_RANGE.MEDIUM
SHORT: MAPPING_RANGE.SHORT

MAPPING_RANGE::NEAR: integrates depth up to 3.5 meters.
MAPPING_RANGE::MEDIUM: integrates depth up to 5 meters.
MAPPING_RANGE::FAR: integrates depth up to 10 meters.

https://www.stereolabs.com/docs/spatial-mapping/using-mapping#adjusting-range
ドキュメントの乖離が生じている。

SpatialMappingParameters クラス

メソッド
get_range_preset()
get_recommended_range()
get_resolution_preset()
load()
save()
set_range()
set_resolution()

データメンバー
allowed_range: [ 2. 20.]
allowed_resolution: [0.01 0.2 ]
map_type: SPATIAL_MAP_TYPE.FUSED_POINT_CLOUD
max_memory_usage: 2048
range_meter: 0.0
resolution_meter: 0.019999999552965164
reverse_vertex_order: False
save_texture: False
stability_counter: 0.0
use_chunk_only: True

import pysed.sl as sl
help(sl.SpatialMappingParameters)

と入力することで、このクラスのドキュメントを読むことができる。

class SpatialMappingParameters(builtins.object)
 |  Methods defined here:
 |  
 |  __reduce__ = __reduce_cython__(...)
 |      SpatialMappingParameters.__reduce_cython__(self)
 |  
 |  __setstate__ = __setstate_cython__(...)
 |      SpatialMappingParameters.__setstate_cython__(self, __pyx_state)
 |  
 |  get_range_preset(self, mapping_range=<MAPPING_RANGE.AUTO: 3>) -> 'float'
 |      SpatialMappingParameters.get_range_preset(self, mapping_range=MAPPING_RANGE.AUTO) -> float
 |  
 |  get_recommended_range(self, resolution, py_cam: 'Camera') -> 'float'
 |      SpatialMappingParameters.get_recommended_range(self, resolution, Camera py_cam: Camera) -> float
 |  
 |  get_resolution_preset(self, resolution=<MAPPING_RESOLUTION.HIGH: 0>) -> 'float'
 |      SpatialMappingParameters.get_resolution_preset(self, resolution=MAPPING_RESOLUTION.HIGH) -> float
 |  
 |  load(self, filename: 'str') -> 'bool'
 |      SpatialMappingParameters.load(self, str filename: str) -> bool
 |  
 |  save(self, filename: 'str') -> 'bool'
 |      SpatialMappingParameters.save(self, str filename: str) -> bool
 |  
 |  set_range(self, mapping_range=<MAPPING_RANGE.AUTO: 3>) -> 'None'
 |      SpatialMappingParameters.set_range(self, mapping_range=MAPPING_RANGE.AUTO) -> None
 |  
 |  set_resolution(self, resolution=<MAPPING_RESOLUTION.HIGH: 0>) -> 'None'
 |      SpatialMappingParameters.set_resolution(self, resolution=MAPPING_RESOLUTION.HIGH) -> None
 |  
 |  ----------------------------------------------------------------------
 |  Static methods defined here:
 |  
 |  __new__(*args, **kwargs) from builtins.type
 |      Create and return a new object.  See help(type) for accurate signature.
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |  
 |  allowed_range
 |      SpatialMappingParameters.allowed_range: np.array[float]
 |  
 |  allowed_resolution
 |      SpatialMappingParameters.allowed_resolution: np.array[float]
 |  
 |  map_type
 |      SpatialMappingParameters.map_type: SPATIAL_MAP_TYPE
 |  
 |  max_memory_usage
 |      SpatialMappingParameters.max_memory_usage: int
 |  
 |  range_meter
 |      SpatialMappingParameters.range_meter: float
 |  
 |  resolution_meter
 |      SpatialMappingParameters.resolution_meter: float
 |  
 |  reverse_vertex_order
 |      SpatialMappingParameters.reverse_vertex_order: bool
 |  
 |  save_texture
 |      SpatialMappingParameters.save_texture: bool
 |  
 |  stability_counter
 |      SpatialMappingParameters.stability_counter: int
 |  
 |  use_chunk_only
 |      SpatialMappingParameters.use_chunk_only: bool

まだ十分には理解できていないこと

  • 着目領域を絞り込んで点群・メッシュを得る方法
  • カメラを移動させて、物体をいろんな側面から見てモデルを作る方法
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?