578

阿木币

1

精华

1451 小时

在线时间

管理员

Rank: 9Rank: 9Rank: 9

发表于 2023-11-9 14:17:24 2052 浏览 0 回复

一文教你如何利用SpireCV进行吊舱控制,实现目标检测及跟踪

功能概述
SpireCV-SDK是一个专为智能无人系统打造的边缘实时感知SDK库,可以实现吊舱控制功能,控制无人机的相机和吊舱,包括拍照、录像、推流等功能,可以保存视频保存和推流,以及完成目标检测、识别与跟踪功能等。本文将详细讲述如何利用SpireCV进行吊舱控制。
注:
可控制Amov的吊舱产品,如G1、Q10等,具体功能实现详情,请在公众号内搜索相关文章或者关注阿木实验室官网。

1.png

使用说明
1、方位角定义
在不同的吊舱之间,姿态的表示方式有所差异,因此我们对其进行了统一。
采用欧拉角的方式表示吊舱的姿态信息,当视线与镜头方向相同时,定义如下:
  • roll:横滚,逆时针为正
  • pitch:俯仰,向下为正
  • yaw:偏航,向左为正


如下图所示,箭头方向为正方向:
微信图片_20231109141309.png
2、如何初始化吊舱
(1)吊舱状态读取函数
吊舱的状态通过回调函数进行读取,用户可选用默认函数或指定自行编码的函数。状态获取回调函数范式如下(默认函数):
  1. void gimableCallback(double &frame_ang_r, double &frame_ang_p, double &frame_ang_y,
  2. double &imu_ang_r, double &imu_ang_p, double &imu_ang_y,
  3. double &fov_x, double &fov_y)
  4. {
  5. }
复制代码
注:
imu_ang_r:IMU横滚角度,值域:(-60, 60) <单位degree>;imu_ang_p:IMU俯仰角度,值域:(-135, 135) <单位degree>;
imu_ang_y:IMU偏航角度,值域:(-150, 150)<单位degree>;
rotor_ang_r:电机横滚角度,值域:(-60, 60) <单位degree>;
rotor_ang_p:电机俯仰角度,值域:(-135, 135)<单位degree>;
rotor_ang_y:电机偏航角度,值域:(-150, 150) <单位degree>;
fov_x:相机横向视野角度,根据不同相机不同焦距变化 <单位degree>;
fov_y:相机纵向视野角度,根据不同相机不同焦距变化 <单位degree>。


3、构造函数
用户在构造函数中指定吊舱的型号以及所使用的控制端口类型。
提供缺省调用,此时默认参数:
  1. sv::GimbalType::G1;
  2. sv::GimbalLink::SERIAL;
  3. Gimbal(GimbalType gtype , GimbalLink ltype)。
复制代码
注:
gtype:吊舱的型号。参见类型 sv::GimbalType。
ltype:吊舱使用控制端口类型。参见类型 sv::GimbalLink。


吊舱控制端口配置
考虑到与吊舱的通信存在多种不同的参数,因此预留有通信端口配置函数,但是注意,需要在吊舱开启前配置完成,即open()函数调用前。
  • 串口
  • 设置串口名

  1. void setSerialPort(const std::string &port);
复制代码



  • port:设备串口名,默认值 dev/ttyUSB0

注:
windows中串口设备名通常为 *`COMx`*;Linux中通常为 *`dev/ttyUSBx`* 。



  • 设置串口波特率

  1. void setSerialPort(const int baud_rate);
复制代码


  • baud_rate:串口通信波特率,默认值 115200
  • 设置串口常用配置

  1. void setSerialPort(GimablSerialByteSize byte_size,
  2. GimablSerialParity parity,
  3. GimablSerialStopBits stop_bits,
  4. GimablSerialFlowControl flowcontrol,
  5. int time_out = 500);
复制代码


  • byte_size:数据位长度,默认值:

  1. sv::GimablSerialByteSize::EIGHT_BYTES
复制代码


  • parity:校验方式,默认值:

  1. sv::GimablSerialParity::PARITY_NONE
复制代码


  • stop_bits:停止位长度,默认值:

  1. sv::GimablSerialStopBits::STOPBITS_ONE
复制代码


  • flowcontrol:流控方式,默认值:

  1. sv::GimablSerialFlowControl::FLOWCONTROL_NONE
复制代码


  • time_out :串口超时时间,<单位ms>,默认值 500
  • 网口
  • 设置IP地址

  1. void setNetIp(const std::string &ip);
复制代码


  • ip:吊舱网络控制IP地址;默认值 "192.168.2.64"
  • 设置端口号

  1. void setNetPort(const int &port);
复制代码


  • port:吊舱网络控制端口号,默认值 9090。



开启吊舱控制
用户完成配置后可通过该函数开启吊舱的控制功能。
提供缺省调用,此时默认参数sv::emptyCallback。
  1. bool open(PStateInvoke callback);
复制代码

  • callback:指定的状态获取回调函数


推荐吊舱实例化过程
在开始使用吊舱控制功能前,用户需要对吊舱参数进行配置,随后调用open()函数启用吊舱的控制功能。推荐的流程如下,以G1吊舱为例:
  1. #include <sv_gimbal.h>
  2. sv::Gimbal *gimbal;
  3. gimbal=newsv::Gimbal(sv::GimbalType::G1, sv::GimbalLink::SERIAL);//使用串口初始化吊舱控制
  4. gimbal->setSerialPort("/dev/ttyUSB0");//使用*/dev/ttyUSB0*作为控制串口
  5. if(gimbal->open(gimableCallback))//使用名为gimableCallback函数作为状态读取函数
  6. {
  7. std::cout << "gimbal open failed" << std::endl;
  8. exit(1);
  9. };
复制代码

当吊舱支持网络控制时,可按以下方式配置成网络配置模式G1不支持网络控制,此处仅作为演示示例)
  1. #include <sv_gimbal.h>
  2. sv::Gimbal *gimbal;
  3. gimbal = new sv::Gimbal(sv::GimbalType::G1, sv::GimbalLink::ETHERNET_TCP);//使用TCP协议初始化吊舱控制
  4. gimbal->setNetIp("192.168.1.1");//云台控制IP地址*192.168.1.1*
  5. gimbal->setNetPort(8080);//使用8080端口
  6. if(gimbal->open(gimableCallback))//使用名为*gimableCallback*函数作为状态读取函数
  7. {
  8. std::cout << "gimbal open failed" << std::endl;
  9. exit(1);
  10. };
复制代码




如何控制吊舱
  • 更改状态获取回调函数

用户可通过该函数修改此前已设置的状态获取回调函数。该函数可在吊舱运行期间使用,但不建议,可能导致数据损坏。
  1. void setStateCallback(PStateInvoke callback);
复制代码
  • callback:指定的状态获取回调函数。
  • 吊舱角度控制

用户可通过该函数控制吊舱运动至指定的姿态,以欧拉角表示。
  1. void setAngleEuler(double roll,double pitch,double yaw,
  2. double roll_rate = 0,double pitch_rate = 0,double yaw_rate = 0);
复制代码
roll:吊舱目标横滚角度。值域:(-60, 60) <单位degree>
pitch:吊舱目标俯仰角度。值域:(-135, 135) <单位degree>
yaw:吊舱目标偏航角度。值域:(-150, 150) <单位degree>
roll_rate :吊舱横滚轴角速度绝对值最大值。设为0时该值无效 <单位degree/s>
pitch_rate:吊舱俯仰轴角速度绝对值最大值。设为0时该值无效 <单位degree/s>
yaw_rate :吊舱横偏航角速度绝对值最大值。设为0时该值无效 <单位degree/s>
注:
吊舱可达到的角度值无法突破吊舱的物理极限。


  • 吊舱角速度控制

用户可通过该函数控制吊舱以指定角速度向一个或多个轴向进行运动,以欧拉角表示。
  1. void setAngleRateEuler(double roll_rate,double pitch_rate,double yaw_rate);
复制代码
roll_rate :吊舱目标横滚轴角速度。<单位degree/s>
pitch_rate:吊舱目标俯仰轴角速度。<单位degree/s>
yaw_rate :吊舱目标横偏航角速度。<单位degree/s>
注:
不同的吊舱对于角速度指令的表现可能不同,该指令最好周期性发送。


  • 吊舱归中

用户可通过调用这个函数令吊舱快速回到初始姿态。
  1. bool setHome();
复制代码

  • 设置吊舱缩放倍率(指定倍数)


用户可通过该函数设置吊舱对画面进行指定倍数的缩放。
  1. bool setZoom(double x);
复制代码


  • x:相对于原始画面的缩放倍数。

注:
仅吊舱使用USB接口的情况下,如有其他设备同时使用USB接口,端口号可能会改变。

  • 设置吊舱缩放倍率(指定方向)
用户可通过该函数控制吊舱画面的缩放方向。
  1. bool setAutoZoom(int state)
复制代码
注:
state:画面缩放方向。0:缩小;1:放大;2:停止。
这项功能需要吊舱支持。

  • 调整吊舱焦平面

用户可通过该函数调整吊舱的焦平面。通常情况下,吊舱会自行调整焦平面以便获取最清晰的成像效果,无需用户干预。
  1. bool setAutoFocus(int state)
复制代码
state:焦平面调整方向。0:靠近;1:远离;2:停止。
这项功能需要吊舱支持。

吊舱图像获取

  • 吊舱拍摄照片

用户可通过该函数调用吊舱以预设分辨率拍摄照片,存储至吊舱内部。
  1. bool takePhoto();
复制代码


  • 吊舱录制视频

用户可通过该函数调用吊舱以预设分辨率录制视频,存储至吊舱内部。
  1. bool takeVideo(int state)
复制代码
注:
state:录制指令。0:开启录制;1:关闭录制。



  • 获取吊舱录状态

用户可通过该函数获取吊舱录制视频的状态。
  1. int getVideoState
复制代码
  1. return:录制状态。0:录制中;1:未开启录制
复制代码

  • 例程编译参考

(1)例程文件位置:~/SpireCV/samples/demo,吊舱控制需要自己新建cpp文件。
(2)如果新建cpp文件或者改变例程中的参数,需重新编译:
  1. # 编译例程
  2. cd <path to SpireCV/build>
  3. sudo make install
复制代码



- End -




扫一扫浏览分享
回复

使用道具 举报

返回列表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表