版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、添加做常見數(shù)學(xué)計算的輔助方法我們先要給機(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; 回頁首使 AdvancedRobot 擴(kuò)展到有倒行功能接著,為了以相反方向?qū)Ш?,我們需要用一些輔助方法把 AdvancedRobot 類的功能擴(kuò)展到允許倒行操作: · getRelativeHeading() 方法將應(yīng)付正確計算相對于機(jī)器人當(dāng)前的方向的相對方向產(chǎn)生的額外開銷。 · reverseDirection() 非常簡單。它負(fù)責(zé) direction 實例變量的開關(guān)和使機(jī)器人掉頭。 請注意,由于減速需要時間,依據(jù)機(jī)器人的速度,在掉過頭來之前最多會沿原來的方向再走 4 格。 · setAhead() 和 setBack() 方法將覆蓋 A
5、dvancedRobot 類中的同名方法。這兩個方法會設(shè)置機(jī)器人對于目前方向的相對速度,必要的時候,還會調(diào)整 direction 實例變量。我們這么做的目的是要確保相對操作都與機(jī)器人當(dāng)前的移動方向有關(guān)。 · setTurnLeftRadiansOptimal() 和 setTurnRightRadiansOptimal() 方法使機(jī)器人的方向轉(zhuǎn)過的角度超過 (Math.PI / 2) 。您會希望這個方法和 adjustHeadingForWalls 方法(我們將在后面討論)一起使用。 注:我沒有使用 getter 和 setter 方法,而是直接存取 direction 實例變量。盡
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);回頁首添加因數(shù)避墻法我們需要添加的最后一個方法是 adjustHeadingForWalls() 方法。 這個方法的前面一半根據(jù)機(jī)器人和墻的靠近程度選擇 安全的 x 和 y 的位置(機(jī)器人當(dāng)前的 x 或 y 位置,或者如果機(jī)器人靠近墻,則就是中心點)。方法的后面一半則計算距離“安全點”的方位,并把這個方位和依機(jī)器人離墻遠(yuǎn)近得到的預(yù)想方向都作為因數(shù)考慮在內(nèi)。 可以使用 WALL_AVOID_INTERV
11、AL 和 WALL_AVOID_FACTORS 常量來調(diào)整機(jī)器人對墻的擔(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; 回頁首匯總其余的工作很容易。我們可以使用目前的導(dǎo)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度公共場所窗簾清洗與保養(yǎng)服務(wù)合同3篇
- 2025年度離婚后子女撫養(yǎng)權(quán)協(xié)商服務(wù)合同3篇
- 2025年度稅收籌劃與稅務(wù)籌劃合規(guī)性審查合同2篇
- 2025年度恐怖劇本定制與特效設(shè)計合同3篇
- 2024版輕鋼房屋建造協(xié)議模板協(xié)議
- 二零二四商鋪租賃合作協(xié)議:教育培訓(xùn)機(jī)構(gòu)商鋪租賃合同3篇
- 2025年度餐飲品牌連鎖拓展合同范本3篇
- 二零二四年家居裝飾團(tuán)購合同3篇
- 2025年度材料墊資供應(yīng)鏈金融服務(wù)合同3篇
- 2024年鐵礦石采購中介服務(wù)合同樣本
- 使用錯誤評估報告(可用性工程)模版
- 公司章程(二個股東模板)
- GB/T 19889.7-2005聲學(xué)建筑和建筑構(gòu)件隔聲測量第7部分:樓板撞擊聲隔聲的現(xiàn)場測量
- 世界奧林匹克數(shù)學(xué)競賽6年級試題
- 藥用植物學(xué)-課件
- 文化差異與跨文化交際課件(完整版)
- 國貨彩瞳美妝化消費趨勢洞察報告
- 云南省就業(yè)創(chuàng)業(yè)失業(yè)登記申請表
- UL_標(biāo)準(zhǔn)(1026)家用電器中文版本
- 國網(wǎng)三個項目部標(biāo)準(zhǔn)化手冊(課堂PPT)
- 快速了解陌生行業(yè)的方法論及示例PPT課件
評論
0/150
提交評論