Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed SDFileSystem ConfigFile
Revision 34:4bda9af9a0cd, committed 2015-08-06
- Comitter:
- ojan
- Date:
- Thu Aug 06 15:45:48 2015 +0000
- Parent:
- 33:56163d4e2c53
- Commit message:
- LAURUS_Program_v2.9.0; ; + add RULE3_1; + add "volatile" to some variables like "flag"
Changed in this revision
| BufferedSerial/BufferedSerial.cpp | Show annotated file Show diff for this revision Revisions of this file |
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/BufferedSerial/BufferedSerial.cpp Sun Jul 19 02:21:43 2015 +0000
+++ b/BufferedSerial/BufferedSerial.cpp Thu Aug 06 15:45:48 2015 +0000
@@ -159,7 +159,7 @@
bool BufferedSerial::checkCTS(void)
{
- static bool _send_flg=true;
+ volatile static bool _send_flg=true;
if(_send_flg) {
_send_flg=!_cts;
} else {
--- a/main.cpp Sun Jul 19 02:21:43 2015 +0000
+++ b/main.cpp Thu Aug 06 15:45:48 2015 +0000
@@ -16,19 +16,30 @@
//#define RULE2
//#define RULE3
//#define RULE4
+//#define RULE3_1
#define SERVO_DEBUG
//#define DIRECTION_DEBUG
//#define SPIRAL_DEBUG
#ifdef DIRECTION_DEBUG
-const float TargetDirection = 0.0f; // 指定方向に飛ぶ
+const float TargetDirection = -179.0f; // 指定方向に飛ぶ
+
+#elif RULE3_1
+const float BetaMin = 0.2f * RAD_TO_DEG; // β最小値
+const float BetaVar = 0.3f * RAD_TO_DEG; // β変化量
+const float BetaMax = 1.0f * RAD_TO_DEG; // β最大値
+const float Span = 10.0f; // βの値が変わる距離間隔(Span[m]ごとにβの値がBetaVarだけ変化)
+
+#elif RULE4
+const float BorderHeight = 10.0f; // 制御則3と2を切り替える高度の閾値(m)
#endif
+
const float dt = 0.01f; // 割り込み周期(s)
const float ServoMax = 0.0046f; // サーボの最大パルス長(s)
const float ServoMin = 0.0012f; // サーボの最小パルス長(s)
const float Stabilize = 0.0f; // 滑空安定時の引っ張り量
const float Turn = 25.0f; // 旋回時の引っ張り量
-const float PullRate = 5.0f; // 紐の引っ張り速度
+const float PullRate = 7.5f; // 紐の引っ張り速度
const float PullMax = 25.0f; // 引っ張れる紐の最大量(mm)
const float BorderSpiral = 40.0f; // スパイラル検知角度
const short BorderOpt = 30000; // 光センサーの閾値
@@ -39,7 +50,6 @@
const float Alpha = 30.0f; // 目標方向と自分の進行方向との差の閾値(deg)(制御則1&2&3の定数
const float Beta = 60.0f; // 目標方向と自分の進行方向との間に取るべき角度差(deg)(制御則3の定数
const float BorderDistance = 5.0f; // 落下制御に入るための目標値との距離の閾値(m)(制御則2の定数
-const float BorderHeight = 10.0f; // 制御則3と2を切り替える高度の閾値(m)
enum Direction {LEFT, RIGHT, NEUTRAL};
@@ -67,8 +77,8 @@
Timer timer; // 時間計測用タイマー
Direction dir = NEUTRAL; // 旋回方向
-int lps_cnt = 0; // 気圧センサ読み取りカウント
-bool INT_flag = true; // 割り込み可否フラグ
+volatile int lps_cnt = 0; // 気圧センサ読み取りカウント
+volatile bool INT_flag = true; // 割り込み可否フラグ
/* こちらの変数群はメインループでは参照しない */
Vector raw_acc(3); // 加速度(m/s^2) 生
Vector raw_gyro(3); // 角速度(deg/s) 生
@@ -102,8 +112,8 @@
Vector r_u(3); // 世界座標に固定された、上向きのベクトル(Z軸)
Vector r_l(3); // 世界座標に固定された、西向きのベクトル(Y軸)
-float pull_L = 0.0f; // 左サーボの引っ張り量(目標値)(mm:0~PullMax)
-float pull_R = 0.0f; // 右サーボの引っ張り量(目標値)(mm:0~PullMax)
+float pull_L = 10.0f; // 左サーボの引っ張り量(目標値)(mm:0~PullMax)
+float pull_R = 10.0f; // 右サーボの引っ張り量(目標値)(mm:0~PullMax)
float yaw = 0.0f; // 本体のヨー角(deg)z軸周り
float pitch = 0.0f; // 本体のピッチ角(deg)y軸周り
@@ -111,12 +121,15 @@
float vrt_acc = 0.0f; // 鉛直方向の加速度成分(落下検知に使用)
-int step = 0; // シーケンス制御のステップ
+volatile int step = 0; // シーケンス制御のステップ
char data[512] = {}; // 送信データ用配
int loopTime = 0; // 1ループに掛かる時間(デバッグ用
float sv = 0.0f; // サーボ電源電圧
float lv = 0.0f; // ロジック電源電圧
+#ifdef RULE3_1
+float beta = 0.0f; // β変数 (制御則3_1で使用
+#endif
/** config.txt **
* #から始めるのはコメント行
* #イコールの前後に空白を入れない
@@ -242,13 +255,17 @@
if(xbee.readable()) {
char cmd = xbee.getc();
if(cmd == 'w') {
- pull_R += 5.0f;
+ pull_R = 20.0f;
+ pull_L = 0.0f;
} else if(cmd == 's'){
- pull_R -= 5.0f;
+ pull_R = 10.0f;
+ pull_L = 10.0f;
} else if(cmd == 'a'){
- pull_L += 5.0f;
+ pull_R = 0.0f;
+ pull_L = 20.0f;
} else if(cmd == 'd'){
- pull_L -= 5.0f;
+ pull_R = 10.0f;
+ pull_L = 10.0f;
}
}
#else
@@ -261,7 +278,7 @@
// データをmicroSDに保存し、XBeeでPCへ送信する
- sprintf(data, "%d.%d, %.1f,%.1f,%.1f, %.3f,%.6f,%.6f, %.3f,%.3f,%.1f, %d, %d,%d\r\n",
+ sprintf(data, "%d.%d, %.1f,%.1f,%.1f, %.3f,%.6f,%.6f, %.3f,%.3f,%.1f, %d, %.1f,%.1f\r\n",
UTC_t, ss, yaw, pitch, roll,
press, gms.longitude, gms.latitude,
vrt_acc, height, Distance(target_p, p),
@@ -355,7 +372,7 @@
*/
void ControlRoutine()
{
- static int count = 0;
+ volatile static int count = 0;
static float target_lng;
static float target_lat;
static float target_X;
@@ -416,6 +433,16 @@
if(theta > 180.0f) theta -= 360.0f;
else if(theta < -180.0f) theta += 360.0f;
+#elif RULE3_1
+ float d = Distance(target_p, p);
+ beta = BetaMax - BetaVar * (int)(d / Span);
+ if(beta < BetaMin) beta = BetaMin;
+
+ theta = -atan2f( target_Y, target_X ) * RAD_TO_DEG + beta;
+
+ if(theta > 180.0f) theta -= 360.0f;
+ else if(theta < -180.0f) theta += 360.0f;
+
#else
theta = -atan2f( target_Y, target_X ) * RAD_TO_DEG;
#endif
@@ -787,9 +814,9 @@
*/
bool Thrown()
{
- static int opt_count = 0;
- static int g_count = 0;
- static int para_count = 0;
+ volatile static int opt_count = 0;
+ volatile static int g_count = 0;
+ volatile static int para_count = 0;
#ifndef SPIRAL_DEBUG
/*if(optSensor.read_u16() > BorderOpt) opt_count++;
@@ -816,8 +843,8 @@
void DataUpdate()
{
// サーボ用変数(引き量)
- static float pL = pull_L;
- static float pR = pull_R;
+ static float pL = 0.0f;
+ static float pR = 0.0f;
// 引き量が目標値から一定以上離れていれば、引き量を一定の速度で更新する
if(pull_L - pL > PullRate * dt) {