/// <summary> /// /// </summary> /// <param name="setPattern"></param> /// <param name="bForce">強制変更</param> /// <returns>変更したor済み..True</returns> public bool SetHeadMarkLED(CersioCtrl carCtrl, int setPattern, bool bForce = false) { if (bForce || (ptnHeadLED != setPattern && cntHeadLED == 0)) { carCtrl.SendCommand("AL," + setPattern.ToString() + ",\n"); cntHeadLED = 20 * 1; // しばらく変更しない ptnHeadLED = setPattern; return(true); } // 通常以外は、現在設定中でさらに送られてきたら延長 if (setPattern != (int)LED_PATTERN.Normal && ptnHeadLED == setPattern) { cntHeadLED = 10 * 1; // 占有時間延長 return(true); } return(false); }
// =========================================================================================================== /// <summary> /// コンストラクタ /// </summary> /// <param name="ceCtrl"></param> public Brain(CersioCtrl ceCtrl, string mapFileName ) { CarCtrl = ceCtrl; Reset(mapFileName); }
/// <summary> /// ログ用のバッファクリア /// </summary> /// <param name="BrainCtrl"></param> /// <param name="CersioCt"></param> /// <param name="LocSys"></param> public void LogBuffer_Clear(ref Brain BrainCtrl, ref CersioCtrl CersioCt) { if (null != CersioCt) { CersioCt.hwSendStr = ""; CersioCt.hwResiveStr = ""; } }
/// <summary> /// VehicleRunnerログ出力 /// </summary> public void Output_VRLog(ref Brain BrainCtrl, ref CersioCtrl CersioCt) { System.IO.StreamWriter sw = new System.IO.StreamWriter(saveLogFname, true, System.Text.Encoding.GetEncoding("shift_jis")); LocPreSumpSystem LocSys = BrainCtrl.LocSys; // 固有識別子 + 時間 sw.Write("LocPresumpLog:" + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff") + System.Environment.NewLine); // ハードウェア情報 if (CersioCt.TCP_IsConnected()) { if (null != CersioCt.hwSendStr) { sw.Write("hwSendStr:" + CersioCt.hwSendStr.Replace('\n', ' ') + System.Environment.NewLine); } if (null != CersioCt.hwResiveStr) { sw.Write("hwResiveStr:" + CersioCt.hwResiveStr + System.Environment.NewLine); } sw.Write("handle:" + CersioCtrl.nowSendHandleValue + " / acc:" + CersioCtrl.nowSendAccValue + System.Environment.NewLine); } else { sw.Write("Comment:No Connect BoxPC" + System.Environment.NewLine); } // 位置情報 { sw.Write("R1:X " + LocSys.R1.X.ToString("f3") + "/Y " + LocSys.R1.Y.ToString("f3") + "/ Dir " + LocSys.R1.Theta.ToString("f2") + System.Environment.NewLine); sw.Write("V1:X " + LocSys.V1.X.ToString("f3") + "/Y " + LocSys.V1.Y.ToString("f3") + "/ Dir " + LocSys.V1.Theta.ToString("f2") + System.Environment.NewLine); sw.Write("E1:X " + LocSys.E1.X.ToString("f3") + "/Y " + LocSys.E1.Y.ToString("f3") + "/ Dir " + LocSys.E1.Theta.ToString("f2") + System.Environment.NewLine); sw.Write("C1:X " + LocSys.C1.X.ToString("f3") + "/Y " + LocSys.C1.Y.ToString("f3") + "/ Dir " + LocSys.C1.Theta.ToString("f2") + System.Environment.NewLine); sw.Write("G1:X " + LocSys.G1.X.ToString("f3") + "/Y " + LocSys.G1.Y.ToString("f3") + "/ Dir " + LocSys.G1.Theta.ToString("f2") + System.Environment.NewLine); } // { // Rooting情報 { sw.Write("RTS_TargetIndex:" + BrainCtrl.RTS.GetNowCheckPointIdx() + System.Environment.NewLine); int tgtPosX = 0; int tgtPosY = 0; double tgtDir = 0; BrainCtrl.RTS.getNowTarget(ref tgtPosX, ref tgtPosY); BrainCtrl.RTS.getNowTargetDir(ref tgtDir); sw.Write("RTS_TargetPos:X " + tgtPosX.ToString("f3") + "/Y " + tgtPosY.ToString("f3") + "/Dir " + tgtDir.ToString("f2") + System.Environment.NewLine); sw.Write("RTS_Handle:" + BrainCtrl.RTS.getHandleValue().ToString("f2") + System.Environment.NewLine); } // Brain情報 { sw.Write("EBS_CautionLv:" + BrainCtrl.EBS.CautionLv.ToString() + System.Environment.NewLine); sw.Write("EHS_Handle:" + BrainCtrl.EHS.HandleVal.ToString("f2") + "/Result " + EmergencyHandring.ResultStr[(int)BrainCtrl.EHS.Result] + System.Environment.NewLine); } // CersioCtrl { sw.Write("GoalFlg:" + (BrainCtrl.goalFlg ? "TRUE" : "FALSE") + System.Environment.NewLine); if (CersioCt.bhwCompass) { sw.Write("hwCompass:"******"hwREPlot:X " + CersioCt.hwREX.ToString("f3") + "/Y " + CersioCt.hwREY.ToString("f3") + "/Dir " + CersioCt.hwREDir.ToString("f2") + System.Environment.NewLine); } if (CersioCt.bhwGPS) { sw.Write("hwGPS:X " + CersioCt.hwGPS_LandX.ToString("f5") + "/Y " + CersioCt.hwGPS_LandY.ToString("f5") + "/Dir " + CersioCt.hwGPS_MoveDir.ToString("f2") + System.Environment.NewLine); } } // 特記事項メッセージ出力 if (Brain.addLogMsg != null) { sw.Write("AddLog:" + Brain.addLogMsg + System.Environment.NewLine); } Brain.addLogMsg = null; } // 改行 sw.Write(System.Environment.NewLine); //閉じる sw.Close(); }
/// <summary> /// インジケータ描画 /// </summary> /// <param name="g"></param> /// <param name="baseY"></param> public void DrawIngicator(Graphics g, int baseY, ref CersioCtrl CersioCt, ref Brain BrainCtrl) { { // Handle int stX = 20; int stY = baseY + 8; int Wd = 200; int Ht = 15; float handleVal = (float)((Wd / 2) * (-CersioCtrl.nowSendHandleValue)); if (handleVal > 0) { g.FillRectangle(Brushes.Red, stX + Wd / 2, stY, handleVal, Ht); } else { g.FillRectangle(Brushes.Red, stX + Wd / 2 + handleVal, stY, -handleVal, Ht); } g.DrawRectangle(Pens.White, stX, stY, Wd, Ht); g.DrawLine(Pens.White, stX + Wd / 2, stY, stX + Wd / 2, stY + Ht); g.DrawString("Handle", fntMini, Brushes.White, stX + Wd / 2 - 38 / 2, stY + Ht - fntMini.GetHeight()); // ACC stX = 40; stY = baseY + 30; Wd = 10; Ht = 40; float accVal = (float)(Ht * CersioCtrl.nowSendAccValue); g.FillRectangle(Brushes.Red, stX, stY + Ht - accVal, Wd, accVal); g.DrawRectangle(Pens.White, stX, stY, Wd, Ht); g.DrawString("Acc", fntMini, Brushes.White, stX - 35, stY + Ht - fntMini.GetHeight()); } // Compus if (CersioCt.bhwCompass) { int ang = CersioCt.hwCompass; DrawMaker(g, Brushes.Red, 90, baseY + 50, ang, 12); g.DrawString(ang.ToString(), fntMini, Brushes.White, 90 - 25, baseY + 50); g.DrawString("Compus", fntMini, Brushes.White, 90 - 25, baseY + 50 + 14); } // RE Dir if (CersioCt.bhwREPlot) { double ang = CersioCt.hwREDir; DrawMaker(g, Brushes.Purple, 150, baseY + 50, ang, 12); g.DrawString(ang.ToString("F1"), fntMini, Brushes.White, 150 - 25, baseY + 50); g.DrawString("R.E.Dir", fntMini, Brushes.White, 150 - 25, baseY + 50 + 14); } // GPS Dir if (CersioCt.bhwGPS) { if (CersioCt.bhwUsbGPS) { // USBGPSは角度あり DrawMaker(g, Brushes.LimeGreen, 210, baseY + 50, CersioCt.hwGPS_MoveDir, 12); } else { // bServerGPS 角度なし DrawMaker(g, Brushes.LimeGreen, 210, baseY + 50, 12); } g.DrawString("GPSDir", fntMini, Brushes.White, 210 - 25, baseY + 50 + 14); } // 向けたいハンドル角度 { double ang = BrainCtrl.RTS.getNowTargetStearingDir(); DrawMaker(g, Brushes.Cyan, 40, baseY + 120, ang, 12); g.DrawString(ang.ToString("F1"), fntMini, Brushes.White, 40 - 25, baseY + 120); g.DrawString("Handle", fntMini, Brushes.White, 40 - 25, baseY + 120 + 14); } // 現在の向き { double ang = BrainCtrl.RTS.getNowDir(); DrawMaker(g, Brushes.Red, 100, baseY + 120, ang, 12); g.DrawString(ang.ToString("F1"), fntMini, Brushes.White, 100 - 25, baseY + 120); g.DrawString("RTSNow", fntMini, Brushes.White, 100 - 25, baseY + 120 + 14); } // 相手の向き { double ang = BrainCtrl.RTS.getNowTargetDir(); DrawMaker(g, Brushes.Purple, 160, baseY + 120, ang, 12); g.DrawString(ang.ToString("F1"), fntMini, Brushes.White, 160 - 25, baseY + 120); g.DrawString("RTSTgt", fntMini, Brushes.White, 160 - 25, baseY + 120 + 14); } }
//static int areaMapDrawCnt = 0; public void AreaMap_Draw_WorldMap(Graphics g, ref CersioCtrl CersioCt, ref Brain BrainCtrl) { LocPreSumpSystem LocSys = BrainCtrl.LocSys; // 全体マップ描画 float viewScale; g.FillRectangle(Brushes.Black, 0, 0, worldMapBmp.Width, worldMapBmp.Height); if (((float)LocSys.worldMap.WorldSize.w / (float)worldMapBmp.Width) < ((float)LocSys.worldMap.WorldSize.h / (float)worldMapBmp.Height)) { viewScale = (float)(1.0 / ((float)LocSys.worldMap.WorldSize.h / (float)worldMapBmp.Height)); } else { viewScale = (float)(1.0 / ((float)LocSys.worldMap.WorldSize.w / (float)worldMapBmp.Width)); } //g.ResetTransform(); //g.TranslateTransform(-ctrX, -ctrY, MatrixOrder.Append); //g.RotateTransform((float)layer.wAng, MatrixOrder.Append); //g.ScaleTransform(viewScale, viewScale, MatrixOrder.Append); if (null != worldMapBmp) { g.DrawImage(worldMapBmp, 0, 0); } //g.ResetTransform(); // 各マーカーの位置を描画 LocSys.DrawWorldMap(g, viewScale); // ターゲット描画 if (null != CersioCt) { int tgtPosX, tgtPosY; double dir = 0; tgtPosX = tgtPosY = 0; BrainCtrl.RTS.getNowTarget(ref tgtPosX, ref tgtPosY); BrainCtrl.RTS.getNowTargetDir(ref dir); MarkPoint tgtMk = new MarkPoint(tgtPosX, tgtPosY, dir + 180); DrawMaker(g, viewScale, tgtMk, Brushes.GreenYellow, 8); // ターゲットまでのライン DrawMakerLine(g, viewScale, LocSys.R1, tgtMk, Pens.Olive, 1); } }
/// <summary> /// エリアマップ描画 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void AreaMap_Draw_Area(Graphics g, ref CersioCtrl CersioCt, ref Brain BrainCtrl) { // 書き換えBMP(追加障害物)描画 LocPreSumpSystem LocSys = BrainCtrl.LocSys; // エリアマップ描画 //g.FillRectangle(Brushes.Black, 0, 0, picbox_AreaMap.Width, picbox_AreaMap.Height); g.DrawImage(LocSys.AreaOverlayBmp, 0, 0); // ターゲット描画 if (null != CersioCt) { int tgtPosX, tgtPosY; double dir = 0; tgtPosX = tgtPosY = 0; float olScale = (float)LocSys.AreaOverlayBmp.Width / (float)LocSys.AreaBmp.Width; BrainCtrl.RTS.getNowTarget(ref tgtPosX, ref tgtPosY); BrainCtrl.RTS.getNowTargetDir(ref dir); MarkPoint tgtMk = new MarkPoint(LocSys.worldMap.GetAreaX(tgtPosX), LocSys.worldMap.GetAreaY(tgtPosY), dir); DrawMaker(g, olScale, tgtMk, Brushes.GreenYellow, 8); // ターゲットまでのライン DrawMakerLine(g, olScale, new MarkPoint(LocSys.worldMap.GetAreaX(LocSys.R1.X), LocSys.worldMap.GetAreaY(LocSys.R1.Y), 0), tgtMk, Pens.Olive, 1); } }
// ================================================================================================================ /// <summary> /// コンストラクタ /// </summary> public VehicleRunnerForm() { InitializeComponent(); formLog.init(); // セルシオコントローラ初期化 CersioCt = new CersioCtrl(); // BoxPc(bServer) Emu接続 // 起動時にレスポンスの早いエミュレータをつなぎにいく // エミュレータがなければ、リトライ時 実機のbServerにつなぎにいく //bServerConnectAsync(); CersioCt.ConnectBoxPC_Emulator(); // ブレイン起動 BrainCtrl = new Brain(CersioCt, defaultMapFile); // 初期ボタン設定セット rb_Move_CheckedChanged(null, null); rb_Dir_CheckedChanged(null, null); // 自己位置補正設定 切り替え cb_VRRevision_CheckedChanged(null, null); // マップウィンドウサイズのbmp作成 formDraw.MakePictureBoxWorldMap(BrainCtrl.LocSys.worldMap.mapBmp, picbox_AreaMap); // LRF 入力スケール調整反映 tb_LRFScale.Text = trackBar_LRFViewScale.Value.ToString(); //btm_LRFScale_Click(null, null); tb_LRFScale_TextChanged(null, null); // センサー値取得 スレッド起動 Thread trdSensorLRF = new Thread(new ThreadStart(ThreadSensorUpdate_LRF)); trdSensorLRF.IsBackground = true; // アプリの終了とともに終了する trdSensorLRF.Priority = ThreadPriority.AboveNormal; trdSensorLRF.Start(); Thread trdSensor = new Thread(new ThreadStart(ThreadSensorUpdate_bServer)); trdSensor.IsBackground = true; trdSensor.Priority = ThreadPriority.AboveNormal; trdSensor.Start(); // 位置座標更新 スレッド起動 /* Thread trdLocalize = new Thread(new ThreadStart(ThreadLocalizationUpdate)); trdLocalize.IsBackground = true; //trdSensor.Priority = ThreadPriority.AboveNormal; trdLocalize.Start(); */ #if EMULATOR_MODE // LRF エミュレーション tb_LRFIpAddr.Text = "127.0.0.10"; #endif }