因?yàn)檫@個(gè)項(xiàng)目是視覺(jué)+控制,使用純裸機(jī)實(shí)現(xiàn)我還沒(méi)有看到,目前就是依托操作系統(tǒng)來(lái)實(shí)現(xiàn):
需要ROS,OSDK,MSDK,三大類的包,后面是行人監(jiān)測(cè)+KCF追蹤。
在具體的看實(shí)現(xiàn)以前,我們看一下這個(gè)launch文件
roslaunch 命令允許我們一次啟動(dòng) launch 文件中定義的多個(gè) ROS 節(jié)點(diǎn),啟動(dòng)參數(shù)等在啟動(dòng)文件(launch 文件)中配置,并且如果系統(tǒng)之前沒(méi)有啟動(dòng) roscore,則 roslaunch 會(huì)自動(dòng)啟動(dòng)它。
使能人追蹤
4個(gè)主題,圖像發(fā)布,人的目標(biāo)監(jiān)測(cè),追蹤,GPS信號(hào)的發(fā)送。
然后開(kāi)啟:
roslaunch dji_sdk_demo dji_sdk_client.launch
roslaunch dji_sdk sdk_manifold.launch
后面這個(gè)我沒(méi)有找到。。。,上面分別是:dji_sdk_client 和 dji_sdk節(jié)點(diǎn)。
roslaunch people_detect ros_people_detect.launch
運(yùn)行監(jiān)測(cè)
roslaunch ros_kcf ros_kcf_node.launch
追蹤
在之后,可以使用具有自定義功能的遙控器來(lái)控制跟蹤和檢測(cè)的停止和啟動(dòng):
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<
該回調(diào)函數(shù)用于啟動(dòng)任務(wù),即啟動(dòng)自主檢測(cè)和跟蹤
該回調(diào)函數(shù)用于開(kāi)始跟蹤,即people_detect節(jié)點(diǎn)給kcf_track節(jié)點(diǎn)一個(gè)目標(biāo)。實(shí)際上,這個(gè)目標(biāo)就是離圖像中心最近的人,如果沒(méi)有檢測(cè)到人,跟蹤程序就不會(huì)運(yùn)行,但是當(dāng)再次檢測(cè)到人時(shí),跟蹤程序就會(huì)自動(dòng)運(yùn)行。
該回調(diào)函數(shù)用于啟動(dòng)和停止人員檢測(cè)
此回調(diào)函數(shù)用于停止 kcf 跟蹤器
因?yàn)镺SDK4是支持新飛機(jī)的,我這里就選擇3.9
看了看issue,也是說(shuō)明了這個(gè)問(wèn)題,很新
也可以看到這個(gè)視覺(jué)+控制是很常見(jiàn)的應(yīng)用
我的A3也就是在3版本玩耍了
有用到CV
這個(gè)是飛行的控制參數(shù)
???啥子???
還有一個(gè)CIL的控制函數(shù),是Python2版本的
原來(lái)以前有Python接口
下載一下看看
大開(kāi)眼界
牛逼,直接就是一個(gè)類
1
在這里封裝
在這里實(shí)現(xiàn)
把文件放入這里
改一下導(dǎo)入位置
"[a] Request to obtain control"
這個(gè)就是一個(gè)重定向的代碼,應(yīng)該是
請(qǐng)求控制的函數(shù)
在下面
在這里最終控制,就是信息的流轉(zhuǎn)
ROS服務(wù)由srv文件定義,其中包含請(qǐng)求消息和響應(yīng)消息。ROS 使用簡(jiǎn)化的服務(wù)描述語(yǔ)言(“srv”)來(lái)描述 ROS 服務(wù)類型。
這直接建立在 ROS消息格式之上,以啟用節(jié)點(diǎn)之間的請(qǐng)求/響應(yīng)通信。服務(wù)描述存儲(chǔ)在包的srv/子目錄下的.srv文件中。
我們最后看一個(gè)飛行任務(wù)控制,RC,手機(jī),板載
反正就是測(cè)試的文件,還是挺有學(xué)頭的,再說(shuō)吧。
也可以看下具體的控制函數(shù),實(shí)現(xiàn)
這個(gè)是PID的內(nèi)容,就兩個(gè)PID函數(shù)
普通的
增量式的
人控制型,試試上這個(gè)是派生的子類
這個(gè)是追蹤的爸爸,是OpenCV實(shí)現(xiàn)的,看不懂。。。,對(duì)了,應(yīng)該是配置
上面也說(shuō)過(guò)了
接著看這個(gè)追蹤的節(jié)點(diǎn)
先獲取一些在launch里面設(shè)置的東西,接著就是設(shè)計(jì)高度,下面都是像子進(jìn)程一樣的東西。
處理的頻率50Hz
在圖像和明確接收到東西的前提下,開(kāi)始追蹤的初始化
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))); }
是鄙人學(xué)識(shí)不夠了,這nm這么長(zhǎng),語(yǔ)法有點(diǎn)古怪。得到相機(jī)的信息,和最大的速度,然后是設(shè)置的圖像的尺寸,接著設(shè)置追蹤的目標(biāo),里面是生成一個(gè)追蹤的框子(這里是生成了點(diǎn)而已,寫錯(cuò)了)。
最后是在中間生成一個(gè)點(diǎn)。
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)); }
這個(gè)是視頻的初始化,可以留下追蹤的視頻:
目錄在電腦的桌面
控制好高度的函數(shù)
在一開(kāi)始的類里面寫的參數(shù)
這個(gè)是畫框的函數(shù),看來(lái)上面我有寫錯(cuò)的地方
畫完框,然后就寫入
寫入到MP4文件
好久沒(méi)有摸ROS,一些API不記得了,明天繼續(xù)。
審核編輯:劉清
-
OSDK
+關(guān)注
關(guān)注
0文章
3瀏覽量
8118 -
ROS
+關(guān)注
關(guān)注
1文章
276瀏覽量
16927 -
裸機(jī)
+關(guān)注
關(guān)注
0文章
39瀏覽量
6321 -
KCF
+關(guān)注
關(guān)注
0文章
2瀏覽量
846
原文標(biāo)題:DJI OSDK開(kāi)發(fā)-檢測(cè)行人+追蹤.1
文章出處:【微信號(hào):TT1827652464,微信公眾號(hào):云深之無(wú)跡】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論