无法使用 libuvc 移动相机

Cannot move camera using libuvc

我正在尝试使用 libuvc 控制我的相机。 我尝试了从 the example:

修改的这段代码
#include <libuvc/libuvc.h>
#include <stdio.h>
#include <unistd.h>

int main() {
  uvc_context_t *ctx;
  uvc_device_t *dev;
  uvc_device_handle_t *devh;
  uvc_stream_ctrl_t ctrl;
  uvc_error_t res;

  /* Initialize a UVC service context. Libuvc will set up its own libusb
   * context. Replace NULL with a libusb_context pointer to run libuvc
   * from an existing libusb context. */
  res = uvc_init(&ctx, NULL);
  if (res < 0) {
    uvc_perror(res, "uvc_init");
    return res;
  }
  puts("UVC initialized");


  /* Locates the first attached UVC device, stores in dev */
  res = uvc_find_device(
      ctx, &dev,
      0, 0, NULL); /* filter devices: vendor_id, product_id, "serial_num" */
  if (res < 0) {
    uvc_perror(res, "uvc_find_device"); /* no devices found */
  } else {
    puts("Device found");
    /* Try to open the device: requires exclusive access */
    res = uvc_open(dev, &devh);
    if (res < 0) {
      uvc_perror(res, "uvc_open"); /* unable to open device */
    } else {
      puts("Device opened");
      
      uvc_print_diag(devh, stderr);

      //uvc_set_pantilt_abs(devh, 100, 100);
      int result = uvc_set_pantilt_abs(devh, 5, 50);
      printf("%d\n", result);
      //sleep(5);

      /* Release our handle on the device */
      uvc_close(devh);
      puts("Device closed");
    }
    /* Release the device descriptor */
    uvc_unref_device(dev);
  }

  /* Close the UVC context. This closes and cleans up any existing device handles,
   * and it closes the libusb context if one was not provided. */
  uvc_exit(ctx);
  puts("UVC exited");
  return 0;
}

我尝试了 uvc_set_pantilt_absuvc_set_pantilt_rel 并且都返回 0 所以这意味着操作成功。除了相机不动。

我确定相机使用的是 UVC,因为 uvc_print_diag 表示

VideoControl: 
        bcdUVC: 0x0110

我做错了什么吗?如果不是,我该如何解决?

我刚才找到了答案,但忘了放在这里。

我偶然发现了 this project,它使用带有 libuvc 的命令行工具来控制相机。

玩了一会儿并将其与我的代码进行比较后,我明白了我做错了什么。他正在从摄像头获取倾斜数据,然后用它来发送请求。看来相机需要接收一个数字,该数字必须是相机作为移动单位提供的“步长”的倍数。

这是他要求提供内裤信息的部分:

int32_t pan;
int32_t panStep;
int32_t panMin;
int32_t panMax;
int32_t tilt;
int32_t tiltStep;
int32_t tiltMin;
int32_t tiltMax;

// get current value
errorCode = uvc_get_pantilt_abs(devh, &pan, &tilt, UVC_GET_CUR);
handleError(errorCode, "Failed to read pan/tilt settings - possibly unsupported by this camera?\n");

// get steps
errorCode = uvc_get_pantilt_abs(devh, &panStep, &tiltStep, UVC_GET_RES);
handleError(errorCode, "Failed to read pan/tilt settings - possibly unsupported by this camera?\n");

// get min
errorCode = uvc_get_pantilt_abs(devh, &panMin, &tiltMin, UVC_GET_MIN);
handleError(errorCode, "Failed to read pan/tilt settings - possibly unsupported by this camera?\n");

// get max
errorCode = uvc_get_pantilt_abs(devh, &panMax, &tiltMax, UVC_GET_MAX);
handleError(errorCode, "Failed to read pan/tilt settings - possibly unsupported by this camera?\n");

这里是the full code