機(jī)器人學(xué)之感知算法:SLAM(同步定位與地圖構(gòu)建):機(jī)器人運(yùn)動(dòng)學(xué)與動(dòng)力學(xué)_第1頁(yè)
機(jī)器人學(xué)之感知算法:SLAM(同步定位與地圖構(gòu)建):機(jī)器人運(yùn)動(dòng)學(xué)與動(dòng)力學(xué)_第2頁(yè)
機(jī)器人學(xué)之感知算法:SLAM(同步定位與地圖構(gòu)建):機(jī)器人運(yùn)動(dòng)學(xué)與動(dòng)力學(xué)_第3頁(yè)
機(jī)器人學(xué)之感知算法:SLAM(同步定位與地圖構(gòu)建):機(jī)器人運(yùn)動(dòng)學(xué)與動(dòng)力學(xué)_第4頁(yè)
機(jī)器人學(xué)之感知算法:SLAM(同步定位與地圖構(gòu)建):機(jī)器人運(yùn)動(dòng)學(xué)與動(dòng)力學(xué)_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

機(jī)器人學(xué)之感知算法:SLAM(同步定位與地圖構(gòu)建):機(jī)器人運(yùn)動(dòng)學(xué)與動(dòng)力學(xué)1緒論1.1SLAM算法的簡(jiǎn)介在機(jī)器人學(xué)領(lǐng)域,SLAM(SimultaneousLocalizationandMapping)算法是一項(xiàng)關(guān)鍵技術(shù),它允許機(jī)器人在未知環(huán)境中構(gòu)建地圖并同時(shí)定位自身的位置。這一過(guò)程對(duì)于自主導(dǎo)航、環(huán)境探索和人機(jī)交互等應(yīng)用至關(guān)重要。SLAM算法結(jié)合了傳感器數(shù)據(jù)(如激光雷達(dá)、攝像頭等)和機(jī)器人運(yùn)動(dòng)模型,通過(guò)迭代優(yōu)化,實(shí)現(xiàn)對(duì)環(huán)境的精確建模和定位。1.1.1原理SLAM算法的核心在于解決兩個(gè)主要問(wèn)題:定位和地圖構(gòu)建。定位是指確定機(jī)器人在環(huán)境中的位置和姿態(tài),而地圖構(gòu)建則是指創(chuàng)建或更新環(huán)境的描述。這一過(guò)程通常涉及以下步驟:數(shù)據(jù)采集:通過(guò)傳感器收集環(huán)境信息。特征提?。簭膫鞲衅鲾?shù)據(jù)中提取關(guān)鍵特征,如激光雷達(dá)的邊緣點(diǎn)或攝像頭的角點(diǎn)。運(yùn)動(dòng)估計(jì):基于機(jī)器人的運(yùn)動(dòng)學(xué)模型,預(yù)測(cè)機(jī)器人在下一時(shí)刻的位置。數(shù)據(jù)關(guān)聯(lián):確定當(dāng)前觀測(cè)到的特征與地圖中已知特征的對(duì)應(yīng)關(guān)系。狀態(tài)估計(jì):使用濾波器(如擴(kuò)展卡爾曼濾波器、粒子濾波器)或優(yōu)化方法(如圖優(yōu)化、非線性優(yōu)化)來(lái)更新機(jī)器人的位置和地圖。地圖更新:根據(jù)新的觀測(cè)和位置估計(jì),更新或擴(kuò)展地圖。1.1.2代碼示例以下是一個(gè)使用Python實(shí)現(xiàn)的簡(jiǎn)單SLAM算法示例,使用擴(kuò)展卡爾曼濾波器進(jìn)行狀態(tài)估計(jì):importnumpyasnp

classEKFSLAM:

def__init__(self):

self.x=np.zeros((3,1))#機(jī)器人位置和姿態(tài)[x,y,theta]

self.P=np.eye(3)*1000#協(xié)方差矩陣

self.landmarks={}#地圖中的地標(biāo)位置

defpredict(self,u,dt):

#運(yùn)動(dòng)模型預(yù)測(cè)

F=np.array([[1,0,-u[1]*dt],

[0,1,u[0]*dt],

[0,0,1]])

self.x=F@self.x+u*dt

self.P=F@self.P@F.T

defupdate(self,z,landmark_id):

#觀測(cè)模型更新

iflandmark_idnotinself.landmarks:

self.landmarks[landmark_id]=np.zeros((2,1))

H=self.calculate_jacobian(z,landmark_id)

R=np.eye(2)*10#觀測(cè)噪聲

y=z-self.calculate_observation(self.x,self.landmarks[landmark_id])

S=H@self.P@H.T+R

K=self.P@H.T@np.linalg.inv(S)

self.x=self.x+K@y

self.P=(np.eye(3)-K@H)@self.P

defcalculate_jacobian(self,z,landmark_id):

#計(jì)算雅可比矩陣

pass

defcalculate_observation(self,x,landmark):

#計(jì)算觀測(cè)模型

pass1.1.3描述上述代碼示例展示了SLAM算法中使用擴(kuò)展卡爾曼濾波器進(jìn)行狀態(tài)估計(jì)的基本框架。predict方法根據(jù)機(jī)器人的運(yùn)動(dòng)模型預(yù)測(cè)下一時(shí)刻的位置,而update方法則根據(jù)傳感器觀測(cè)到的地標(biāo)信息更新機(jī)器人的位置估計(jì)和地圖。calculate_jacobian和calculate_observation方法用于計(jì)算雅可比矩陣和觀測(cè)模型,這些在實(shí)際實(shí)現(xiàn)中需要根據(jù)具體傳感器和環(huán)境進(jìn)行定制。1.2機(jī)器人運(yùn)動(dòng)學(xué)與動(dòng)力學(xué)的基礎(chǔ)概念1.2.1運(yùn)動(dòng)學(xué)機(jī)器人運(yùn)動(dòng)學(xué)主要研究機(jī)器人各關(guān)節(jié)運(yùn)動(dòng)與末端執(zhí)行器位置和姿態(tài)之間的關(guān)系。在SLAM算法中,運(yùn)動(dòng)學(xué)模型用于預(yù)測(cè)機(jī)器人在執(zhí)行特定運(yùn)動(dòng)指令后的狀態(tài)。常見的運(yùn)動(dòng)學(xué)模型包括:差動(dòng)驅(qū)動(dòng)模型:適用于兩個(gè)輪子的機(jī)器人,通過(guò)控制左右輪的速度來(lái)實(shí)現(xiàn)轉(zhuǎn)向和前進(jìn)。全向運(yùn)動(dòng)模型:適用于能夠向任何方向移動(dòng)的機(jī)器人,如帶有全向輪的機(jī)器人。1.2.2動(dòng)力學(xué)機(jī)器人動(dòng)力學(xué)則關(guān)注于機(jī)器人運(yùn)動(dòng)所需的力和力矩。在SLAM算法中,動(dòng)力學(xué)模型雖然不直接用于定位和地圖構(gòu)建,但它對(duì)于理解機(jī)器人如何響應(yīng)外部力和控制輸入至關(guān)重要。動(dòng)力學(xué)模型通常涉及牛頓第二定律和拉格朗日方程,用于計(jì)算機(jī)器人各部分的加速度和力矩。1.2.3代碼示例以下是一個(gè)使用Python實(shí)現(xiàn)的差動(dòng)驅(qū)動(dòng)機(jī)器人運(yùn)動(dòng)學(xué)模型的示例:classDifferentialDrive:

def__init__(self,wheel_radius,track_width):

self.wheel_radius=wheel_radius

self.track_width=track_width

defupdate(self,left_speed,right_speed,dt):

#差動(dòng)驅(qū)動(dòng)模型更新

v=(left_speed+right_speed)/2*self.wheel_radius

w=(right_speed-left_speed)/self.track_width*self.wheel_radius

returnv,w1.2.4描述DifferentialDrive類實(shí)現(xiàn)了差動(dòng)驅(qū)動(dòng)機(jī)器人的運(yùn)動(dòng)學(xué)模型。update方法接受左右輪的速度和時(shí)間間隔,計(jì)算并返回機(jī)器人的線速度v和角速度w。這些速度信息可以進(jìn)一步用于預(yù)測(cè)機(jī)器人在下一時(shí)刻的位置和姿態(tài),是SLAM算法中機(jī)器人運(yùn)動(dòng)預(yù)測(cè)的基礎(chǔ)。通過(guò)上述介紹和示例,我們可以看到SLAM算法和機(jī)器人運(yùn)動(dòng)學(xué)模型在機(jī)器人自主導(dǎo)航中的重要性。它們不僅需要理論知識(shí)的支撐,還需要通過(guò)實(shí)際編程和數(shù)據(jù)處理來(lái)實(shí)現(xiàn)和優(yōu)化。2機(jī)器人運(yùn)動(dòng)學(xué)2.1運(yùn)動(dòng)學(xué)模型的建立在機(jī)器人學(xué)中,運(yùn)動(dòng)學(xué)模型的建立是描述機(jī)器人運(yùn)動(dòng)的基礎(chǔ)。它涉及到機(jī)器人的幾何結(jié)構(gòu)和關(guān)節(jié)運(yùn)動(dòng)之間的關(guān)系。對(duì)于一個(gè)機(jī)器人,其運(yùn)動(dòng)學(xué)模型可以分為正向運(yùn)動(dòng)學(xué)和逆向運(yùn)動(dòng)學(xué)。2.1.1正向運(yùn)動(dòng)學(xué)正向運(yùn)動(dòng)學(xué)(ForwardKinematics)是根據(jù)機(jī)器人的關(guān)節(jié)參數(shù)(如角度、長(zhǎng)度等)計(jì)算機(jī)器人末端執(zhí)行器在空間中的位置和姿態(tài)。這一過(guò)程通常涉及到坐標(biāo)變換和矩陣運(yùn)算。示例:2D雙關(guān)節(jié)機(jī)器人臂的正向運(yùn)動(dòng)學(xué)假設(shè)我們有一個(gè)2D雙關(guān)節(jié)機(jī)器人臂,關(guān)節(jié)1和關(guān)節(jié)2的角度分別為θ1和θ2,兩節(jié)臂的長(zhǎng)度分別為L(zhǎng)1和Lxy2.1.2逆向運(yùn)動(dòng)學(xué)逆向運(yùn)動(dòng)學(xué)(InverseKinematics)則是給定機(jī)器人末端執(zhí)行器的目標(biāo)位置和姿態(tài),求解機(jī)器人關(guān)節(jié)參數(shù)的過(guò)程。逆向運(yùn)動(dòng)學(xué)問(wèn)題可能有多個(gè)解,也可能無(wú)解。示例:2D雙關(guān)節(jié)機(jī)器人臂的逆向運(yùn)動(dòng)學(xué)對(duì)于上述2D雙關(guān)節(jié)機(jī)器人臂,如果我們想要末端執(zhí)行器到達(dá)位置x,計(jì)算關(guān)節(jié)2的角度θ2θ計(jì)算關(guān)節(jié)1的角度θ1θ2.2坐標(biāo)變換與矩陣表示在機(jī)器人運(yùn)動(dòng)學(xué)中,坐標(biāo)變換是描述機(jī)器人在不同坐標(biāo)系中位置和姿態(tài)的關(guān)鍵。通過(guò)使用齊次坐標(biāo)和變換矩陣,可以方便地進(jìn)行坐標(biāo)變換。2.2.1齊次坐標(biāo)齊次坐標(biāo)是通過(guò)在笛卡爾坐標(biāo)系的坐標(biāo)向量末尾添加一個(gè)額外的坐標(biāo)(通常為1)來(lái)表示的,這樣可以將平移和旋轉(zhuǎn)操作統(tǒng)一到一個(gè)矩陣中。2.2.2變換矩陣變換矩陣用于描述從一個(gè)坐標(biāo)系到另一個(gè)坐標(biāo)系的變換。一個(gè)基本的變換矩陣可以表示為:T其中R是旋轉(zhuǎn)矩陣,p是平移向量。示例:使用變換矩陣進(jìn)行坐標(biāo)變換假設(shè)我們有一個(gè)點(diǎn)P在世界坐標(biāo)系中的位置為3,T我們可以使用以下公式計(jì)算點(diǎn)P在機(jī)器人基坐標(biāo)系中的位置P′P在Python中,可以使用numpy庫(kù)進(jìn)行矩陣運(yùn)算:importnumpyasnp

#定義點(diǎn)P在世界坐標(biāo)系中的位置

P=np.array([3,4,5,1])

#定義變換矩陣T

T=np.array([[0,-1,0,10],

[1,0,0,20],

[0,0,-1,30],

[0,0,0,1]])

#計(jì)算點(diǎn)P在機(jī)器人基坐標(biāo)系中的位置P'

P_prime=np.dot(T,P)

print("點(diǎn)P在機(jī)器人基坐標(biāo)系中的位置:",P_prime[:3])2.3運(yùn)動(dòng)學(xué)方程的求解運(yùn)動(dòng)學(xué)方程的求解通常涉及到復(fù)雜的數(shù)學(xué)運(yùn)算,包括線性代數(shù)、幾何和三角函數(shù)。對(duì)于正向運(yùn)動(dòng)學(xué),可以直接應(yīng)用運(yùn)動(dòng)學(xué)模型中的公式進(jìn)行計(jì)算。而對(duì)于逆向運(yùn)動(dòng)學(xué),可能需要使用數(shù)值方法或解析方法求解。2.3.1解析方法解析方法是通過(guò)數(shù)學(xué)公式直接求解逆向運(yùn)動(dòng)學(xué)問(wèn)題,適用于結(jié)構(gòu)簡(jiǎn)單、運(yùn)動(dòng)學(xué)模型可解析的機(jī)器人。2.3.2數(shù)值方法數(shù)值方法是通過(guò)迭代計(jì)算逼近逆向運(yùn)動(dòng)學(xué)問(wèn)題的解,適用于結(jié)構(gòu)復(fù)雜、運(yùn)動(dòng)學(xué)模型難以解析的機(jī)器人。常見的數(shù)值方法有雅可比迭代法、牛頓-拉弗森法等。示例:使用雅可比迭代法求解逆向運(yùn)動(dòng)學(xué)假設(shè)我們有一個(gè)3關(guān)節(jié)的機(jī)器人臂,我們需要使用雅可比迭代法求解逆向運(yùn)動(dòng)學(xué)問(wèn)題。首先,我們需要定義雅可比矩陣J,它描述了末端執(zhí)行器位置和姿態(tài)對(duì)關(guān)節(jié)參數(shù)的偏導(dǎo)數(shù)。然后,我們可以通過(guò)以下迭代公式求解關(guān)節(jié)參數(shù):Δ其中Δθ是關(guān)節(jié)參數(shù)的修正量,Δ在Python中,可以使用scipy庫(kù)進(jìn)行矩陣求逆和求解線性方程組:fromscipy.linalgimportinv

fromscipy.optimizeimportleast_squares

#定義雅可比矩陣J

defjacobian(theta):

#這里省略具體的雅可比矩陣計(jì)算代碼

pass

#定義逆向運(yùn)動(dòng)學(xué)求解函數(shù)

defik_solver(p_target,theta_initial):

#定義誤差函數(shù)

deferror(theta):

p_current=forward_kinematics(theta)

returnp_target-p_current

#使用最小二乘法求解逆向運(yùn)動(dòng)學(xué)問(wèn)題

result=least_squares(error,theta_initial,jac=jacobian)

returnresult.x

#定義正向運(yùn)動(dòng)學(xué)函數(shù)

defforward_kinematics(theta):

#這里省略具體的正向運(yùn)動(dòng)學(xué)計(jì)算代碼

pass

#定義目標(biāo)位置p_target和初始關(guān)節(jié)參數(shù)theta_initial

p_target=np.array([10,15,20])

theta_initial=np.array([0,0,0])

#求解逆向運(yùn)動(dòng)學(xué)問(wèn)題

theta_solution=ik_solver(p_target,theta_initial)

print("求解得到的關(guān)節(jié)參數(shù):",theta_solution)以上內(nèi)容詳細(xì)介紹了機(jī)器人運(yùn)動(dòng)學(xué)中的運(yùn)動(dòng)學(xué)模型建立、坐標(biāo)變換與矩陣表示以及運(yùn)動(dòng)學(xué)方程的求解,包括正向運(yùn)動(dòng)學(xué)和逆向運(yùn)動(dòng)學(xué)的原理和示例。通過(guò)這些知識(shí),可以更好地理解和設(shè)計(jì)機(jī)器人的運(yùn)動(dòng)控制算法。3機(jī)器人動(dòng)力學(xué)3.1動(dòng)力學(xué)模型的建立在機(jī)器人動(dòng)力學(xué)中,動(dòng)力學(xué)模型的建立是理解機(jī)器人如何響應(yīng)外部力和力矩的關(guān)鍵。這涉及到使用牛頓第二定律和能量守恒原理來(lái)描述機(jī)器人的運(yùn)動(dòng)。動(dòng)力學(xué)模型通常包括以下步驟:定義坐標(biāo)系:為機(jī)器人的每個(gè)關(guān)節(jié)和連桿定義局部坐標(biāo)系。確定運(yùn)動(dòng)學(xué)參數(shù):包括連桿的長(zhǎng)度、質(zhì)量、轉(zhuǎn)動(dòng)慣量等。應(yīng)用動(dòng)力學(xué)原理:使用牛頓-歐拉或拉格朗日方法來(lái)建立動(dòng)力學(xué)方程。求解動(dòng)力學(xué)方程:通過(guò)數(shù)值方法或解析方法求解得到關(guān)節(jié)力矩與關(guān)節(jié)角速度、角加速度之間的關(guān)系。3.1.1示例:使用拉格朗日方法建立動(dòng)力學(xué)模型假設(shè)我們有一個(gè)簡(jiǎn)單的兩連桿機(jī)器人,其參數(shù)如下:連桿1:長(zhǎng)度l1=1m,質(zhì)量m連桿2:長(zhǎng)度l2=1m,質(zhì)量m關(guān)節(jié)角:θ1和θ我們可以使用拉格朗日方法來(lái)建立這個(gè)機(jī)器人的動(dòng)力學(xué)模型。首先,定義拉格朗日函數(shù)L=T?V,其中Timportsympyassp

#定義符號(hào)變量

theta1,theta2,dtheta1,dtheta2=sp.symbols('theta1theta2dtheta1dtheta2')

l1,l2,m1,m2,I1,I2,g=sp.symbols('l1l2m1m2I1I2g')

#動(dòng)能和勢(shì)能

T=0.5*m1*(l1*dtheta1)**2+0.5*m2*((l1*dtheta1)**2+(l2*dtheta2)**2+2*l1*l2*dtheta1*dtheta2*sp.cos(theta1-theta2))

V=m1*g*l1*sp.cos(theta1)+m2*g*(l1*sp.cos(theta1)+l2*sp.cos(theta1+theta2))

#拉格朗日函數(shù)

L=T-V

#拉格朗日方程

eq1=sp.diff(sp.diff(L,dtheta1),theta1)-sp.diff(L,theta1)

eq2=sp.diff(sp.diff(L,dtheta2),theta2)-sp.diff(L,theta2)

#代入具體參數(shù)

eq1=eq1.subs({l1:1,l2:1,m1:2,m2:1,I1:0.5,I2:0.3,g:9.8})

eq2=eq2.subs({l1:1,l2:1,m1:2,m2:1,I1:0.5,I2:0.3,g:9.8})

#打印方程

print("拉格朗日方程1:",eq1)

print("拉格朗日方程2:",eq2)3.2牛頓-歐拉方法牛頓-歐拉方法是一種遞歸算法,用于計(jì)算機(jī)器人連桿上的力和力矩。這種方法從機(jī)器人的末端連桿開始,沿著連桿鏈向前遞歸,直到達(dá)到基座。牛頓-歐拉方法可以分為前向遞歸和后向遞歸兩個(gè)階段:前向遞歸:計(jì)算每個(gè)連桿的線速度和角速度。后向遞歸:計(jì)算每個(gè)連桿上的力和力矩。3.2.1示例:使用牛頓-歐拉方法計(jì)算力矩假設(shè)我們有一個(gè)單連桿機(jī)器人,其參數(shù)如下:連桿長(zhǎng)度l=1m,質(zhì)量m=關(guān)節(jié)角θ=0.5rad,角速度我們可以使用牛頓-歐拉方法來(lái)計(jì)算作用在關(guān)節(jié)上的力矩。importsympyassp

#定義符號(hào)變量

theta,dtheta,ddtheta=sp.symbols('thetadthetaddtheta')

l,m,I,g=sp.symbols('lmIg')

#力矩計(jì)算

tau=I*ddtheta+m*l*sp.cos(theta)*g

#代入具體參數(shù)

tau=tau.subs({l:1,m:2,I:0.5,g:9.8,theta:0.5,dtheta:1,ddtheta:2})

#打印力矩

print("作用在關(guān)節(jié)上的力矩:",tau)3.3拉格朗日方法與牛頓-歐拉方法的比較拉格朗日方法和牛頓-歐拉方法都是建立機(jī)器人動(dòng)力學(xué)模型的有效方法,但它們?cè)谟?jì)算效率和適用性上有所不同:拉格朗日方法:適用于任何類型的連桿結(jié)構(gòu),包括閉環(huán)和開環(huán)結(jié)構(gòu)。計(jì)算過(guò)程涉及求解偏微分方程,對(duì)于復(fù)雜的機(jī)器人結(jié)構(gòu),可能需要使用數(shù)值方法。牛頓-歐拉方法:特別適用于開環(huán)連桿結(jié)構(gòu),計(jì)算效率高,適用于實(shí)時(shí)控制。但不適用于閉環(huán)結(jié)構(gòu),因?yàn)檫@種方法難以處理連桿之間的約束。在實(shí)際應(yīng)用中,選擇哪種方法取決于機(jī)器人的結(jié)構(gòu)和控制需求。對(duì)于簡(jiǎn)單的開環(huán)結(jié)構(gòu),牛頓-歐拉方法通常更受歡迎,因?yàn)樗?jì)算速度快。對(duì)于復(fù)雜的機(jī)器人結(jié)構(gòu),拉格朗日方法可能更適用,因?yàn)樗梢蕴幚砀鞣N約束和力的相互作用。4SLAM算法原理4.1SLAM問(wèn)題的定義同步定位與地圖構(gòu)建(SimultaneousLocalizationandMapping,SLAM)是機(jī)器人學(xué)中的一個(gè)核心問(wèn)題,旨在解決機(jī)器人在未知環(huán)境中構(gòu)建地圖并同時(shí)定位自身的問(wèn)題。SLAM問(wèn)題可以被形式化為一個(gè)概率估計(jì)問(wèn)題,其中機(jī)器人需要估計(jì)其在環(huán)境中的位置,同時(shí)估計(jì)環(huán)境的特征,如障礙物的位置和形狀。這一過(guò)程涉及到傳感器數(shù)據(jù)的處理、運(yùn)動(dòng)模型的建立、以及概率論和統(tǒng)計(jì)學(xué)的運(yùn)用。4.2經(jīng)典SLAM算法介紹4.2.1ExtendedKalmanFilter(EKF)SLAMEKFSLAM是最早被廣泛使用的SLAM算法之一,它基于擴(kuò)展卡爾曼濾波器(ExtendedKalmanFilter,EKF)來(lái)估計(jì)機(jī)器人位置和地圖特征。EKFSLAM將機(jī)器人位置和地圖特征作為狀態(tài)向量的一部分,通過(guò)預(yù)測(cè)和更新步驟來(lái)不斷修正狀態(tài)估計(jì)。代碼示例#EKFSLAM算法的簡(jiǎn)化示例

importnumpyasnp

#初始化狀態(tài)向量(位置和地圖特征)

x=np.zeros((3,1))#機(jī)器人的位置和方向

P=np.eye(3)*1000#狀態(tài)協(xié)方差矩陣

#運(yùn)動(dòng)模型

defmotion_model(u,dt,x):

#u:控制輸入(速度和轉(zhuǎn)向)

#dt:時(shí)間間隔

#x:當(dāng)前狀態(tài)

F=np.array([[1,0,0],[0,1,0],[0,0,1]])#狀態(tài)轉(zhuǎn)移矩陣

B=np.array([[dt*np.cos(x[2,0]),0],[dt*np.sin(x[2,0]),0],[0,dt]])#控制輸入矩陣

x=F@x+B@u#預(yù)測(cè)狀態(tài)

returnx

#觀測(cè)模型

defobservation_model(x,landmarks):

#x:當(dāng)前狀態(tài)

#landmarks:地圖特征位置

z=np.zeros((2*len(landmarks),1))#觀測(cè)向量

fori,lminenumerate(landmarks):

dx=lm[0]-x[0,0]

dy=lm[1]-x[1,0]

r=np.sqrt(dx**2+dy**2)

theta=np.arctan2(dy,dx)-x[2,0]

z[2*i,0]=r

z[2*i+1,0]=theta

returnz

#EKF更新步驟

defekf_update(x,P,z,landmarks):

#z:觀測(cè)值

#landmarks:地圖特征位置

H=np.zeros((2*len(landmarks),3))#觀測(cè)矩陣

R=np.eye(2*len(landmarks))*10#觀測(cè)協(xié)方差矩陣

fori,lminenumerate(landmarks):

dx=lm[0]-x[0,0]

dy=lm[1]-x[1,0]

q=dx**2+dy**2

H[2*i:2*i+2,0]=[-dx/np.sqrt(q),-dy/np.sqrt(q),0]

H[2*i:2*i+2,1]=[dy/q,-dx/q,0]

H[2*i:2*i+2,2]=[0,0,-1]

#計(jì)算卡爾曼增益

K=P@H.T@np.linalg.inv(H@P@H.T+R)

#更新狀態(tài)估計(jì)

x=x+K@(z-observation_model(x,landmarks))

#更新狀態(tài)協(xié)方差矩陣

P=(np.eye(3)-K@H)@P

returnx,P

#示例數(shù)據(jù)

u=np.array([1,0.1])#控制輸入(速度和轉(zhuǎn)向)

dt=0.1#時(shí)間間隔

landmarks=np.array([[10,10],[20,20],[30,30]])#地圖特征位置

z=np.array([5,0.5,10,1,15,1.5])#觀測(cè)值

#運(yùn)行EKFSLAM

x=motion_model(u,dt,x)

x,P=ekf_update(x,P,z,landmarks)4.2.2FastSLAMFastSLAM是一種基于粒子濾波的SLAM算法,它將機(jī)器人位置的估計(jì)與地圖特征的估計(jì)分離,使用粒子濾波來(lái)估計(jì)機(jī)器人位置,而地圖特征的估計(jì)則基于所有粒子的加權(quán)平均。這種方法減少了計(jì)算復(fù)雜度,使得SLAM算法在實(shí)時(shí)應(yīng)用中更加可行。4.3基于濾波器的SLAM算法基于濾波器的SLAM算法,如EKFSLAM和FastSLAM,利用濾波器來(lái)處理不確定性,通過(guò)預(yù)測(cè)和更新步驟來(lái)估計(jì)機(jī)器人位置和環(huán)境地圖。這些算法在處理高維狀態(tài)空間時(shí)可能會(huì)遇到計(jì)算復(fù)雜度的問(wèn)題,但它們?cè)诶碚摵蛯?shí)踐上都得到了廣泛的研究和應(yīng)用。4.4基于圖優(yōu)化的SLAM算法基于圖優(yōu)化的SLAM算法,如GraphSLAM,將SLAM問(wèn)題視為一個(gè)圖優(yōu)化問(wèn)題,其中節(jié)點(diǎn)代表機(jī)器人在不同時(shí)間點(diǎn)的位置,邊代表機(jī)器人在兩個(gè)時(shí)間點(diǎn)之間的運(yùn)動(dòng)和觀測(cè)關(guān)系。通過(guò)最小化邊的誤差來(lái)優(yōu)化整個(gè)圖,從而得到更準(zhǔn)確的機(jī)器人位置和環(huán)境地圖估計(jì)。4.4.1代碼示例#GraphSLAM算法的簡(jiǎn)化示例

importnumpyasnp

fromscipy.optimizeimportleast_squares

#初始化機(jī)器人位置

poses=np.zeros((3,1))

#運(yùn)動(dòng)和觀測(cè)數(shù)據(jù)

motion_data=np.array([[1,0.1],[2,0.2],[3,0.3]])

observation_data=np.array([[5,0.5],[10,1],[15,1.5]])

#運(yùn)動(dòng)模型

defmotion_model(u,dt,x):

#同上

#觀測(cè)模型

defobservation_model(x,landmarks):

#同上

#圖優(yōu)化目標(biāo)函數(shù)

defgraph_optimization_objective(x,motion_data,observation_data,landmarks):

#x:當(dāng)前狀態(tài)向量(所有機(jī)器人位置)

#motion_data:運(yùn)動(dòng)數(shù)據(jù)

#observation_data:觀測(cè)數(shù)據(jù)

#landmarks:地圖特征位置

error=np.zeros_like(x)

foriinrange(len(motion_data)):

u=motion_data[i]

dt=0.1

x[i+1]=motion_model(u,dt,x[i])

z=observation_data[i]

error[i*3:(i+1)*3]=z-observation_model(x[i],landmarks)

returnerror

#示例數(shù)據(jù)

poses=np.zeros((3,10))#10個(gè)時(shí)間點(diǎn)的機(jī)器人位置

landmarks=np.array([[10,10],[20,20],[30,30]])#地圖特征位置

#運(yùn)行GraphSLAM

result=least_squares(graph_optimization_objective,poses.flatten(),args=(motion_data,observation_data,landmarks))

optimized_poses=result.x.reshape((3,-1))以上代碼示例展示了如何使用擴(kuò)展卡爾曼濾波器(EKF)和基于圖優(yōu)化的SLAM算法來(lái)處理機(jī)器人定位和地圖構(gòu)建問(wèn)題。通過(guò)這些算法,機(jī)器人可以有效地在未知環(huán)境中導(dǎo)航,同時(shí)構(gòu)建環(huán)境的地圖。5SLAM中的運(yùn)動(dòng)學(xué)與動(dòng)力學(xué)5.1運(yùn)動(dòng)學(xué)在SLAM中的應(yīng)用5.1.1原理與內(nèi)容在SLAM(SimultaneousLocalizationandMapping)中,運(yùn)動(dòng)學(xué)模型用于預(yù)測(cè)機(jī)器人的位置和姿態(tài)。機(jī)器人通過(guò)傳感器(如輪式編碼器、IMU等)獲取自身運(yùn)動(dòng)信息,結(jié)合運(yùn)動(dòng)學(xué)模型,可以估計(jì)其在環(huán)境中的新位置。這一過(guò)程對(duì)于構(gòu)建地圖和定位至關(guān)重要,因?yàn)樗峁┝藱C(jī)器人在環(huán)境中移動(dòng)的先驗(yàn)信息,有助于減少傳感器數(shù)據(jù)的不確定性。5.1.2示例假設(shè)一個(gè)簡(jiǎn)單的二維移動(dòng)機(jī)器人,其運(yùn)動(dòng)學(xué)模型可以表示為:x其中,xt和yt是機(jī)器人在時(shí)間t的位置坐標(biāo),θt是機(jī)器人在時(shí)間t的朝向,vt和Python代碼示例importnumpyasnp

defpredict_position(x,y,theta,v,omega,dt):

"""

使用運(yùn)動(dòng)學(xué)模型預(yù)測(cè)機(jī)器人位置

:paramx:當(dāng)前x坐標(biāo)

:paramy:當(dāng)前y坐標(biāo)

:paramtheta:當(dāng)前朝向

:paramv:線速度

:paramomega:角速度

:paramdt:時(shí)間間隔

:return:預(yù)測(cè)的x,y,theta坐標(biāo)

"""

x_pred=x+v*np.cos(theta)*dt

y_pred=y+v*np.sin(theta)*dt

theta_pred=theta+omega*dt

returnx_pred,y_pred,theta_pred

#示例數(shù)據(jù)

x=0.0

y=0.0

theta=0.0

v=0.5

omega=0.1

dt=1.0

#預(yù)測(cè)位置

x_pred,y_pred,theta_pred=predict_position(x,y,theta,v,omega,dt)

print(f"預(yù)測(cè)位置:x={x_pred},y={y_pred},theta={theta_pred}")5.2動(dòng)力學(xué)在SLAM中的作用5.2.1原理與內(nèi)容動(dòng)力學(xué)模型考慮了機(jī)器人運(yùn)動(dòng)的物理特性,如質(zhì)量、摩擦力、驅(qū)動(dòng)力等,它更精確地描述了機(jī)器人如何響應(yīng)外部力和控制輸入。在SLAM中,動(dòng)力學(xué)模型可以用于校正運(yùn)動(dòng)學(xué)模型的預(yù)測(cè),尤其是在機(jī)器人受到外部干擾或在不平坦地形上移動(dòng)時(shí),動(dòng)力學(xué)模型能提供更準(zhǔn)確的運(yùn)動(dòng)預(yù)測(cè)。5.2.2示例考慮一個(gè)受摩擦力影響的機(jī)器人,其動(dòng)力學(xué)模型可以簡(jiǎn)化為:a其中,a是加速度,F(xiàn)是驅(qū)動(dòng)力,f是摩擦力,m是機(jī)器人質(zhì)量。Python代碼示例defpredict_position_with_dynamics(x,y,theta,v,F,f,m,dt):

"""

使用動(dòng)力學(xué)模型預(yù)測(cè)機(jī)器人位置

:paramx:當(dāng)前x坐標(biāo)

:paramy:當(dāng)前y坐標(biāo)

:paramtheta:當(dāng)前朝向

:paramv:當(dāng)前線速度

:paramF:驅(qū)動(dòng)力

:paramf:摩擦力

:paramm:機(jī)器人質(zhì)量

:paramdt:時(shí)間間隔

:return:預(yù)測(cè)的x,y,theta坐標(biāo)

"""

a=(F-f)/m

v_pred=v+a*dt

x_pred=x+v_pred*np.cos(theta)*dt

y_pred=y+v_pred*np.sin(theta)*dt

returnx_pred,y_pred,theta_pred

#示例數(shù)據(jù)

x=0.0

y=0.0

theta=0.0

v=0.5

F=1.0

f=0.2

m=10.0

dt=1.0

#預(yù)測(cè)位置

x_pred,y_pred,theta_pred=predict_position_with_dynamics(x,y,theta,v,F,f,m,dt)

print(f"預(yù)測(cè)位置:x={x_pred},y={y_pred},theta={theta_pred}")5.3運(yùn)動(dòng)不確定性與SLAM5.3.1原理與內(nèi)容在SLAM中,運(yùn)動(dòng)不確定性是由于傳感器誤差、模型簡(jiǎn)化和外部環(huán)境因素引起的。這種不確定性需要在算法中被量化和處理,以確保地圖構(gòu)建和定位的準(zhǔn)確性。通常,通過(guò)概率模型(如高斯分布)來(lái)描述運(yùn)動(dòng)不確定性,并在SLAM算法中使用貝葉斯濾波器(如擴(kuò)展卡爾曼濾波器)來(lái)更新機(jī)器人位置的估計(jì)。5.4動(dòng)力學(xué)約束下的SLAM優(yōu)化5.4.1原理與內(nèi)容在SLAM優(yōu)化過(guò)程中,動(dòng)力學(xué)約束可以作為額外的信息源,幫助算法更準(zhǔn)確地估計(jì)機(jī)器人狀態(tài)。例如,如果機(jī)器人在某一時(shí)刻的加速度超過(guò)了其物理能力,這種信息可以被用來(lái)調(diào)整該時(shí)刻的運(yùn)動(dòng)估計(jì),從而避免不合理的狀態(tài)預(yù)測(cè)。在實(shí)際應(yīng)用中,動(dòng)力學(xué)約束通常被整合到非線性優(yōu)化框架中,如圖優(yōu)化或非線性最小二乘優(yōu)化,以提高SLAM系統(tǒng)的魯棒性和精度。5.4.2示例在圖優(yōu)化中,動(dòng)力學(xué)約束可以被表示為邊,連接兩個(gè)關(guān)鍵幀。假設(shè)我們有以下動(dòng)力學(xué)約束:x其中,a是加速度,由動(dòng)力學(xué)模型計(jì)算得出。Python代碼示例在實(shí)際的圖優(yōu)化或非線性最小二乘優(yōu)化中,動(dòng)力學(xué)約束的實(shí)現(xiàn)會(huì)涉及到復(fù)雜的數(shù)學(xué)和優(yōu)化庫(kù),如CeresSolver。以下是一個(gè)簡(jiǎn)化的示例,僅用于說(shuō)明如何在優(yōu)化過(guò)程中考慮動(dòng)力學(xué)約束。fromscipy.optimizeimportleast_squares

defdynamics_constraint(x,v,a,dt):

"""

動(dòng)力學(xué)約束函數(shù)

:paramx:位置坐標(biāo)

:paramv:線速度

:parama:加速度

:paramdt:時(shí)間間隔

:return:動(dòng)力學(xué)約束誤差

"""

x_pred=x+v*np.cos(x[2])*dt

v_pred=v+a*dt

returnx_pred-x,v_pred-v

#示例數(shù)據(jù)

x=np.array([0.0,0.0,0.0])#當(dāng)前位置和朝向

v=0.5#當(dāng)前線速度

a=0.1#加速度

dt=1.0#時(shí)間間隔

#優(yōu)化過(guò)程

res=least_squares(dynamics_constraint,x,args=(v,a,dt))

print(f"優(yōu)化后的位置:x={res.x[0]},y={res.x[1]},theta={res.x[2]}")請(qǐng)注意,上述代碼示例僅用于說(shuō)明,實(shí)際的SLAM優(yōu)化過(guò)程會(huì)更加復(fù)雜,涉及到多維狀態(tài)向量、多個(gè)約束條件以及更高級(jí)的優(yōu)化算法。6機(jī)器人學(xué)之感知算法:SLAM算法實(shí)現(xiàn)6.1SLAM算法的軟件框架在實(shí)現(xiàn)SLAM算法時(shí),軟件框架的設(shè)計(jì)至關(guān)重要。它需要處理傳感器數(shù)據(jù)的輸入、機(jī)器人的狀態(tài)估計(jì)、地圖構(gòu)建與更新以及路徑規(guī)劃與控制。一個(gè)典型的SLAM軟件框架包括以下幾個(gè)關(guān)鍵組件:數(shù)據(jù)輸入模塊:負(fù)責(zé)接收來(lái)自不同傳感器(如激光雷達(dá)、攝像頭、IMU等)的數(shù)據(jù)。狀態(tài)估計(jì)模塊:使用傳感器數(shù)據(jù)和機(jī)器人運(yùn)動(dòng)模型來(lái)估計(jì)機(jī)器人的位置和姿態(tài)。地圖構(gòu)建模塊:根據(jù)狀態(tài)估計(jì)和傳感器數(shù)據(jù)構(gòu)建環(huán)境地圖。地圖更新模塊:當(dāng)機(jī)器人移動(dòng)并收集新數(shù)據(jù)時(shí),更新地圖以反映環(huán)境變化。路徑規(guī)劃與控制模塊:基于當(dāng)前地圖和機(jī)器人狀態(tài),規(guī)劃?rùn)C(jī)器人路徑并控制其運(yùn)動(dòng)。6.1.1示例:使用ROS實(shí)現(xiàn)SLAM#導(dǎo)入ROS相關(guān)庫(kù)

importrospy

fromnav_msgs.msgimportOdometry

fromsensor_msgs.msgimportLaserScan

fromslam_toolboximportMapping

#初始化ROS節(jié)點(diǎn)

rospy.init_node('slam_node')

#創(chuàng)建SLAM對(duì)象

slam=Mapping()

#定義回調(diào)函數(shù)處理激光雷達(dá)數(shù)據(jù)

deflaser_callback(data):

#使用SLAM工具箱處理激光雷達(dá)數(shù)據(jù)

cess_laser_data(data)

#定義回調(diào)函數(shù)處理里程計(jì)數(shù)據(jù)

defodom_callback(data):

#使用SLAM工具箱處理里程計(jì)數(shù)據(jù)

cess_odometry_data(data)

#訂閱激光雷達(dá)和里程計(jì)數(shù)據(jù)

rospy.Subscriber('/scan',LaserScan,laser_callback)

rospy.Subscriber('/odom',Odometry,odom_callback)

#主循環(huán)

if__name__=='__main__':

rospy.spin()6.2傳感器數(shù)據(jù)融合傳感器數(shù)據(jù)融合是SLAM中的關(guān)鍵步驟,它結(jié)合了多種傳感器的數(shù)據(jù)來(lái)提高定位和地圖構(gòu)建的準(zhǔn)確性。常見的傳感器包括激光雷達(dá)、攝像頭和IMU。數(shù)據(jù)融合通常使用卡爾曼濾波或粒子濾波等算法。6.2.1示例:使用卡爾曼濾波融合傳感器數(shù)據(jù)importnumpyasnp

fromfilterpy.kalmanimportKalmanFilter

#初始化卡爾曼濾波器

f=KalmanFilter(dim_x=4,dim_z=2)

#設(shè)置狀態(tài)轉(zhuǎn)移矩陣

f.F=np.array([[1.,0.,1.,0.],

[0.,1.,0.,1.],

[0.,0.,1.,0.],

[0.,0.,0.,1.]])

#設(shè)置觀測(cè)矩陣

f.H=np.array([[1.,0.,0.,0.],

[0.,1.,0.,0.]])

#設(shè)置初始狀態(tài)

f.x=np.array([[0.],[0.],[0.],[0.]])

#設(shè)置狀態(tài)協(xié)方差矩陣

f.P=np.eye(4)*1000.

#設(shè)置過(guò)程噪聲矩陣

f.Q=np.eye(4)*0.01

#設(shè)置觀測(cè)噪聲矩陣

f.R=np.eye(2)*5.

#融合傳感器數(shù)據(jù)

deffuse_data(laser_data,imu_data):

#更新卡爾曼濾波器

f.predict()

f.update(laser_data)

f.update(imu_data)

returnf.x

#示例數(shù)據(jù)

laser_data=np.array([[10.],[20.]])

imu_data=np.array([[1.],[2.]])

#融合數(shù)據(jù)

robot_state=fuse_data(laser_data,imu_data)

print("機(jī)器人狀態(tài):",robot_state)6.3地圖表示與更新地圖表示是SLAM中的另一個(gè)核心部分,它決定了如何存儲(chǔ)和表示環(huán)境信息。常見的地圖表示方法有柵格地圖、特征地圖和拓?fù)涞貓D。地圖更新則是在機(jī)器人移動(dòng)時(shí),根據(jù)新的傳感器數(shù)據(jù)調(diào)整地圖。6.3.1示例:使用柵格地圖表示和更新importnumpyasnp

#初始化柵格地圖

grid_map=np.zeros((100,100))

#更新地圖函數(shù)

defupdate_map(x,y,data):

#將傳感器數(shù)據(jù)轉(zhuǎn)換為地圖坐標(biāo)

map_x=int(x/0.5)

map_y=int(y/0.5)

#更新地圖

foriinrange(len(data)):

grid_map[map_x+i,map_y]=data[i]

#示例數(shù)據(jù)

x=10

y=20

data=np.random.rand(10)

#更新地圖

update_map(x,y,data)

print("更新后的地圖:",grid_map)6.4路徑規(guī)劃與控制路徑規(guī)劃與控制模塊負(fù)責(zé)根據(jù)當(dāng)前地圖和機(jī)器人狀態(tài),規(guī)劃?rùn)C(jī)器人從當(dāng)前位置到目標(biāo)位置的路徑,并控制機(jī)器人按照規(guī)劃的路徑移動(dòng)。這通常涉及到避障算法和運(yùn)動(dòng)控制算法。6.4.1示例:使用A*算法進(jìn)行路徑規(guī)劃importheapq

#定義A*算法

defa_star(start,goal,grid):

#初始化open和closed列表

open_list=[]

closed_list=set()

heapq.heappush(open_list,(0,start))

#初始化g和f值

g={start:0}

f={start:heuristic(start,goal)}

#主循環(huán)

whileopen_list:

#獲取當(dāng)前節(jié)點(diǎn)

current=heapq.heappop(open_list)[1]

#檢查是否到達(dá)目標(biāo)

ifcurrent==goal:

returnreconstruct_path(start,goal)

#將當(dāng)前節(jié)點(diǎn)加入closed列表

closed_list.add(current)

#遍歷鄰居節(jié)點(diǎn)

forneighboringet_neighbors(current,grid):

#計(jì)算臨時(shí)g值

temp_g=g[current]+1

#如果鄰居節(jié)點(diǎn)在closed列表中,或者臨時(shí)g值大于已知g值,跳過(guò)

ifneighborinclosed_listandtemp_g>=g.get(neighbor,float('inf')):

continue

#如果鄰居節(jié)點(diǎn)不在open列表中,或者臨時(shí)g值小于已知g值,更新g和f值

iftemp_g<g.get(neighbor,float('inf')):

g[neighbor]=temp_g

f[neighbor]=temp_g+heuristic(neighbor,goal)

ifneighbornotin[node[1]fornodeinopen_list]:

heapq.heappush(open_list,(f[neighbor],neighbor))

#如果沒(méi)有找到路徑,返回None

returnNone

#定義啟發(fā)式函數(shù)

defheuristic(a,b):

returnabs(a[0]-b[0])+abs(a[1]-b[1])

#定義獲取鄰居節(jié)點(diǎn)的函數(shù)

defget_neighbors(node,grid):

x,y=node

neighbors=[(x-1,y),(x+1,y),(x,y-1),(x,y+1)]

return[nforninneighborsif0<=n[0]<len(grid)and0<=n[1]<len(grid[0])andgrid[n[0]][n[1]]==0]

#示例地圖

grid=np.array([[0,0,0,0,1],

[0,1,1,0,0],

[0,0,0,0,0],

[0,1,1,1,0],

[0,0,0,0,0]])

#起始和目標(biāo)位置

start=(0,0)

goal=(4,4)

#路徑規(guī)劃

path=a_star(start,goal,grid)

print("規(guī)劃的路徑:",path)以上示例展示了如何使用Python和ROS實(shí)現(xiàn)SLAM算法的不同組件,包括數(shù)據(jù)輸入、狀態(tài)估計(jì)、地圖表示與更新以及路徑規(guī)劃與控制。通過(guò)這些示例,可以更好地理解SLAM算法的實(shí)現(xiàn)細(xì)節(jié)和工作原理。7案例分析與實(shí)踐7.1真實(shí)世界中的SLAM應(yīng)用案例在真實(shí)世界中,SLAM(SimultaneousLocalizationandMapping,同步定位與地圖構(gòu)建)技術(shù)被廣泛應(yīng)用于各種機(jī)器人和自動(dòng)駕駛系統(tǒng)中,以實(shí)現(xiàn)自主導(dǎo)航和環(huán)境理解。下面,我們將通過(guò)一個(gè)具體的案例來(lái)分析SLAM在機(jī)器人領(lǐng)域的應(yīng)用。7.1.1案例:無(wú)人機(jī)室內(nèi)自主飛行假設(shè)我們有一架無(wú)人機(jī),需要在未知的室內(nèi)環(huán)境中自主飛行,同時(shí)構(gòu)建該環(huán)境的地圖。無(wú)人機(jī)裝備有RGB-D相機(jī),可以獲取深度信息和彩色圖像。我們將使用ORB-SLAM2算法,這是一個(gè)開源的SLAM系統(tǒng),支持單目、RGB-D和立體相機(jī)。系統(tǒng)配置硬件:無(wú)人機(jī)、RGB-D相機(jī)軟件:ORB-SLAM2,ROS(RobotOperatingSystem)數(shù)據(jù)樣例無(wú)人機(jī)飛行時(shí),RGB-D相機(jī)將連續(xù)捕獲圖像和深度信息。以下是一個(gè)數(shù)據(jù)樣例:-圖像幀1:[RGB數(shù)據(jù)],[深度數(shù)據(jù)]

-圖像幀2:[RGB數(shù)據(jù)],[深度數(shù)據(jù)]

-圖像幀3:[RGB數(shù)據(jù)],[深度數(shù)據(jù)]代碼示例在ROS環(huán)境中運(yùn)行ORB-SLAM2,首先需要配置ROS環(huán)境并編譯ORB-SLAM2。以下是一個(gè)簡(jiǎn)單的ROS節(jié)點(diǎn)啟動(dòng)ORB-SLAM2的代碼示例://ROS節(jié)點(diǎn)示例:?jiǎn)?dòng)ORB-SLAM2

#include<ros/ros.h>

#include<sensor_msgs/Image.h>

#include<sensor_msgs/image_encodings.h>

#include<cv_bridge/cv_bridge.h>

#include<image_transport/image_transport.h>

#include<orb_slam2_ros/ORB_SLAM2.h>

intmain(intargc,char**argv)

{

ros::init(argc,argv

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論