# ZED Spatial Mapping ###### tags: `視覺組` > [name=沈尚緯(m4xshen@gmail.com)] ## obj file ZED可以利用拍攝到的景象建立場景並輸出成`.obj`檔 `.obj`檔案內容格式: - vertex 頂點 ```objectivec v -2.800000 0.050000 -1.744223 ``` - vertex normal 頂點法線 ```objectivec vn 0.551215 0.202074 0.809523 ``` - face 面 ```objectivec f 22072 22073 22074 ``` ## types of spatial map there are 2 types of spatial map: - fused point cloud (a set of 3d points) - `obj` file includes v, vn - mesh (a set of triangles) - `obj` file includes v, vn, f ## one-time mapping 擷取1000個frame並建立point cloud場景: ```python= import pyzed.sl as sl def main(): # Create a ZEDCamera object zed = sl.Camera() # Create a InitParameters object and set configuration parameters init_params = sl.InitParameters() init_params.camera_resolution = sl.RESOLUTION.HD720 # Use HD720 video mode (default fps: 60) # Use a right-handed Y-up coordinate system init_params.coordinate_system = sl.COORDINATE_SYSTEM.RIGHT_HANDED_Y_UP init_params.coordinate_units = sl.UNIT.METER # Set units in meters # Open the camera err = zed.open(init_params) if err != sl.ERROR_CODE.SUCCESS: exit(1) # Enable positional tracking with default parameters. # Positional tracking needs to be enabled before using spatial mapping py_transform = sl.Transform() tracking_parameters = sl.PositionalTrackingParameters(_init_pos=py_transform) err = zed.enable_positional_tracking(tracking_parameters) if err != sl.ERROR_CODE.SUCCESS: exit(1) # Enable spatial mapping mapping_parameters = sl.SpatialMappingParameters(map_type=sl.SPATIAL_MAP_TYPE.FUSED_POINT_CLOUD) err = zed.enable_spatial_mapping(mapping_parameters) if err != sl.ERROR_CODE.SUCCESS: exit(1) # Grab data during 1000 frames i = 0 py_fpc = sl.FusedPointCloud() # py_fpc = sl.Mesh() # Create a Mesh object runtime_parameters = sl.RuntimeParameters() while i < 1000: # For each new grab, mesh data is updated if zed.grab(runtime_parameters) == sl.ERROR_CODE.SUCCESS: # In the background, spatial mapping will use newly retrieved images, depth and pose to update the mesh mapping_state = zed.get_spatial_mapping_state() print("\rImages captured: {0} / 1000 || {1}".format(i, mapping_state)) i = i + 1 print("\n") # Extract, filter and save the mesh in an obj file print("Extracting Point Cloud...\n") err = zed.extract_whole_spatial_map(py_fpc) print(repr(err)) print("Saving Point Cloud...\n") py_fpc.save("fpc.obj") # Disable tracking and mapping and close the camera zed.disable_spatial_mapping() zed.disable_positional_tracking() zed.close() if __name__ == "__main__": main() ``` ## continuous mapping [official document](https://www.stereolabs.com/docs/spatial-mapping/using-mapping/#continuous-mapping) > Requesting and retrieving a spatial map is resource-intensive. To improve performance, do not request a new spatial map too frequently. 擷取1000個frame並建立mesh場景,每隔100 frames輸出一次obj檔: <img src="https://i.imgur.com/wF0aN6H.png" width=400 > <img src="https://i.imgur.com/cH96qwL.png" width=400 > <img src="https://i.imgur.com/zuT1TfX.png" width=400 > ```python= import pyzed.sl as sl def main(): # Create a ZEDCamera object zed = sl.Camera() # Create a InitParameters object and set configuration parameters init_params = sl.InitParameters() init_params.camera_resolution = sl.RESOLUTION.HD720 # Use HD720 video mode (default fps: 60) # Use a right-handed Y-up coordinate system init_params.coordinate_system = sl.COORDINATE_SYSTEM.RIGHT_HANDED_Y_UP init_params.coordinate_units = sl.UNIT.CENTIMETER # Set units # Open the camera err = zed.open(init_params) if err != sl.ERROR_CODE.SUCCESS: exit(1) # Enable positional tracking with default parameters. # Positional tracking needs to be enabled before using spatial mapping py_transform = sl.Transform() tracking_parameters = sl.PositionalTrackingParameters(_init_pos=py_transform) err = zed.enable_positional_tracking(tracking_parameters) if err != sl.ERROR_CODE.SUCCESS: exit(1) # Enable spatial mapping mapping_parameters = sl.SpatialMappingParameters(map_type=sl.SPATIAL_MAP_TYPE.FUSED_POINT_CLOUD) err = zed.enable_spatial_mapping(mapping_parameters) if err != sl.ERROR_CODE.SUCCESS: exit(1) # Grab data during 1000 frames i = 0 # py_fpc = sl.FusedPointCloud() py_fpc = sl.Mesh() # Create a Mesh object runtime_parameters = sl.RuntimeParameters() while i < 10000: # For each new grab, mesh data is updated if zed.grab(runtime_parameters) == sl.ERROR_CODE.SUCCESS: # In the background, spatial mapping will use newly retrieved images, depth and pose to update the mesh mapping_state = zed.get_spatial_mapping_state() # print("Images captured: {0} || {1}\n".format(i, mapping_state)) if i % 100 == 0: zed.request_spatial_map_async() if zed.get_spatial_map_request_status_async() == sl.ERROR_CODE.SUCCESS and i > 0 : zed.retrieve_spatial_map_async(py_fpc) err = zed.extract_whole_spatial_map(py_fpc) print(repr(err)) print("Saving Point Cloud...\n") py_fpc.save("fpc" + str(i) + ".obj") i = i + 1 # Disable tracking and mapping and close the camera zed.disable_spatial_mapping() zed.disable_positional_tracking() zed.close() if __name__ == "__main__": main() ``` https://github.com/stereolabs/zed-ros-examples/tree/master/examples/zed_rtabmap_example