本文內(nèi)容:
- 貝塞爾曲線簡介
- 代碼算法講解
- 總結(jié)
貝塞爾曲線簡介:
原理:
Github上一位大佬已經(jīng)總結(jié)得很詳細了, 還有動態(tài)圖的哦,,我這里就直接引用啦Github
計算公式:
此處引用簡書一位大佬的總結(jié):@L_Xian;
該大佬不僅解釋了貝塞爾曲線的原理郭膛,還詳細的推導了貝塞爾曲線各階公式之間的聯(lián)系。
意義:
此處只說一下對于全向機器人運動的意義:
由于貝塞爾曲線是一條光滑的曲線,即高階可導征绸。若機器人的運動軌跡可以擬合在這條曲線上,運動轉(zhuǎn)彎將更加順滑,這就催生了我寫這個小程序的想法管怠。利用 Python強大的科學計算淆衷,圖像處理,繪圖能力渤弛。將一個標準的場地地圖導入祝拯,二值化之后,使用在地圖上點擊的起點與終點已經(jīng)2個控制點她肯,繪制出3階貝塞爾曲線佳头,再經(jīng)過坐標轉(zhuǎn)換,生成適合場地的機器人運動軌跡坐標晴氨。
代碼算法講解:
- 演示
獲取鼠標點擊的點:
class Get_Point_:
# 使用OpenCv對圖像進行初步的處理
# 使用 plt獲取鼠標點擊的坐標
def Get_Pos(src_img):
plt.imshow(src_img, cmap=plt.get_cmap("gray"))
pos = plt.ginput(4)
return pos
def Get_Point():
return Points_List_
def Get_Image():
src_img = cv.imread('./img/changdi2.png')
src_Gray_Image = cv.cvtColor(src_img, cv.COLOR_BGR2GRAY)
ret, dst_Image = cv.threshold(src_Gray_Image, 98, 255, cv.THRESH_BINARY)
return dst_Image
- Get_Pos(src_img):
使用plt顯示圖像康嘉,并且利用.ginput(n)
獲取n個鼠標點擊的點的坐標,這樣子的好處是籽前,matplotlib可以很容易的放大縮小圖像亭珍,且坐標軸方向相對使用OpenCv與實際更為接近。
- Get_Image():
使用OpenCV將圖像灰度化然后二值化,便于觀察繪制的曲線枝哄。
坐標點的解算:
這里直接使用的3階貝塞爾曲線的方程,解算出各個坐標點
# 解算Bezier方程的系數(shù)
def Build_Bezier(Point_0, Point_1, Point_2, Point_3, t):
A_0 = (1 - t) ** 3
A_1 = ((1 - t) ** 2) * 3 * t
A_2 = (t ** 2) * (1 - t) * 3
A_3 = t ** 3
x = Point_0[0] * A_0 + Point_1[0] * A_1 + Point_2[0] * A_2 + Point_3[0] * A_3
y = Point_0[1] * A_0 + Point_1[1] * A_1 + Point_2[1] * A_2 + Point_3[1] * A_3
return [int(x), int(y)] # 坐標轉(zhuǎn)換
return [int(x), int(y)]
可以根據(jù)自己的需要對x块蚌, y進行轉(zhuǎn)換之后再返回。
繪制圖像
此處我繪制了未擬合的坐標點(紅色)膘格,已經(jīng)我們擬合出的路徑(綠色)峭范。
可見上面的演示
增加的功能:
既然已經(jīng)生成了理想的運動軌跡,大可再繪制實際的運動軌跡瘪贱,只需要利用無線串口之類的模塊將機器人的運動軌跡實時傳回電腦纱控,然后在場地上繪制出軌跡。如演示圖
中左上角的綠色的菜秦,不太和諧的綠色曲線甜害,,emm球昨,尔店,那個只是我作的一個小實驗,主慰,隨便弄的幾個點嚣州,然后畫在同一張圖中這樣子。共螺。
總結(jié):
其實吧该肴,,這個程序挺簡單的藐不,但是這個至少可以說明匀哄,自己完全可以利用程序?qū)崿F(xiàn)自己的想法了秦效。