使用DJI M100+ROS的行人追随项目

描述

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

OSDK

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

OSDK

在具体的看实现以前,我们看一下这个launch文件

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

OSDK

使能人追踪

OSDK

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<

 

OSDK

该回调函数用于启动任务,即启动自主检测和跟踪

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

OSDK

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

OSDK

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

OSDK

OSDK

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

OSDK

看了看issue,也是说明了这个问题,很新

也可以看到这个视觉+控制是很常见的应用

OSDK

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

OSDK

有用到CV

OSDK

这个是飞行的控制参数

OSDK

???啥子???

OSDK

还有一个CIL的控制函数,是Python2版本的

原来以前有Python接口

下载一下看看

OSDK

大开眼界

OSDK

牛逼,直接就是一个类

1OSDK

在这里封装

OSDK

在这里实现

OSDK

把文件放入这里

OSDK

改一下导入位置

"[a] Request to obtain control"

OSDK

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

OSDK

请求控制的函数

OSDK

在下面

OSDK

在这里最终控制,就是信息的流转

ROS服务由srv文件定义,其中包含请求消息和响应消息。ROS 使用简化的服务描述语言(“srv”)来描述 ROS 服务类型。

这直接建立在 ROS消息格式之上,以启用节点之间的请求/响应通信。服务描述存储在包的srv/子目录下的.srv文件中。

OSDK

我们最后看一个飞行任务控制,RC,手机,板载

反正就是测试的文件,还是挺有学头的,再说吧。

OSDK

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

OSDK

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

OSDK

普通的

OSDK

增量式的

OSDK

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

OSDK

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

OSDK

上面也说过了

OSDK

接着看这个追踪的节点

OSDK

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

OSDK

处理的频率50Hz

OSDK

在图像和明确接收到东西的前提下,开始追踪的初始化

 

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));
    }

 

这个是视频的初始化,可以留下追踪的视频:

OSDK

目录在电脑的桌面

OSDK

控制好高度的函数

OSDK

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

OSDK

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

OSDK

画完框,然后就写入

OSDK

写入到MP4文件

好久没有摸ROS,一些API不记得了,明天继续。






审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分