守望先鋒人工智慧輔助:硬體驅動和自動穩槍

前言

---------------------------

據說外掛這個名字不好聽,那麼我就改名叫人工智慧輔助了。

反正我也沒有用任何的遊戲數據hhhhh,所以機器人工程師的外掛能叫外掛嗎?那叫人工智慧

-------------------------

驅動準備

之前說了,為了手殘可以愉快的玩(pao)游(mei)戲(zi)這個偉大目標,我決定開始寫一個守望先鋒的 AI。今天下午終於抽出了幾個小時開始了第一步

其實作為一個 FPS 遊戲,守望先鋒的輸入輸出相當好定義,這樣也就造成了我們可以很快的完成寫一個 AI 的準備,首先需要做的事情就是能讀到圖像,其次要做的事情就是能控制滑鼠和鍵盤上有限的幾個鍵。

由於是沒事搞著玩的東西,所以我就直接採用了 Python 來干這個事情。

首先是讀入圖像,其實這個事情蠻簡單的,stackoverflow 上面一搜索就找到了使用 PIL 讀入圖像的方法,

from PIL import ImageGrabnimport numpy as npnimport cv2nnimg = ImageGrab.grab(bbox=(100,10,400,780)) #bbox specifies specific region (bbox= x,y,width,height *starts top-left)nimg_np = np.array(img) #this is the array obtained from conversionnframe = cv2.cvtColor(img_np, cv2.COLOR_BGR2GRAY)ncv2.imshow("test", frame)ncv2.waitKey(0)ncv2.destroyAllWindows()n

需要注意的是,由於兼容性的問題,你可能需要手動指定array 的 dtype=np.uint8,否則會報錯(mac 下沒有這個問題,windows會)

另一個我曾經以為很複雜的事情就是如何 fake 一個滑鼠鍵盤,結果發現對於 Python 不要太容易,直接使用 win32api 做滑鼠相對移動就行

win32api.mouse_event(win32con.MOUSEEVENTF_MOVE | win32con.MOUSEEVENTF_MOVE,int(movementx),int(movementy))n

這裡需要注意,WINAPI 調用滑鼠有兩種方式,相對移動和絕對移動,我測試中發現守望先鋒這類遊戲可以接納的是相對移動(因為遊戲的控制器邏輯會自動糾正到零點,所以估計是直接拿的驅動層的相對移動事件)

然後你就得到了所有的介面,剩下的就是演算法了。

一個水筆的視覺輔助

萬事開頭難,一開始就做很複雜的控制演算法和識別演算法或者規劃演算法得不償失,於是我就找一個最小系統搞一搞,什麼是最簡單的呢?我想了一下,做一個運動穩定吧。

所謂運動穩定,(在這裡就是跟槍)其實就是希望我的槍頭能指向目標物的方向

這個需求一提出來,立馬就想到了無比簡單已經經典的光流演算法,其實就是不斷地生成特徵點,做匹配。

在我的演算法中,我對300*300區域的特徵點進行捕捉,每次進入自動穩槍邏輯後,初始化特徵點,每幀不斷匹配並和起始幀做對比,由於瞄準十字很容易被識別為特徵點所以順便把離得太近的點扔掉。

這時候就可以得到一個特徵點的漂移量。

剩下的事情就很簡單了。

(x,y) = calcuate_movement()n movementx = movementx * filter_gain + -k*x/dt * (1-filter_gain)n # movementy = movementy * filter_gain + -k*y/dt * (1-filter_gain)n if enable_auto:n win32api.mouse_event(win32con.MOUSEEVENTF_MOVE | win32con.MOUSEEVENTF_MOVE,int(movementx),int(movementy))n passn cv2.waitKey(int(dt*1000))n

一個簡單的 P 控制器就可以得到不錯的跟蹤效果。特別注意的是,由於圖像追蹤的不穩定性,雜訊相當大,所以可以用一個簡單的一階濾波器解決問題。

這個時候已經可以用76跑著風騷的步伐然後滑鼠不動的突突訓練機器人了(雖然實戰還暫時沒有用)

守望先鋒人工智慧

守望先鋒人工智慧—在線播放—優酷網,視頻高清在線觀看 http://v.youku.com/v_show/id_XMTcyMTk5ODcxMg==.html

剛剛去打電腦對戰打死兩個23333

下一步計劃:我打算中秋假期期間把守望先鋒接到 ros 上面,先做了 VO 定位和基本的 SLAM,然後寫一套瞄準姿態-速度-位置的基礎控制器。

----------------------

有興趣參加這個項目,以及寫更多的基於視覺和機器人演算法的遊戲控制程序的可以知乎私信我,項目暫時不開源了我可不想被暴雪粑粑封號,用作大家娛樂用。參加項目的孩子只要滿足一:有興趣,二在項目中能貢獻代碼,三不想拿這玩意賺錢即可。我還想做自動空戰坦克之類的(而且空戰其實更好做畢竟我寫飛控的哈哈哈哈)。其實我覺得搞著玩玩玩玩說不定有了不錯的想法可以發paper 什麼的。

----------------------

別討論會不會封這種無聊的問題,我又不賣出去賺錢或者拿他正經打遊戲。

----------

還有人私信我讓我刪帖說不要毀掉這個遊戲,mdzz………

哦好幾個人給知乎舉報我在給暴雪的遊戲寫外掛,我覺得智力需要充值啊。

我是不是往網上發幾篇槍械圖紙,你要去公安局告我違法製造槍支彈藥啊?

我是不是往網上發幾篇哈馬斯無制導火箭彈的製作原理,你要去告訴以色列就是這個人炸了你家啊?

我是不是往網上發一篇原子彈的原理以及籌備,你要去國際原子能機構告我私自擁有核武器啊?

可問題是你們找的是知乎舉報,其實你還可以去給知乎舉報解析 AlphaGo 的回答破壞了圍棋遊戲的規則。

我為了避嫌專門漏了幾部分代碼沒有放出來就是嫌你們這種無聊的人太多了知道嗎?你惹急了我寫完以後放 github 上大家一起玩。真是的。。。。。我再說一遍,我做這個就是為了做機器人學的演算法試驗。你以為我真在乎遊戲打幾分啊?

說實話我不是很能跟得上你們的思路。

推薦閱讀:

TAG:人工智能 | 计算机视觉 |