Пример API камеры ZED - причина таинственной ошибки Segfault / mutex_lock - PullRequest
0 голосов
/ 06 марта 2020

Я использую Ubuntu 18.04 и python 3.6.9 для запуска примера с дистанционным зондированием, который включен в репозиторий Github от Stereo Labs. Программа работает хорошо, но затем по какой-то причине она всегда заканчивается либо с segfault, либо с

python3: pthread_mutex_lock.c:425: __pthread_mutex_lock_full: Assertion `INTERNAL_SYSCALL_ERRNO (e, __err) != ESRCH || !robust' failed.  
Aborted (core dumped)

Я достаточно знаком с программированием, чтобы знать, что segfaults связано с неправильным выделением памяти, и с Насколько я знаю, в этом примере нет проблем (особенно потому, что он находится в python, где сборщик мусора обрабатывает память самостоятельно). Я менее знаком с механизмом блокировки мьютекса и был бы признателен за объяснение того, что это влечет за собой Код из примера приведен ниже:

import pyzed.sl as sl
import math
import numpy as np
import sys, gc

def main():
    # Create a Camera object
    zed = sl.Camera()

    # Create a InitParameters object and set configuration parameters
    init_params = sl.InitParameters()
    init_params.depth_mode = sl.DEPTH_MODE.PERFORMANCE  # Use PERFORMANCE depth mode
    init_params.coordinate_units = sl.UNIT.MILLIMETER  # Use milliliter units (for depth measurements)

    # Open the camera
    err = zed.open(init_params)
    if err != sl.ERROR_CODE.SUCCESS:
        exit(1)

    # Create and set RuntimeParameters after opening the camera
    runtime_parameters = sl.RuntimeParameters()
    runtime_parameters.sensing_mode = sl.SENSING_MODE.STANDARD  # Use STANDARD sensing mode

    # Capture 50 images and depth, then stop
    i = 0
    image = sl.Mat()
    depth = sl.Mat()
    point_cloud = sl.Mat()

    mirror_ref = sl.Transform()
    mirror_ref.set_translation(sl.Translation(2.75,4.0,0))
    tr_np = mirror_ref.m

    while i < 50:
        # A new image is available if grab() returns SUCCESS
        if zed.grab(runtime_parameters) == sl.ERROR_CODE.SUCCESS:
            # Retrieve left image
            zed.retrieve_image(image, sl.VIEW.LEFT)
            # Retrieve depth map. Depth is aligned on the left image
            zed.retrieve_measure(depth, sl.MEASURE.DEPTH)
            # Retrieve colored point cloud. Point cloud is aligned on the left image.
            zed.retrieve_measure(point_cloud, sl.MEASURE.XYZRGBA)

            # Get and print distance value in mm at the center of the image
            # We measure the distance camera - object using Euclidean distance
            x = round(image.get_width() / 2)
            y = round(image.get_height() / 2)
            err, point_cloud_value = point_cloud.get_value(x, y)

            distance = math.sqrt(point_cloud_value[0] * point_cloud_value[0] +
                                 point_cloud_value[1] * point_cloud_value[1] +
                                 point_cloud_value[2] * point_cloud_value[2])

            point_cloud_np = point_cloud.get_data()
            point_cloud_np.dot(tr_np)

            if not np.isnan(distance) and not np.isinf(distance):
                distance = round(distance)
                print("Distance to Camera at ({0}, {1}): {2} mm\n".format(x, y, distance))
                # Increment the loop
                i = i + 1
            #else:
            #    print("Can't estimate distance at this position, move the camera\n")
            sys.stdout.flush()
            gc.collect() #I added this in as a potential solve--problem persists

    # Close the camera
    zed.close()
    gc.collect() #I added this in as a potential solve--problem persists
if __name__ == "__main__":
    main()
    print("ZED has been closed")
    gc.collect() #I added this in as a potential solve--problem persists
...