因为这个项目是视觉+控制,使用纯裸机实现我还没有看到,目前就是依托操作系统来实现:

需要ROS,OSDK,MSDK,三大类的包,后面是行人监测+KCF追踪。

在具体的看实现以前,我们看一下这个launch文件
roslaunch 命令允许我们一次启动 launch 文件中定义的多个 ROS 节点,启动参数等在启动文件(launch 文件)中配置,并且如果系统之前没有启动 roscore,则 roslaunch 会自动启动它。

使能人追踪

4个主题,图像发布,人的目标监测,追踪,GPS信号的发送。
然后开启:
roslaunch dji_sdk_demo dji_sdk_client.launch
roslaunch dji_sdk sdk_manifold.launch
后面这个我没有找到。。。,上面分别是:dji_sdk_client 和 dji_sdk节点。
roslaunch people_detect ros_people_detect.launch
运行监测
roslaunch ros_kcf ros_kcf_node.launch
追踪
在之后,可以使用具有自定义功能的遥控器来控制跟踪和检测的停止和启动:
void StartMission1Callback(DJIDrone *drone)
{
drone->request_sdk_permission_control();
sleep(1);
ros::Rate loop_rate(50);
while(ros::ok())
{
ros::spinOnce();
drone->attitude_control(0x4B,forwardV,leftrV,heightV,yawV);
cout<

该回调函数用于启动任务,即启动自主检测和跟踪
该回调函数用于开始跟踪,即people_detect节点给kcf_track节点一个目标。实际上,这个目标就是离图像中心最近的人,如果没有检测到人,跟踪程序就不会运行,但是当再次检测到人时,跟踪程序就会自动运行。

该回调函数用于启动和停止人员检测

此回调函数用于停止 kcf 跟踪器


因为OSDK4是支持新飞机的,我这里就选择3.9

看了看issue,也是说明了这个问题,很新
也可以看到这个视觉+控制是很常见的应用

我的A3也就是在3版本玩耍了

有用到CV

这个是飞行的控制参数

???啥子???

还有一个CIL的控制函数,是Python2版本的
原来以前有Python接口
下载一下看看

大开眼界

牛逼,直接就是一个类
1
在这里封装

在这里实现

把文件放入这里

改一下导入位置
"[a] Request to obtain control"

这个就是一个重定向的代码,应该是

请求控制的函数

在下面

在这里最终控制,就是信息的流转
ROS服务由srv文件定义,其中包含请求消息和响应消息。ROS 使用简化的服务描述语言(“srv”)来描述 ROS 服务类型。
这直接建立在 ROS消息格式之上,以启用节点之间的请求/响应通信。服务描述存储在包的srv/子目录下的.srv文件中。

我们最后看一个飞行任务控制,RC,手机,板载
反正就是测试的文件,还是挺有学头的,再说吧。

也可以看下具体的控制函数,实现

这个是PID的内容,就两个PID函数

普通的

增量式的

人控制型,试试上这个是派生的子类

这个是追踪的爸爸,是OpenCV实现的,看不懂。。。,对了,应该是配置

上面也说过了

接着看这个追踪的节点

先获取一些在launch里面设置的东西,接着就是设计高度,下面都是像子进程一样的东西。

处理的频率50Hz

在图像和明确接收到东西的前提下,开始追踪的初始化
void trackerInit(const double &cameraInfo)
{
tracker.setParams(cameraInfo, max_v).
setImgSize(image.cols, image.rows).
setTarget(cv::Point(image.cols / 2, image.rows / 2),
cv::Point(image.cols / 2 + 1, image.rows / 2 + 1)));
}
是鄙人学识不够了,这nm这么长,语法有点古怪。得到相机的信息,和最大的速度,然后是设置的图像的尺寸,接着设置追踪的目标,里面是生成一个追踪的框子(这里是生成了点而已,写错了)。
最后是在中间生成一个点。
void videoInit(const std::string &fileAddr)
{
int t = cv::getTickCount();
std::string fileName_ = fileAddr + std::to_string(t);
std::string fileName = fileName_ + ".avi";
writer = cv::VideoWriter(
fileName,
CV_FOURCC('F', 'L', 'V', '1'), 25.0,
cv::Size(image.cols, image.rows));
}
这个是视频的初始化,可以留下追踪的视频:

目录在电脑的桌面

控制好高度的函数

在一开始的类里面写的参数

这个是画框的函数,看来上面我有写错的地方

画完框,然后就写入

写入到MP4文件
好久没有摸ROS,一些API不记得了,明天继续。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !