步驟1:安裝和設置



首先,您需要在選擇的計算機上安裝Eclipse。 Eclipse是Oracle流行的IDE。要安裝此程序,請轉到https://www.eclipse.org/downloads/,并找到標有C/C ++開發人員的Eclipse IDE的下載。在完成安裝過程之后,您接下來必須安裝FRC roboRIO工具鏈,可以通過轉到http://first.wpi.edu/FRC/roborio/toolchains/并選擇操作系統的鏈接來下載該工具鏈。安裝工具鏈后,您不會注意到安裝了任何新應用程序。現在打開Eclipse。您將遇到一個彈出窗口,詢問您要使用哪個工作空間。我建議您在文檔中創建一個名為“ FRCWorkspace”的文件夾。這將是所有源文件以及各種其他文件(例如輸出文件和配置文件)的位置。
如果您想查看或使用FIRST提供的示例程序,請依次選擇“文件”》“新建”》“示例”。 。.》 VxWorks可下載內核模塊示例項目。然后,應該為您提供已為您編寫的項目列表。單擊其中一個選項將顯示有關其內容的更多信息。即使您希望從頭開始編寫所有程序,也應該使用以下示例之一啟動項目,因為它們設置了所有包含,構建配置,標志等。對于本教程而言,選擇IterativeTemplate。首先,您需要稍微整理一下項目。在項目瀏覽器中,右鍵單擊sample.txt并選擇Delete,然后按OK。然后右鍵單擊IterativeTemplate并選擇重命名。將項目名稱更改為所需的任何名稱。避免使用連字符或下劃線以外的空格或特殊字符。我建議您做類似“ TeamName2014”的事情。確定名稱并在提供的文本字段中鍵入名稱后,請按OK。您的窗口現在看起來有些雜亂,所有邊緣的盒子都占據了空間。隨意將各種標簽拖放到任何地方。通常,您希望中間有很多空間供文件編輯器使用,并且始終可以看到項目瀏覽器。
步驟2:經歷默認代碼

現在讓我們開始有趣的部分,實際的編程!在項目資源管理器中雙擊MyRobot.cpp。現在在您面前的是一個工作程序,該程序將在遙控操作期間以拱廊模式驅動機器人。讓我們快速遍歷代碼以了解到目前為止發生的事情。
#include “WPILib.h”
此行將所有WPILib函數和類添加到您的代碼中。如果您想對機器人執行任何有用的操作,則將需要這些。除了包含WPILib之外,還將方便地包含string.h和iostream。
class RobotDemo : public IterativeRobot
{
這開始了名為RobotDemo的類。您可以將“ RobotDemo”更改為其他名稱,但是只需確保文件中的“ RobotDemo”的每個實例也都更改為您的新名稱。冒號表示IterativeRobot是RobotDemo的父類,而RobotDemo繼承了IterativeRobot的所有方法。
RobotDrive myRobot;
Joystick stick;
這定義了兩個私有變量:myRobot和stick。 myRobot包含驅動機器人的所有功能,stick變量顯然具有從操縱桿讀取輸入的功能。
myRobot.setExpiration(0.1);
這為RobotDrive類中的電動機設置了以秒為單位的到期時間。 。如果電動機的看門狗在這段時間內沒有送電,則將假定您的機器人程序已凍結,并且將自動停止電動機。 0.1秒應該是足夠的時間,但是如果您正在運行視覺處理或其他一些CPU密集型任務,并且在原本不應該的狀態下停止電動機,請嘗試增加失效時間。
this-》SetPeriod(0);
以秒為單位設置兩次調用定期函數之間的時間。如果設置為零,它將與駕駛員站控制數據同步(最終大約每0.02秒調用一次該函數)。如果未調用此函數,則默認值為0.0,因此此行是無用的。
RobotDemo : myRobot(1,2), stick(1)
這是一個初始化列表。正如評論所建議的,它們必須按照您聲明它們的順序進行初始化。 myRobot的參數是:機器人左馬達的端口號,然后是機器人右馬達的端口號。這假定您將Jaguars用作電動機控制器。操縱桿的參數是操縱桿編號。您可以轉到來查看這是什么? “ DriverStation”的“選項卡”選項卡,然后查看操縱桿在列表中的位置。默認游戲桿號為1。
void RobotDemo::RobotInit() {}
此功能由WPILib在機器人開啟時調用,該函數僅被調用一次,這使它成為初始化變量和分配變量的可靠場所。動態內存。
void RobotDemo::AutonomousInit() {}
void RobotDemo::TeleopInit() {}
void RobotDemo::TestInit() {}
每當更改機器人的模式時,WPILib會自動調用這些函數,無論是通過驅動程序站還是FMS(現場消息系統),其初始函數名為稱為新模式。通常,所有自治代碼都是用AutonomousInit函數編寫的。
void RobotDemo::DisabledInit() {}
DisabledInit不遵循其他模式初始化函數的規則。只有在第一次禁用機器人時才調用DisabledInit。這很可能是因為機器人在實際游戲中只會被禁用一次。
void RobotDemo::DisabledPeriodic() {}
void RobotDemo::AutonomousPeriodic{}
void RobotDemo::TeleopPeriodic() {}
void RobotDemo::TestPeriodic() {}
在適當的模式下,每秒將調用這些功能約50次(除非您調用此功能- 》 SetPeriod()的參數不是0.02或0,在這種情況下,周期函數將每秒被調用(1/period)次。
有關init和周期函數的重要說明:周期除非初始化功能完成,否則模式下的功能將無法運行。例如,如果您有這樣的事情:
void RobotDemo::AutomousInit() {
while(true) {
cout 《《 “I like dogs” 《《 endl;
}
}
void RobotDemo::AutonomousPeriodic() {
cout 《《 “But cats are better” 《《 endl;
}
您的機器人將不斷輸出它喜歡狗的東西,即使長時間處于自主模式,它也不會輸出以下事實:貓更好。初始化函數中的長時間運行代碼可能并不明顯,但這始終是在對機器人進行編程時需要注意的重要問題。
};
此括號關閉了RobotDemo類。一堂課的結束是在括號后需要分號的少數情況之一。
START_ROBOT_CLASS(RobotDemo);
這應該始終是MyRobot.cpp文件中的最后一行代碼。它是一個在RobotBase.h中定義的宏,它告訴WPILib的其余部分,RobotDemo類是應用于調用init函數,周期函數等的類。如果沒有此行,您可能會得到No將其部署到cRIO時出現機器人代碼錯誤。
步驟3:添加新功能
對于某些團隊來說,此代碼可能就是他們所需要的。但是,您更經常需要自定義代碼以滿足機器人的需求。由于我不確切知道您的機器人需要什么,因此您需要自己弄清一些。我只能提供一些例子,這些例子是我們團隊今年為改進計劃所做的。盡管可以跳過以下不適用于您的團隊的步驟,但我強烈建議您閱讀所有這些步驟,以使您更好地了解WPILib的工作方式以及如何添加這些功能(或類似功能)
第4步:坦克驅動與街機驅動

重要的是,您和您的團隊的驅動團隊知道街機和坦克駕駛之間的區別。街機驅動器使用一個操縱桿來控制機器人。前后移動操縱桿會改變速度,左右移動操縱桿會改變機器人的旋轉。另一方面,坦克駕駛使用兩個操縱桿。它們每個都對應于機器人一側的輪子。向前移動右控制器時,機器人的右輪將向前移動,而機器人將向左轉。許多人(尤其是游戲玩家)發現坦克駕駛非常令人困惑,但我強烈建議您的團隊使用坦克駕駛。坦克驅動器可以讓您更好地控制機器人的運動,并且通過一點點練習,您的驅動器將像使用街機驅動器一樣驅動機器人。
街機驅動器已設置在模板中為您服務。如果要切換到油箱驅動器,則需要聲明兩個Joystick變量而不是一個。我建議您稱它們為rightStick和leftStick之類的名稱,以便您輕松區分它們。然后將它們都放在初始化列表中,將值1傳遞給第一個操縱桿的構造函數,將值2傳遞給第二個操縱桿的構造函數。最后替換行“ myRobot.ArcadeDrive(stick);”使用“ myRobot.TankDrive(leftStick,rightStick);”。塔哈,您的機器人現在在油箱驅動器中驅動!
第5步:完整的氣動系統

氣動對于改善機器人的功能,并且在構建和編程方面都非常容易實現。要了解氣動的建筑方面,請參見Zaphod Beetlebrox的指導,他在出色地解釋了氣動系統的所有組件以及如何將其組合在一起方面做得很好。讓我們開始通過添加壓縮機來對氣動系統進行編程:
Compressor compressor;
compressor(,);
compressor.Start();
第一行與其余變量定義一起出現,第二行與初始值設定項列表一起出現,第三行與您的變量定義一起出現RobotInit功能。壓縮機的構造函數參數是壓力開關和尖峰繼電器插入數字邊柜的端口號。壓力開關應插入數字IO端口之一,而Spike繼電器應插入繼電器端口之一。這是使壓縮機工作所需的全部代碼,它將自動啟動并繼續運行,直到觸發壓力開關為止。使用AndyMarks的標準壓力開關,該壓力應為120 psi,但實際上通常比該壓力要低一些(我們的觸發壓力為110 psi)。
對氣動系統進行編程的下一步是消防螺線管。型號之間的接線和編程不同,但是有兩種主要類型的螺線管,單螺線管和雙螺線管。單個螺線管只有兩根電線。它們默認將壓力引導至一個輸出,并且僅在螺線管通電時將壓力引導至另一輸出。雙螺線管有兩對線,一對線通向設備的每一側。當一側通電時,螺線管會將其輸出切換到該側。關閉電源后,輸出將保留在任何位置。如果兩個都同時打開,則輸出也將保持不變。如果您使用單個電磁閥,則代碼如下所示:
Solenoid solenoid;
solenoid();
solenoid.Set();
前兩行與示例壓縮機代碼的前兩行位于同一位置。第三行應放置在由按鈕控制的if語句中,或者放置在您的自治代碼中。將“真”值傳遞給“設置”功能會將螺線管的輸出切換為非默認輸出。同樣,當設置為false時,它將使輸出返回其默認位置。如果要使用雙螺線管,只需將螺線管變量的類別更改為DoubleSolenoid而不是電磁閥,然后更改Set功能的參數即可。 Set函數參數不再是布爾值,因為有三個可用選項:僅打開一側,僅打開另一側,然后關閉兩側。要對此進行控制,請使用DoubleSolenoid :: kForward,DoubleSolenoid :: kReverse或DoubleSolenoid :: kOff作為Set函數的參數。
步驟6:操縱桿按鈕

要在操縱桿按鈕正常工作時運行定期代碼,只需將以下代碼插入您的定期模式功能之一:
if(stick.GetRawButton(1)) {
cout 《《 “Button 1 has been pressed” 《《 endl;
}
此代碼將是垃圾郵件僅在按下由stick變量引用的操縱桿上的數字1時,才會出現帶有“已按下按鈕1”的控制臺消息。釋放按鈕后,消息將再次停止。盡管這在某些情況下很有用,但有時您可能只是希望在按下按鈕時只調用一次它。將代碼修改為類似這樣的代碼應該可以達到您想要的結果:
if(stick.GetRawButton(1) != isButtonPressed) {
if(stick.GetRawButton(1)) {
cout 《《 “Button 1 has been pressed” 《《 endl;
isButtonPressed = true;
}
else {
cout 《《 “Button 1 has be released” 《《 endl;
isButtonPressed = false;
}
}
您必須將isButtonPressed定義為具有類范圍的布爾值(與myRobot或stick)。在這種情況下,“按鈕1已被按下”僅在第一次按下時才輸出一次,而“按鈕1已被釋放”則僅在一次按下時輸出一次。
第7步:自定義控制器

您的驅動器團隊可能會找您說,“我們想用它來移動機器人”。在此示例中,我將向您展示將代碼適配到Attack3以外的控制器有多么容易。附帶說明一下,Xbox控制器通常不是驅動機器人的非常好的控制器。不對稱的操縱桿使油箱驅動器直行行駛成為一個挑戰,操縱桿的小尺寸使其控件非常靈巧。首先,下載WPILib的Joystick Explorer實用程序。啟動它并插入游戲桿。確保從下拉菜單中選擇了控制器。移動操縱桿,觀察軸號發生變化。您應該為每個操縱桿記錄一個x軸和y軸(可能還取決于您的特定控制器的z軸)。現在,您進入代碼并使用這些軸號。刪除當前的myRobot.TankDrive或myRobot.ArcadeDrive函數,并在伸縮定期函數中添加以下代碼。
坦克車:
myRobot.TankDrive(stick.GetRawAxis(), stick.GetRawAxis());
Z軸的坦克車速度:
myRobot.TankDrive(stick.GetRawAxis() * stick.GetRawAxis(), stick.GetRawAxis() * stick.GetRawAxis());
街機驅動器:
myRobot.ArcadeDrive(stick.GetRawAxis(), stick.GetRawAxis());
Z軸街機驅動器用于速度:
myRobot.ArcadeDrive(stick.GetRawAxis() * stick.GetRawAxis(), stick.GetRawAxis());
您當然,將需要使用《》對其進行修改,以匹配您從Joystick Explorer中記錄的軸號。
步驟8:微型開關

它們發出巨大的咔嗒聲,但這并不是唯一的用途!它們可用于檢測自主游戲期間是否將游戲作品加載到您的機器人中或檢測碰撞。也許您有自己的創意用途。無論需要什么,它們都易于接線和編程,因此您應該知道它是如何完成的。這是它們的代碼:
DigitalInput microswitch;
microswitch(1) // This goes in the initialization list
microswitch.Get()
Get函數返回一個無符號的32位整數。如果要從中獲取布爾值以像按鈕一樣進行處理,只需將返回值與零進行比較即可。根據開關的接線,可能必須使用==或!=才能獲得所需的結果。
第9步:最終注釋
其中一些注釋非常有用重要,因此請閱讀它們!
C ++ 11的功能將無法在您的程序中使用,因為Wind River編譯器不支持它。
通常,無法使用cout或printf查看在標準輸出流中放入的任何內容。我強烈建議您使用NetConsole。它需要最少的設置,然后您可以將其與驅動程序站一起運行,它將顯示您輸出的所有內容。它可以是非常有用的工具,有助于診斷出問題所在或為駕駛員提供一些反饋。
如果您需要有關FRC機器人編程的幫助,最好的地方是Chief Delphi。那里總是有經驗和知識淵博的人來幫助您。您也可以對此說明發表評論,我會盡力與您聯系。
確保您的cRIO映像和Wind River工作臺保持最新非常重要。對于cRIO,只需找到FIRST提供的cRIO映像工具的最新副本即可。對于Wind River工作臺,通常在FIRST的“技術資源”頁面上有一個“ C ++更新”。
我還有幾個我想寫的主題,例如編程尖峰繼電器,編碼器,arduino通信和視覺處理。我還想詳細介紹將代碼部署到cRIO的細節。因此,請在幾周后再次檢查此說明,以更全面地了解FIRST Robotics的編程。
-
機器人
+關注
關注
213文章
31079瀏覽量
222267 -
編程
+關注
關注
90文章
3716瀏覽量
97191 -
FRC
+關注
關注
1文章
9瀏覽量
18850
發布評論請先 登錄
探索RISC-V在機器人領域的潛力
RK3576機器人核心:三屏異顯+八路攝像頭,重塑機器人交互與感知
小蘿卜機器人的故事
什么是機器人?追溯機器人技術的演變和未來
發力人形機器人賽道,傅利葉重磅推出陪伴機器人GR-3
怎樣對FRC機器人進行編程
評論