#define limit(x,y) ;limitStart(x);y;limitEnd();limitStart, limitEnd的綜合使用, 開啟執行時間限制, 執行指令y, 然後關閉限制 例如:
limit(3600,
forward(120) await;
turnLeft(90) await;
);此代碼表示向前直行和轉左90度需要在3600毫秒內完成, 否則將會停止並直接跳到外面
#define lamdba []()匿名函數的語法糖
#define await ;_lockthread();為下一個指令提出鎖起線程的要求
例如:
lift(40);
forward(120) await;
turnLeft(90);此代碼表示升降台升起和向前直行一起進行 , 等待向前直行指令完成後進行轉左90度, 無論升降台升起是否已經完成
#define redonly ;_redonly();聲明下一個指令只適用於紅方區域的自動程序, 如果執行區域為藍區, 指令將不會被執行
例如:
redonly turnLeft(90) blueonly turnRight(90);此代碼表示轉左90度只適用於紅色區域, 如果執行區域為藍區, 則會跳到轉右90度
#define blueonly ;_blueonly();聲明下一個指令只適用於藍方區域的自動程序, 如果執行區域為紅區, 指令將不會被執行
例如:
redonly turnLeft(90) blueonly turnRight(90);此代碼表示轉左90度只適用於紅色區域, 如果執行區域為藍區, 則會跳到轉右90度
#define waiting(x) ;waitUntil([]()->bool{return x;});waitUntil的語法糖, 暫停線程並等待直至條件成立
例如:
lift(40);
forward(120);
waiting(LiftTarget == 0 && MoveTargetL == 0);
...此代碼表示升降台升起和向前直行一起進行, 等待兩個指令都完成後才繼續以下部分的指令
| type | name | detail |
|---|---|---|
| Motor | mtrArm | 手臂 |
action arm(const short speed, const int waitms = 0);指定手臂馬達速度
- 參數:
-
speed手臂的馬達速度, 範圍 -127 ~ +127
-
waitms持續毫秒, 可選, 預設為 0
不填寫 : 持續
填寫 : 持續ms毫秒, 然後停止
-
- 返回: action結構以控制指令
bool loadConfig();載入設定檔, 此動作會覆蓋部分受設定檔影響的參數
- 返回: True 如果成功載入設定檔, 或者 False 如果不能打開或格式錯誤
bool saveConfig();儲存設定檔, 此動作會將上次選擇的 自動程序, 顏色區域 以及 除錯模式閥門 記錄到設定檔中
- 返回: True 如果成功儲存設定檔, 或者 False 如果不能打開
此枚舉定義了不同類型的制動模式
可使用於移動指令
| Enum | |
|---|---|
| BRAKE | 0 |
| HOLD | 1 |
| RELEASE | 2 |
此枚舉定義了不同類型的制動模式
- 讓機械人移動的部件,例如四輪或全向輪底架
- 以角度為單位的部件,例如升降台
- 開關狀態的部件,例如轉盤或夾
- 以力量為單位的部件,例如無限循環的滾輪或忽略角度的手臂
- 能維持轉動速度的部件,例如轉輪發射器
- 步驟性的部件,例如位能發射器
| Enum | Value |
|---|---|
| COMPONENT_MOVE | 0 |
| COMPONENT_FIXED_RANGE | 1 |
| COMPONENT_POLARITY | 2 |
| COMPONENT_POWER_DRIVE | 3 |
| COMPONENT_SPINNER | 4 |
| COMPONENT_SHOOTER | 5 |
此結構包含一個動作生命週期所使用的參數, 包括數據更新,狀態檢查,結束停止的處理函式 及 開始數值和時間 及 使用者後續設定的自定義事件 等等. 使用 startHandler 函式激活, 系統會透過文字組成的金匙儲存在 _handler_map 字典中
std::function<int(handler)> fnc_update_;生命週期中數據更新的處理函式, 用於取得動作進度以啟動 to 事件
std::function<bool(handler,int)> fnc_loop_;生命週期中狀態檢查的處理函式, 用於檢查動作是否完成以及更新馬達速度
std::function<void(handler)> fnc_stop_;生命週期中結束停止的處理函式, 用於停止動作並且進行制動
short compare_operator_;原始感應器數據在動作進行時呈現上升 1 還是 下降 -1
1 : target > now, -1 : target < now
int start_value_;原始感應器數據在動作開始前的數值
uint32_t start_time_;在動作開始前的時間值
int waituntil_value_ =- 1;使用者設定, 同步等待到此進度,
-1 : 沒有設定, >= 0 : 目前進度高於此值時將會跳出同步等待
uint32_t waituntil_time_ = -1;在動作開始前的時間值 -1 : 沒有設定, >= 0 : 目前時間值高於此值時將會跳出同步等待
bool thread_run_ = true;生命週期是否繼續運行
std::map<int,std::function<void()>> fnc_event_to_;儲存自定義 to 事件
int : 進度(使用者單位), std::function : 事件函式
std::function<void()> fnc_event_finish_ = []{};儲存自定義完結事件, std::function : 事件函式
此結構包含三個函式用於操作動作處理器, 作為動作處理器的介面, 可以讓使用者使用預設的函式進行操作, 包括設定同步等待限制以及自定義事件等等
std::string id_ = "*";動作處理器的唯一金匙
bool enable_wait_until_ = true;是否啟用同步等待的限制條件
action& awaitUntil(const int value = -1, const int time = -1);設定同步等待的限制條件, 只需要進度值和時間其中一方完成, 便會跳過同步等待, 兩種限制必須填寫其中一種
action& to(const int value, const std::function<void()> event);設定觸發事件, 當進度值超過 value 數值時將會呼叫 event 函式, 事件處理函式會在動作的處理線程中進行, 運行阻塞性指令會阻塞檢測循環, 也不能進行同步的動作式函數
action& finish(const std::function<void()> event);設定結束事件, 函式會在動作停止後呼叫, 並且可以運行動作函式
action& forceStop();立即停止動作處理器並結束動作生命週期
action startHandler(handler h, std::string key);高級函數, 啟動動作處理器並設定處理器的唯一金匙
- 參數:
-
h即將執行的處理器, 必須提供完整的生命週期, 詳情請查看處理器的建構及使用
-
key處理器的唯一識別金匙,以文字而組成,多數為四個字
-
- 返回: action控制介面如果成功開始動作的生命週期
void limitStart(int ms);開始執行時間限制, 此動作會清空上一次的時間限制記錄
- 參數:
-
ms限制時間
-
void limitEnd();結束指令時間限制
bool isTimeup();取得現在或上一次指令是否超過執行時間限制
- 返回: True 如果超過限制時間, 否則 False
void wait(int ms);暫停線程並等待所設定的時間(以毫秒為單位)
指令與pros::delay不同, wait指令會配合限時控制
- 參數:
-
ms等待的時間
-
void waitUntil(const std::function<bool()> condition);暫停線程並等待直至條件成立
- 參數:
-
condition等待條件建構及使用
-
void waitUntilAboveSettled();暫停線程並等待所有指令完成
char* format(const char* f, ...);格式化字符串
- 參數:
-
f格式化的字符串
-
...格式化字符串的可選參數列表
-
- 返回: 格式化的字符串
template <typename... Params>
void log(std::int16_t line, const char* fmt, Params... args);在LCD屏幕上顯示格式化的字符串
- 參數:
-
line顯示文字的行[0-7]
-
fmt格式化的字符串
-
...格式化字符串的可選參數列表
-
void clearLog();清空LCD屏幕上的所有內容
uint8_t waitScreenBtnPress();等待直至 LCD屏幕的按鈕狀態發生變化
- 返回: 新的按鈕狀態位掩碼
uint8_t isLeftBtnPress();返回屏幕左側按鈕是否被按下
- 返回: 位掩碼 > 0 如果正在按下
uint8_t isCenterBtnPress();返回屏幕中間按鈕是否被按下
- 返回: 位掩碼 > 0 如果正在按下
uint8_t isRightBtnPress();返回屏幕右側按鈕是否被按下
- 返回: 位掩碼 > 0 如果正在按下
void initLCD();初始化LCD屏幕
| type | name | detail |
|---|---|---|
| PID | pidMove | 直行指令使用 平衡輪差距 PID 控制類 |
| PID | pidLF | 直行指令使用 左前輪 PID 控制類 |
| PID | pidRF | 直行指令使用 右前輪 PID 控制類 |
| PID | pidTurnNear | 轉彎指令短距離 PID 控制類 |
| PID | pidTurnFar | 轉彎指令長距離 PID 控制類 |
| double | leftMargin | 向左轉偏移加成 |
| double | rightMargin | 向右轉偏移加成 |
| type | name | detail |
|---|---|---|
| Motor | mtrLeftF | 左前輪 |
| Motor | mtrLeftR | 左後輪 |
| Motor | mtrRightF | 右前輪 |
| Motor | mtrRightR | 右後輪 |
| int | portGyro | 陀螺儀 |
此枚舉定義了不同種類的檢測角度感應器
| Enum | |
|---|---|
| GYRO | 0 |
| ENCODER | 1 |
void initMove();初始化移動指令
void resetMove();重設移動指令
action drive(const float cm,
const short lfspeed, const short lrspeed,
const short rfspeed, const short rrspeed,
const action_brake_mode_e_t brakemode = HOLD,
int tick = 0);向前直行一定距離, 然後停止
- 參數:
-
cm移動距離, 厘米, 不能負數
-
lfspeed左前輪子的馬達速度, 範圍 -127 ~ +127
-
lrspeed左後輪子的馬達速度, 範圍 -127 ~ +127
-
rfspeed右前輪子的馬達速度, 範圍 -127 ~ +127
-
rrspeed右後輪子的馬達速度, 範圍 -127 ~ +127
-
brakemode設定馬達停止後的制動方式, 可選, 預設為 HOLD
-
tick移動距離(單位tick), 可選, 預設為 0
不填寫 : 距離跟從cm, 並由cm計算出實際移動多少tick
填寫 : 覆蓋cm, 不能負數
-
- 返回: action結構以控制指令
action forward(const float cm,
const short speed = 0,
const action_brake_mode_e_t brakemode = HOLD,
int tick = 0);向前直行一定距離, 然後停止
- 參數:
-
cm移動距離(單位厘米), 不能負數
-
speed輪子的馬達速度, 可選, 預設為 0
不填寫 : 由PID運算控制
填寫 : 範圍 +1 ~ +127
-
brakemode設定馬達停止後的制動方式, 可選, 預設為 HOLD
-
tick移動距離(單位tick), 可選, 預設為 0
不填寫 : 距離跟從cm, 並由cm計算出實際移動多少tick
填寫 : 覆蓋cm, 不能負數
-
- 返回: action結構以控制指令
action backward(const float cm,
const short speed = 0,
const action_brake_mode_e_t brakemode = HOLD,
int tick = 0);向後直行一定距離, 然後停止
- 參數:
-
cm移動距離(單位厘米), 不能負數
-
speed輪子的馬達速度, 可選, 預設為 0
不填寫 : 由PID運算控制
填寫 : 範圍 +1 ~ +127
-
brakemode設定馬達停止後的制動方式, 可選, 預設為 HOLD
-
tick移動距離(單位tick), 可選, 預設為 0
不填寫 : 距離跟從cm, 並由cm計算出實際移動多少tick
填寫 : 覆蓋cm, 不能負數
-
- 返回: action結構以控制指令
action turnLeftToAzimuth(const float angle,
const short speed = 0,
const double error = 1);轉左到指定的絕對方位角並停下, 無論轉右到達目標是否近於轉左到達
絕對方位角是指 自動程式開始時機械人面向角 與 現時機械人面向角 之間的角度差
- 參數:
-
angle絕對方位角(單位角度)
-
speed轉向的馬達速度, 可選, 預設為 0
不填寫 : 由PID運算控制
填寫 : 範圍 +1 ~ +127
-
error判斷動作完成的誤差的容許範圍(單位角度)
-
- 返回: action結構以控制指令
action turnRightToAzimuth(const float angle,
const short speed = 0,
const double error = 1);轉右到指定的絕對方位角並停下, 無論轉左到達目標是否近於轉右到達
絕對方位角是指 自動程式開始時機械人面向角 與 現時機械人面向角 之間的角度差
- 參數:
-
angle絕對方位角(單位角度)
-
speed轉向的馬達速度, 可選, 預設為 0
不填寫 : 由PID運算控制
填寫 : 範圍 +1 ~ +127
-
error判斷動作完成的誤差的容許範圍(單位角度)
-
- 返回: action結構以控制指令
action turnLeft(const float angle,
const short speed = 0,
const double error = 1,
const angle_detection_sensor_e_t sensor = GYRO);轉左指定角度並停下
- 參數:
-
angle轉左的角度(單位角度)
-
speed轉向的馬達速度, 可選, 預設為 0
不填寫 : 由PID運算控制
填寫 : 範圍 +1 ~ +127
-
error判斷動作完成的誤差的容許範圍(單位角度)
-
sensor檢測角度的感應器種類
-
- 返回: action結構以控制指令
action turnRight(const float angle,
const short speed = 0,
const double error = 1,
const angle_detection_sensor_e_t sensor = GYRO);轉右指定角度並停下
- 參數:
-
angle轉右的角度(單位角度)
-
speed轉向的馬達速度, 可選, 預設為 0
不填寫 : 由PID運算控制
填寫 : 範圍 +1 ~ +127
-
error判斷動作完成的誤差的容許範圍(單位角度)
-
sensor檢測角度的感應器種類
-
- 返回: action結構以控制指令
action keepMove(const short lfspeed, const short lrspeed,
const short rfspeed, const short rrspeed,
const int waitms = 0);指定不同馬達速度
- 參數:
-
lfspeed左前輪子的馬達速度, 範圍 -127 ~ +127
-
lrspeed左後輪子的馬達速度, 範圍 -127 ~ +127
-
rfspeed右前輪子的馬達速度, 範圍 -127 ~ +127
-
rrspeed右後輪子的馬達速度, 範圍 -127 ~ +127
-
waitms持續毫秒, 可選, 預設為 0
不填寫 : 持續
填寫 : 持續ms毫秒, 然後停止
-
- 返回: action結構以控制指令
action keepMove(const short lspeed, const short rspeed, const int waitms = 0);指定左方及右方馬達速度
- 參數:
-
lspeed左輪子的馬達速度, 範圍 -127 ~ +127
-
rspeed右輪子的馬達速度, 範圍 -127 ~ +127
-
waitms持續毫秒, 可選, 預設為 0
不填寫 : 持續
填寫 : 持續ms毫秒, 然後停止
-
- 返回: action結構以控制指令
action holdMove(const bool isenable = true);保持輪子馬達位置, 此動作不阻塞線程
- 參數:
-
isenable是否保持, 可選, 預設為 True
-
- 返回: action結構以控制指令
| type | name | detail |
|---|---|---|
| Motor | mtrRoller | 滾筒 |
action roller(const short speed, const int waitms = 0);指定滾筒馬達速度
- 參數:
-
speed滾筒的馬達速度, 範圍 -127 ~ +127
-
waitms持續毫秒, 可選, 預設為 0
不填寫 : 持續
填寫 : 持續ms毫秒, 然後停止
-
- 返回: action結構以控制指令
| type | name | detail |
|---|---|---|
| int | msShootTime | 保持/基準位置到釋放位置所需時間 |
| int | msBackTime | 釋放位置到基準位置所需時間 |
| int | msHoldTime | 基準位置到保持位置所需時間 |
| type | name | detail |
|---|---|---|
| Motor | mtrShooter | 發射器 |
action shooter();射擊一次並回到準備點
- 返回: action結構以控制指令