大疆 210云台控制 https://developer.dji.com/onboard-sdk/documentation/sample-doc/advanced-sensing-target-tracking.html

0 开启图像端

0.1 图像跟踪 http://www.cnblogs.com/kekeoutlook/p/8353357.html

图像鼠标选取目标,之后不断保存目标信息,存入共享内存

  • 中心(x,y)和长宽
  • 发送标志位1判断是否

工程

0.2  共享内存获取和存数据

http://www.cnblogs.com/kekeoutlook/p/8330336.html

1原有速度和角度控制模式

最终执行了 函数

修改控制云台发送速率 为20HZ

        cameraSend = new QTimer();
cameraSend->setInterval(50); // 20Hz
connect(cameraSend, SIGNAL(timeout()), this, SLOT(on_tmr_Camera_autosend()));

  

修改共享内存读取速度

connect(timerBroadcast, SIGNAL(timeout()), this, SLOT(on_tmr_Broadcast()));
timerBroadcast->start(50);// 共享内存接收数据的频率 原有300 改为 50 -20HZ

2像素差值控制速度调整云台

10个像素 - 1角度

2.1云台初始化

void DJIonboardSDK::on_tmr_Broadcast()
{
//! @note this function cost too much time to run.
//! it is better run outside the broadcastCallback.
/*读取共享内存数据*/ memcpy(&recBOX, recBOX_DATA, sizeof(TrackBox)); qDebug("flag= %d ", recBOX.flag);
qDebug("old_flag= %d ", old_flag);
if (old_flag == 0 && recBOX.flag == 1)
{
firstflag = 1;
}
else
{
firstflag = 0;
}
//qDebug("firtflag= %d ", firstflag);
//qDebug(" %f ", cam->getYaw());
old_flag = recBOX.flag; if (recBOX.flag != 0)
{
//qDebug(" %d ", recBOX.flag);
itarget_x = recBOX.x;// 中心
//qDebug("target_x:%d ", recBOX.x);
itarget_y = recBOX.y;
//qDebug("target_x:%d target_y:%d", recBOX.x, recBOX.y);
itarget_h = recBOX.height;
itarget_w = recBOX.width; // img_w,
// img_h; // waitKey(1);
}
else { itarget_x = 1920 / 2;// 中心
//qDebug("Test:%d", recBOX.x);
itarget_y = 1080 / 2;
//qDebug("Test:%d", recBOX.y);
qDebug("target_x:%d target_y:%d", itarget_x, itarget_y);
}

  

2.2云台速度限制

void DJIonboardSDK::on_btr_camera_speed_clicked()
{
ui->hs_camera_yaw->setMinimum(-1800);
ui->hs_camera_yaw->setMaximum(1800);
ui->hs_camera_roll->setMinimum(-1800);
ui->hs_camera_roll->setMaximum(1800);
ui->hs_camera_pitch->setMinimum(-1800);
ui->hs_camera_pitch->setMaximum(1800);
resetCameraAngle();
ui->gb_cameraFlag->setEnabled(false);
}

  

2.3速度云台控制   10个像素转化每秒一度

void DJIonboardSDK::on_btn_camera_send_clicked()
{
GimbalSpeedData speedData;
GimbalAngleData angleData; if (ui->btg_cameraMode->checkedButton()->text() == "Speed")
{ //int itarget_x, itarget_y, itarget_h, itarget_w;
//int img_w, img_h;
int dx = 0;
int dy = 0;
int yawRate = 0;
int pitchRate = 0; //dx = (int)(itarget_x + itarget_w / 2 - img_w / 2);
//dy = (int)(itarget_y + itarget_h / 2 - img_h / 2); dx = (int)(itarget_x - 1920 / 2);
dy = (int)(itarget_y - 1080 / 2); yawRate = dx;
pitchRate = -dy; if (itarget_w / 2 < 30) { itarget_w = 60; };
if (itarget_h / 2 < 30){ itarget_h = 60; }; if (abs(dx) < itarget_w/2)
{
yawRate = 0;
}
if (abs(dy) < itarget_h/2)
{
pitchRate = 0;
} speedData.yaw = yawRate;
speedData.roll = 0;
speedData.pitch = pitchRate; cam->setGimbalSpeed(&speedData); }
else
{
angleData.yaw = ui->hs_camera_yaw->value();// 每次+5 --0.5
angleData.roll = ui->hs_camera_roll->value();
angleData.pitch = ui->hs_camera_pitch->value();
angleData.mode = camFlag;
angleData.duration = ui->lineEdit_cameraTime->text().toInt();
cam->setGimbalAngle(&angleData);
} }

2.4 加入PID调参的速度控制策略

PID初始化

DJIonboardSDK::DJIonboardSDK(QWidget *parent) : QMainWindow(parent), ui(new Ui::DJIonboardSDK)
{
ui->setupUi(this); ui->btn_flightCheckStatus->setVisible(false);
ui->btn_waypointDownload->setVisible(false);
ui->btn_waypoint_reset->setVisible(false);
ui->tabWidget->removeTab(3); PID_X.reset();
PID_Y.reset();
PID_X.setParam(0.44, 0.06, 0.007, 0);
PID_Y.setParam(0.6, 0.05, 0.02, 0);
//不过冲,但速度慢
//PID_X.setParam(0.4, 0.04, 0.03, 0);
//PID_Y.setParam(0.5, 0.05, 0.02, 0);
initSDK();
initDisplay();
initFlight();
initCamera();
initFollow();
initWayPoint();
initVirtualRC();
initShareMemory();

  取数据

connect(timerBroadcast, SIGNAL(timeout()), this, SLOT(on_tmr_Broadcast()));
timerBroadcast->start(20);// 共享内存接收数据的频率 原有300 改为 50HZ

  

  

3 像素控制  像素差转化为角度增量

X3相机

视场角度    W 73.9度   H 53度

图像分辨率     1920 *   1080

  • 问题 int/float 型 引发 0的问题

选择Increments 会在原来的基础之上angleData.yaw, angleData.roll,angleData.pitch 增加差量大小

  • angleData.yaw = yawRate * 793 / 1920;//   横向 像素差---角度
    angleData.roll = 0;
    angleData.pitch = pitchRate * 500 / 1080 ; // 纵向 像素差---角度

选择Absolute 会绝对控制 直接将angleData.yaw, angleData.roll,angleData.pitch设置成差量大小

3.1 设置角度范围

void DJIonboardSDK::on_btr_camera_angle_clicked()
{
ui->hs_camera_yaw->setMinimum(-3200);
ui->hs_camera_yaw->setMaximum(3200);
ui->hs_camera_roll->setMinimum(-350);
ui->hs_camera_roll->setMaximum(350);
ui->hs_camera_pitch->setMinimum(-900);
ui->hs_camera_pitch->setMaximum(300);
ui->gb_cameraFlag->setEnabled(true);
resetCameraAngle();
}

  

3.2 控制策略

void DJIonboardSDK::on_btn_camera_send_clicked()
{
GimbalSpeedData speedData;
GimbalAngleData angleData; if (ui->btg_cameraMode->checkedButton()->text() == "Speed")
{ //int itarget_x, itarget_y, itarget_h, itarget_w;
//int img_w, img_h; }
else
{ int yawRate = 0;
int pitchRate = 0;

// 坐标为左上角坐标
//dx = (int)(itarget_x + itarget_w / 2 - img_w / 2);
//dy = (int)(itarget_y + itarget_h / 2 - img_h / 2);
//qDebug("x= %d ,y=%d", itarget_x, itarget_y); //坐标为中心坐标
dx = (int)(itarget_x - 1920 / 2);
dy = (int)(itarget_y - 1080 / 2); yawRate = dx;
pitchRate = -dy; angleData.yaw = yawRate * 793 / 1920;// 横向 像素差---角度
angleData.roll = 0;
angleData.pitch = pitchRate * 500 / 1080 ; // 纵向 像素差---角度 angleData.mode = camFlag;
angleData.duration = ui->lineEdit_cameraTime->text().toInt();
cam->setGimbalAngle(&angleData);
} }

  

m100(2) 云台自动跟踪的更多相关文章

  1. M100 X3云台安装

    http://bbs.dji.com/thread-38587-1-1.html

  2. 大疆无人机M100相关问题解决过程

    1.遥控器升级问题 iOS端使用app升级,重复尝试了5次+,还是无法升级.卸载app重新安装,依旧是无法升级.使用Android app升级,一次搞定. 2.飞行器固件升级(云台别选错了) http ...

  3. M100 (0)开发

    [SDCC 2015现场]大疆Paul Yang:多旋翼飞行器的未来就是机器人的未来 http://www.csdn.net/article/2015-11-19/2826268 开发官网 https ...

  4. PID控制本版一 (M100可用)

    版本1 云台+无人机 https://en.wikipedia.org/wiki/PID_controller https://github.com/tekdemo/MiniPID 详细讲解 PIDC ...

  5. Z30云台PC控制问题

    https://developer.dji.com/cn/onboard-sdk/ 我们的需求: 完成PC程序控制Z30相机云台 关键问题: 前提:遥控器控制飞机+图像观看+调焦 1 PC能够接收到图 ...

  6. M100 (1) 运行

    软件环境设置指南 本指南详细介绍了使用Onboard SDK所需的软件环境. https://developer.dji.com/onboard-sdk/documentation/developme ...

  7. 大疆OSMO口袋云台相机惊艳上市!友商该如何是好。。。

    2018.11.29 晚上更新: 下午看了大疆新出的口袋云台摄像机,感觉棒极了,于是我立刻去了京东下单预订了.目前是可以免息分期6个月就可以搞定了.‘ 大家敬请期待我的评测视频吧. ======== ...

  8. M100(3) 无线数传

    本文记录了无线数传配合地面Windos qt写的飞机控制SDK软件的使用过程 使用了两种类型无线数传 遇到问题 1 界面卡死问题 1.1 数传问题 问题描述: 使用非官方数传,点击active按键和一 ...

  9. Qt自定义控件大全(一)云台仪表盘控件

    做过安防视频监控的同学都清楚,在视频监控系统软件上都可以看到一个云台控制区域,可以对球机进行下下左右等八个方位的运动控制,还可以进行复位,一般都是美工作图好,然后贴图的形式加入到软件中,好处是程序简单 ...

随机推荐

  1. Ubuntu下将现有的文件打包成deb包

    转自:http://www.linuxidc.com/Linux/2008-04/12297.htm deb是Debian Linux的软件包格式.一般来说是需要通过编译源码然后制作deb包,今天由于 ...

  2. Linux路由表信息-route命令

    使用命令 :route route 命令    显示和设置Linux路由表 -A:设置地址类型: -C:打印将Linux核心的路由缓存: -v:详细信息模式: -n:不执行DNS反向查找,直接显示数字 ...

  3. 转STM32官方固件库简介

    ST(意法半导体)为了方便用户开发程序,提供了一套丰富的 STM32 固件库.固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道,向上提供用户函数调用的接口(API) .固件库将这些寄 ...

  4. 将第三方包安装到maven本地仓库

    今天在做jasper report生成pdf文档的时候,需要引入亚洲字体jar包.maven仓库是有这个jar包,但是在项目pom文件始终不能下载.无奈只有将jar包安装到maven本地仓库. 1 将 ...

  5. iOS SDK开发汇总

    以前也做过静态库的开发,不过都是一些简单的调用,最近在做项目的时候,发现其中还有很多问题,所以建个小项目简单记录遇到的问题以及正确的解决办法. 在项目中遇到的问题如下:xib文件获取不到, story ...

  6. 【Java并发编程】6、volatile关键字解析&内存模型&并发编程中三概念

    volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以 ...

  7. 浏览器与Tomcat交互

    浏览器与Tomcat交互 Web开发者都知道在Tomcat下部署应用后启动Tomcat即可通过浏览器与Tomcat建立连接. 那么二者之间的连接建立过程是怎么样的呢?(在此,我们不具体讲述关于网络底层 ...

  8. OAuth2.0的refresh token

    最近看人人网的OAuth认证,发现他是OAuth2.0,之前一直看的是新浪的OAuth,是OAuth1.0. 二者还是有很多不同的,主要的不同点在access token的获取方式. OAuth1.0 ...

  9. 【工具相关】Web-Sublime Text2-安装插件HTMLPrettify

    一,打开Sublime Text2---->Preferences--->Browse Packages.--->查看Sublime Text2已经有的插件.如图所示. 二,在网上下 ...

  10. IDEA项目搭建十二——站点用户登录会话实现

    一.简介 前两天写了一篇用户登录会话设计的脑图,这次就把这个引入到项目中实现,总体来说需要几步先罗列一下: 1.需要一个Cookie工具类用于读写cookie 2.需要一个Cache工具类用于在服务端 ...