版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、添加做常見數(shù)學(xué)計(jì)算的輔助方法我們先要給機(jī)器人添加常見數(shù)學(xué)算法使用的一些輔助方法。我們還需要 normalizeAbsoluteAngleRadians() 方法和 normalizeRelativeAngleRadians() 方法。 清單 1. 數(shù)學(xué)輔助方法private static final double DOUBLE_PI = (Math.PI * 2);private static final double HALF_PI = (Math.PI / 2);public double calculateBearingToXYRadians(double sourceX, double
2、 sourceY, double sourceHeading, double targetX, double targetY) return normalizeRelativeAngleRadians( Math.atan2(targetX - sourceX), (targetY - sourceY) - sourceHeading); public double normalizeAbsoluteAngleRadians(double angle) if (angle < 0) return (DOUBLE_PI + (angle % DOUBLE_PI); else return
3、(angle % DOUBLE_PI); public static double normalizeRelativeAngleRadians(double angle) double trimmedAngle = (angle % DOUBLE_PI); if (trimmedAngle > Math.PI) return -(Math.PI - (trimmedAngle % Math.PI); else if (trimmedAngle < -Math.PI) return (Math.PI + (trimmedAngle % Math.PI); else return tr
4、immedAngle; 回頁(yè)首使 AdvancedRobot 擴(kuò)展到有倒行功能接著,為了以相反方向?qū)Ш?,我們需要用一些輔助方法把 AdvancedRobot 類的功能擴(kuò)展到允許倒行操作: · getRelativeHeading() 方法將應(yīng)付正確計(jì)算相對(duì)于機(jī)器人當(dāng)前的方向的相對(duì)方向產(chǎn)生的額外開銷。 · reverseDirection() 非常簡(jiǎn)單。它負(fù)責(zé) direction 實(shí)例變量的開關(guān)和使機(jī)器人掉頭。 請(qǐng)注意,由于減速需要時(shí)間,依據(jù)機(jī)器人的速度,在掉過頭來(lái)之前最多會(huì)沿原來(lái)的方向再走 4 格。 · setAhead() 和 setBack() 方法將覆蓋 A
5、dvancedRobot 類中的同名方法。這兩個(gè)方法會(huì)設(shè)置機(jī)器人對(duì)于目前方向的相對(duì)速度,必要的時(shí)候,還會(huì)調(diào)整 direction 實(shí)例變量。我們這么做的目的是要確保相對(duì)操作都與機(jī)器人當(dāng)前的移動(dòng)方向有關(guān)。 · setTurnLeftRadiansOptimal() 和 setTurnRightRadiansOptimal() 方法使機(jī)器人的方向轉(zhuǎn)過的角度超過 (Math.PI / 2) 。您會(huì)希望這個(gè)方法和 adjustHeadingForWalls 方法(我們將在后面討論)一起使用。 注:我沒有使用 getter 和 setter 方法,而是直接存取 direction 實(shí)例變量。盡
6、管通常這并非良好的編程習(xí)慣,但為了加快數(shù)據(jù)存取,在我的機(jī)器人代碼中我一直都是直接存取的。 清單 2. 機(jī)器人輔助方法public double getRelativeHeadingRadians() double relativeHeading = getHeadingRadians(); if (direction < 1) relativeHeading = normalizeAbsoluteAngleRadians(relativeHeading + Math.PI); return relativeHeading;public void reverseDirection() do
7、uble distance = (getDistanceRemaining() * direction); direction *= -1; setAhead(distance);public void setAhead(double distance) double relativeDistance = (distance * direction); super.setAhead(relativeDistance); if (distance < 0) direction *= -1; public void setBack(double distance) double relati
8、veDistance = (distance * direction); super.setBack(relativeDistance); if (distance > 0) direction *= -1; public void setTurnLeftRadiansOptimal(double angle) double turn = normalizeRelativeAngleRadians(angle); if (Math.abs(turn) > HALF_PI) reverseDirection(); if (turn < 0) turn = (HALF_PI +
9、(turn % HALF_PI); else if (turn > 0) turn = -(HALF_PI - (turn % HALF_PI); setTurnLeftRadians(turn);public void setTurnRightRadiansOptimal(double angle) double turn = normalizeRelativeAngleRadians(angle); if (Math.abs(turn) > HALF_PI) reverseDirection(); if (turn < 0) turn = (HALF_PI + (turn
10、 % HALF_PI); else if (turn > 0) turn = -(HALF_PI - (turn % HALF_PI); setTurnRightRadians(turn);回頁(yè)首添加因數(shù)避墻法我們需要添加的最后一個(gè)方法是 adjustHeadingForWalls() 方法。 這個(gè)方法的前面一半根據(jù)機(jī)器人和墻的靠近程度選擇 安全的 x 和 y 的位置(機(jī)器人當(dāng)前的 x 或 y 位置,或者如果機(jī)器人靠近墻,則就是中心點(diǎn))。方法的后面一半則計(jì)算距離“安全點(diǎn)”的方位,并把這個(gè)方位和依機(jī)器人離墻遠(yuǎn)近得到的預(yù)想方向都作為因數(shù)考慮在內(nèi)。 可以使用 WALL_AVOID_INTERV
11、AL 和 WALL_AVOID_FACTORS 常量來(lái)調(diào)整機(jī)器人對(duì)墻的擔(dān)憂程度。 清單 3. 避墻法方法private static final double WALL_AVOID_INTERVAL = 10;private static final double WALL_AVOID_FACTORS = 20;private static final double WALL_AVOID_DISTANCE = (WALL_AVOID_INTERVAL * WALL_AVOID_FACTORS);private double adjustHeadingForWalls(double headin
12、g) double fieldHeight = getBattleFieldHeight(); double fieldWidth = getBattleFieldWidth(); double centerX = (fieldWidth / 2); double centerY = (fieldHeight / 2); double currentHeading = getRelativeHeadingRadians(); double x = getX(); double y = getY(); boolean nearWall = false; double desiredX; doub
13、le desiredY; / If we are too close to a wall, calculate a course toward / the center of the battlefield. if (y < WALL_AVOID_DISTANCE) | (fieldHeight - y) < WALL_AVOID_DISTANCE) desiredY = centerY; nearWall = true; else desiredY = y; if (x < WALL_AVOID_DISTANCE) | (fieldWidth - x) < WALL_
14、AVOID_DISTANCE) desiredX = centerX; nearWall = true; else desiredX = x; / Determine the safe heading and factor it in with the desired / heading if the bot is near a wall if (nearWall) double desiredBearing = calculateBearingToXYRadians(x, y, currentHeading, desiredX, desiredY); double distanceToWal
15、l = Math.min( Math.min(x, (fieldWidth - x), Math.min(y, (fieldHeight - y); int wallFactor = (int)Math.min(distanceToWall / WALL_AVOID_INTERVAL), WALL_AVOID_FACTORS); return (WALL_AVOID_FACTORS - wallFactor) * desiredBearing) + (wallFactor * heading) / WALL_AVOID_FACTORS); else return heading; 回頁(yè)首匯總其余的工作很容易。我們可以使用目前的導(dǎo)
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度集裝箱運(yùn)輸企業(yè)信用評(píng)價(jià)與風(fēng)險(xiǎn)管理合同3篇
- 二零二五年環(huán)保節(jié)能型監(jiān)控設(shè)備采購(gòu)與技術(shù)支持合同2篇
- 二零二五版房屋租賃及轉(zhuǎn)讓合同全方位權(quán)益創(chuàng)新協(xié)議2篇
- 二零二五版文化創(chuàng)意產(chǎn)業(yè)園區(qū)使用權(quán)轉(zhuǎn)讓合同3篇
- 二零二五年度國(guó)際公路運(yùn)輸代理合同2篇
- 二零二五版城市綠化苗木租賃合同3篇
- 二零二五版環(huán)保設(shè)備質(zhì)押貸款合同模板3篇
- 二零二五年度高級(jí)管理人員出差責(zé)任免除服務(wù)合同范本2篇
- 二零二五版體育行業(yè)勞動(dòng)合同管理規(guī)范及運(yùn)動(dòng)員權(quán)益保障協(xié)議3篇
- 二零二五年度節(jié)水減排供水合同范本3篇
- 2023年山東省青島市中考化學(xué)試題(含答案解析)
- 商業(yè)計(jì)劃書(BP)產(chǎn)品與服務(wù)的撰寫秘籍
- 安徽華塑股份有限公司年產(chǎn) 4萬(wàn)噸氯化石蠟項(xiàng)目環(huán)境影響報(bào)告書
- 公司章程(二個(gè)股東模板)
- 世界奧林匹克數(shù)學(xué)競(jìng)賽6年級(jí)試題
- 藥用植物學(xué)-課件
- 文化差異與跨文化交際課件(完整版)
- 國(guó)貨彩瞳美妝化消費(fèi)趨勢(shì)洞察報(bào)告
- 云南省就業(yè)創(chuàng)業(yè)失業(yè)登記申請(qǐng)表
- UL_標(biāo)準(zhǔn)(1026)家用電器中文版本
- 國(guó)網(wǎng)三個(gè)項(xiàng)目部標(biāo)準(zhǔn)化手冊(cè)(課堂PPT)
評(píng)論
0/150
提交評(píng)論