Ejemplo n.º 1
0
        /// <summary>
        /// 自律走行処理 定期更新(100ms)
        /// </summary>
        /// <param name="bRunAutonomous"></param>
        /// <param name="bMoveBaseCtrl"></param>
        /// <param name="SpeedKmh"></param>
        /// <returns></returns>
        public bool AutonomousProc(bool bRunAutonomous, bool bMoveBaseCtrl, double SpeedKmh)
        {
            // 自立走行に切り替わった瞬間か?
            bool trgRunAutonomous = (bRunAutonomousOld != bRunAutonomous && bRunAutonomous) ? true : false;

            UpdateCnt++;

            // すべてのルートを回りゴールした。
            if (goalFlg)
            {
                CarCtrl.nowAccValue    = 0.0;
                CarCtrl.nowHandleValue = 0.0f;
                // 停止
                CarCtrl.SetCommandAC(0.0, 0.0);

                // スマイル
                CarCtrl.SetHeadMarkLED(LEDControl.LED_PATTERN.Smile);

                return(goalFlg);
            }


            // 現在座標更新
            LocSys.RTS.SetNowPostion(LocSys.GetResultLocationX(),
                                     LocSys.GetResultLocationY(),
                                     LocSys.GetResultAngle());

            // チェックポイント送信
            {
                // チェックポイントをROSへ指示(bServer接続時も配信)
                if (LocSys.RTS.TrgCheckPoint() || trg_bServerConnect || trgRunAutonomous)
                {
                    Vector3 checkPnt = LocSys.RTS.GetCheckPointToWayPoint();// LocSys.RTS.getNowCheckPoint();
                    CarCtrl.SetCommandAG(checkPnt.x, checkPnt.y, checkPnt.z);
                }

                // 再スタート時
                if (trgRunAutonomous)
                {
                    //  0.0を一度送信
                    ModeCtrl.SetActionMode(ModeControl.ActionMode.CheckPoint);
                    CarCtrl.SetCommandAC(0.0, 0.0);
                    CarCtrl.nowAccValue    = 0.0;
                    CarCtrl.nowHandleValue = 0.0;
                    noFowrdCnt             = 0;
                    noPowerTrainCnt        = 0;
                }
            }

            // LED指示
            LedUpdate(bRunAutonomous);

            // モード更新
            ModeCtrl.Update(LocSys.GetResultDistance_mm());

            // ルート計算
            LocSys.RTS.CalcRooting(bRunAutonomous);

            if (bRunAutonomous)
            {
                // 走行指示出力

                /*
                 * // ROSの回転角度から、Benzハンドル角度の上限に合わせる
                 * double angLimit = (CarCtrl.hwMVBS_Ang * 180.0 / Math.PI);
                 * if (angLimit > 30.0) angLimit = 30.0;
                 * if (angLimit < -30.0) angLimit = -30.0;
                 *
                 *
                 * double moveAng = -(angLimit / 30.0);//-CarCtrl.hwMVBS_Ang;// * 0.3;
                 */
                double moveAng = CarCtrl.hwMVBS_Ang * 2.0;

                if (ModeCtrl.GetActionMode() == ModeControl.ActionMode.CheckPoint)
                {
                    // モード:チェックポイント目指す

                    if (bMoveBaseCtrl)
                    {
                        // move_baseコントロール
                        if (CarCtrl.hwMVBS_X > 0.0)
                        {
                            // move_baseから前進指示の場合
                            double speedRate = CarCtrl.hwMVBS_X;

                            // ハンドルで曲がるときは、速度を下げる
                            if (Math.Abs(moveAng) > 0.25)
                            {
                                speedRate *= 0.75;
                            }

                            CarCtrl.CalcHandleAccelControl(moveAng, CarCtrl.CalcAccelFromSpeed(SpeedKmh * speedRate, true));
                            //CarCtrl.SendCalcHandleAccelControl(moveAng, getAccelValue()*0.5);
                            ModeCtrl.TmpCnt = 0;
                        }
                        else
                        {
                            // move_baseから前進指示なし
                            ModeCtrl.TmpCnt++;
                            // 0.5秒
                            if (ModeCtrl.TmpCnt > 5)
                            {
                                ModeCtrl.SetActionMode(ModeControl.ActionMode.EmergencyStop);
                            }
                        }

                        // ACコマンド送信
                        CarCtrl.SetCommandAC(CarCtrl.nowHandleValue, CarCtrl.nowAccValue);
                    }
                    else
                    {
                        // VR コントロール
                        // ルートにそったハンドル、アクセル値を取得
                        double handleTgt = LocSys.RTS.GetHandleValue();
                        //double accTgt = LocSys.RTS.GetAccelValue();

                        double speedRate = 1.0;

                        // ハンドルで曲がるときは、速度を下げる
                        if (Math.Abs(handleTgt) > 0.25)
                        {
                            speedRate = 0.75;
                        }

                        CarCtrl.CalcHandleAccelControl(handleTgt, CarCtrl.CalcAccelFromSpeed(SpeedKmh * speedRate, true));

                        // ACコマンド送信
                        CarCtrl.SetCommandAC(CarCtrl.nowHandleValue, CarCtrl.nowAccValue);
                    }

                    // 共通処理

                    // 動輪の状態確認
                    if (CarCtrl.sendAccelValue >= 0.1)
                    {
                        // 動力出力指示にかかわらず、(速度50mm/s以下)
                        if (CarCtrl.nowSpeedMmSec <= 50.0)
                        {
                            // スタック(前進不能)カウンタ
                            noFowrdCnt++;
                            if (noFowrdCnt > 1000)
                            {
                                // バックで脱出を試みる
                                ModeCtrl.SetActionMode(ModeControl.ActionMode.MoveBack);
                                CarCtrl.nowAccValue = 0.0;
                                noFowrdCnt          = 0;
                            }

                            // 動力出力指示にかかわらずほぼ静止(速度10mm/s以下)
                            if (CarCtrl.nowSpeedMmSec <= 10.0)
                            {
                                // 動力カット状態カウンタ
                                noPowerTrainCnt++;

                                // 10秒以上経過
                                if (noPowerTrainCnt > 100)
                                {
                                    // 出力0%から再スタート
                                    CarCtrl.nowAccValue = 0.0;
                                    noPowerTrainCnt     = 0;
                                }
                            }
                        }
                        else
                        {
                            // 指示どおり走行している状態
                            noPowerTrainCnt = 0;
                            noFowrdCnt      = 0;
                        }
                    }
                    else
                    {
                        // 指示通り静止している状態
                    }
                }
                else if (ModeCtrl.GetActionMode() == ModeControl.ActionMode.EmergencyStop)
                {
                    if (ModeCtrl.GetActionCount() < 5)
                    {
                        // 徐行
                        CarCtrl.nowAccValue = 0.1;
                        CarCtrl.CalcHandleAccelControl(moveAng, CarCtrl.nowAccValue);
                    }
                    else
                    {
                        // move_baseから停止状態
                        //double speedRate = CarCtrl.hwMVBS_X;
                        //speedRate *= 0.75;

                        if (CarCtrl.hwMVBS_X > 0.0)
                        {
                            // 徐行解除
                            ModeCtrl.SetActionMode(ModeControl.ActionMode.CheckPoint);
                        }
                        else
                        {
                            ModeCtrl.TmpCnt++;

                            // その場、回転
                            if (Math.Abs(CarCtrl.hwMVBS_Ang) >= 0.01)
                            {
                                // 減速 [0.5km/h]
                                //CarCtrl.CalcHandleAccelControl(0.0, 0.0);
                                CarCtrl.CalcHandleAccelControl(moveAng, CarCtrl.CalcAccelFromSpeed(0.25, true));

                                if (ModeCtrl.TmpCnt > 20)
                                {
                                    // Back モード変更
                                    ModeCtrl.SetActionMode(ModeControl.ActionMode.MoveBack);
                                    CarCtrl.nowAccValue = 0.0;
                                }
                            }
                            else
                            {
                                // 停止
                                if (ModeCtrl.TmpCnt > 20)
                                {
                                    ModeCtrl.SetActionMode(ModeControl.ActionMode.EmergencyStop);
                                }
                            }
                        }
                    }

                    // ACコマンド送信
                    CarCtrl.SetCommandAC(CarCtrl.nowHandleValue, CarCtrl.nowAccValue);
                }
                else if (ModeCtrl.GetActionMode() == ModeControl.ActionMode.StackStop)
                {
                    // 完全停止
                    if (ModeCtrl.GetModePassSeconds() > 8)
                    {
                        ModeCtrl.SetActionMode(ModeControl.ActionMode.EmergencyStop);
                    }
                }
                else if (ModeCtrl.GetActionMode() == ModeControl.ActionMode.MoveBack)
                {
                    // モード:バック動作
                    if (ModeCtrl.GetActionCount() == 0)
                    {
                        // 逆ハンドル設定
                        if (Math.Abs(CarCtrl.nowTargetHandle) > 0.1)
                        {
                            backHandle = -CarCtrl.nowTargetHandle;
                        }
                        else
                        {
                            backHandle = -LocSys.RTS.GetHandleValue();
                        }
                    }

                    if (ModeCtrl.GetActionCount() < 5)
                    {
                        // スピコンブレーキ解除
                        CarCtrl.SetCommandAC(0.0, 0.0);
                    }
                    else
                    {
                        // 400mm バック
                        //if (ModeCtrl.GetModePassSeconds() > 3)
                        if (ModeCtrl.PassDistanceMm() > 400.0)
                        {
                            // 復旧
                            ModeCtrl.SetActionMode(ModeControl.ActionMode.CheckPoint);
                            CarCtrl.nowAccValue = 0.0;

                            // チェックポイント再送
                            {
                                Vector3 checkPnt = LocSys.RTS.GetCheckPointToWayPoint();
                                CarCtrl.SetCommandAG(checkPnt.x, checkPnt.y, checkPnt.z);
                            }
                        }
                        else
                        {
                            // ハンドル維持して、バック
                            CarCtrl.CalcHandleAccelControl(backHandle, CarCtrl.CalcAccelFromSpeed(SpeedKmh * 0.5, false));
                        }

                        // ACコマンド送信
                        CarCtrl.SetCommandAC(CarCtrl.nowHandleValue, CarCtrl.nowAccValue);
                    }
                }
                else
                {
                    // モード:未設定
                    ModeCtrl.SetActionMode(ModeControl.ActionMode.CheckPoint);
                }
            }
            else
            {
                // 走行指示出力しない
                CarCtrl.nowAccValue    = 0.0;
                CarCtrl.nowHandleValue = 0.0f;

                ModeCtrl.SetActionMode(ModeControl.ActionMode.CheckPoint);
            }

            // 接続トリガ取得
            trg_bServerConnect = false;
            if (!bServerConnectFlg && CarCtrl.TCP_IsConnected())
            {
                trg_bServerConnect = true;
            }

            bServerConnectFlg = CarCtrl.TCP_IsConnected();

            bRunAutonomousOld = bRunAutonomous;

            // ゴール状態取得
            goalFlg = LocSys.RTS.GetGoalStatus();

            return(goalFlg);
        }
        /// <summary>
        /// 描画と親密な定期処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tm_Update_Tick(object sender, EventArgs e)
        {
            if (null != BrainCtrl && null != BrainCtrl.LocSys)
            {
                LocationSystem LocSys = BrainCtrl.LocSys;

                // tm_UpdateHw_Tick
                {
                    // 実走行時、bServerと接続が切れたら再接続
                    if (updateHwCnt % 100 == 0)
                    {
                        // 切断状態なら、自動接続
                        if (!CersioCt.TCP_IsConnected())
                        {
                            //
                            //CersioCt.Connect_bServer_Async(bServerEmuAddr);
                            CersioCt.Connect_bServer_Async(bServerAddr);
                        }
                    }

                    // ロータリーエンコーダ(タイヤ回転数)情報
                    if (CersioCt.bhwRE)
                    {
                        //lbl_RErotR.Text = CersioCt.hwRErotR.ToString("f1");
                        //lbl_RErotL.Text = CersioCt.hwRErotL.ToString("f1");
                        dataGridViewReceiveData.Rows[(int)GeridRow.RE].Cells[1].Value = "L:" + CersioCt.hwRErotL.ToString("f1");
                        dataGridViewReceiveData.Rows[(int)GeridRow.RE].Cells[2].Value = "R:" + CersioCt.hwRErotR.ToString("f1");
                    }

                    // AMCL
                    LocSys.Input_ROSPosition(CersioCt.hwAMCL_X, CersioCt.hwAMCL_Y, CersioCt.hwAMCL_Ang);
                    if (CersioCt.bhwTrgAMCL)
                    {
                        // 受信再開時の初期化
                        LocSys.Reset_ROSPosition(CersioCt.hwAMCL_X, CersioCt.hwAMCL_Y, CersioCt.hwAMCL_Ang);
                        CersioCt.bhwTrgAMCL = false;
                    }

                    // VehicleRunner Plot
                    {
                        PointD wlPos = new PointD();
                        REncoderToMap.CalcWheelPlotXY(ref wlR, ref wlL, ref reAng,
                                                      CersioCt.hwRErotR,
                                                      CersioCt.hwRErotL,
                                                      reOldR,
                                                      reOldL);

                        wlPos.X = (wlR.X + wlL.X) * 0.5;
                        wlPos.Y = (wlR.Y + wlL.Y) * 0.5;

                        LocSys.Input_REPosition(wlPos.X, wlPos.Y, -reAng);

                        reOldR = CersioCt.hwRErotR;
                        reOldL = CersioCt.hwRErotL;
                    }

                    // LED状態 画面表示
                    if (CersioCt.LEDCtrl.ptnHeadLED == -1)
                    {
                        //lbl_LED.Text = "ND";
                        dataGridViewReceiveData.Rows[(int)GeridRow.LED].Cells[1].Value = "None";
                    }
                    else
                    {
                        string ledStr = CersioCt.LEDCtrl.ptnHeadLED.ToString();

                        if (CersioCt.LEDCtrl.ptnHeadLED >= 0 && CersioCt.LEDCtrl.ptnHeadLED < LEDControl.LEDMessage.Count())
                        {
                            ledStr += "," + LEDControl.LEDMessage[CersioCt.LEDCtrl.ptnHeadLED];
                        }

                        dataGridViewReceiveData.Rows[(int)GeridRow.LED].Cells[1].Value = ledStr;

                        /*
                         * if (!ledStr.Equals(lbl_LED.Text))
                         * {
                         *  lbl_LED.Text = ledStr;
                         * }*/
                    }

                    // 現在座標 表示
                    //lbl_REPlotX.Text = LocSys.GetResultLocationX().ToString("F2");
                    //lbl_REPlotY.Text = LocSys.GetResultLocationY().ToString("F2");
                    //lbl_REPlotDir.Text = LocSys.GetResultAngle().ToString("F2");
                    dataGridViewReceiveData.Rows[(int)GeridRow.Plot].Cells[1].Value = LocSys.GetResultLocationX().ToString("F2");
                    dataGridViewReceiveData.Rows[(int)GeridRow.Plot].Cells[2].Value = LocSys.GetResultLocationY().ToString("F2");
                    dataGridViewReceiveData.Rows[(int)GeridRow.Plot].Cells[3].Value = LocSys.GetResultAngle().ToString("F2");

                    // CheckPointIndex
                    if (BrainCtrl.LocSys.RTS.TrgCheckPoint())
                    {
                        // チェックポイント通過時に表示更新
                        numericUD_CheckPoint.Value = BrainCtrl.LocSys.RTS.GetCheckPointIdx();
                    }

                    // BoxPC接続状態確認
                    if (CersioCt.TCP_IsConnected())
                    {
                        // 接続OK
                        tb_SendData.BackColor       = Color.Lime;
                        tb_ResiveData.BackColor     = Color.Lime;
                        lb_BServerConnect.Text      = "bServer [" + CersioCt.TCP_GetConnectedAddr() + "] 接続OK";
                        lb_BServerConnect.BackColor = Color.Lime;
                    }
                    else
                    {
                        // 接続NG
                        tb_SendData.BackColor       = SystemColors.Window;
                        tb_ResiveData.BackColor     = SystemColors.Window;
                        lb_BServerConnect.Text      = "bServer 未接続";
                        lb_BServerConnect.BackColor = SystemColors.Window;
                    }

                    // 送受信文字 画面表示
                    if (!string.IsNullOrEmpty(CersioCt.hwResiveStr))
                    {
                        tb_ResiveData.Text   = CersioCt.hwResiveStr.Replace('\n', ' ');
                        CersioCt.hwResiveStr = "";
                    }
                    if (!string.IsNullOrEmpty(CersioCt.hwSendStr))
                    {
                        tb_SendData.Text   = CersioCt.hwSendStr.Replace('\n', ' ');
                        CersioCt.hwSendStr = "";
                    }

                    updateHwCnt++;
                }

                // マップ上の現在位置更新
                // 現在位置を、AMCL,REPlotどちらを使うか
                LocationSystem.LOCATION_SENSOR selSensor = (rb_SelAMCL.Checked ? LocationSystem.LOCATION_SENSOR.AMCL : LocationSystem.LOCATION_SENSOR.REPlot);
                BrainCtrl.LocSys.update_NowLocation(selSensor);

                // 自律走行(緊急ブレーキ、壁よけ含む)処理 更新
                double speedKmh = (double)numericUpDownCtrlSpeed.Value;
                BrainCtrl.AutonomousProc(bRunAutonomous, cb_MoveBaseControl.Checked, speedKmh);

                // 距離計
                //tb_Trip.Text = (LocSys.GetResultDistance_mm() * (1.0 / 1000.0)).ToString("f2");
                tb_Trip.Text = (CersioCt.nowLengthMm * (1.0 / 1000.0)).ToString("f2");
            }

            // スピード表示
            tb_RESpeed.Text = ((CersioCt.nowSpeedMmSec * 3600.0) / (1000.0 * 1000.0)).ToString("f2");    // Km/Hour
            //tb_RESpeed.Text = (CersioCt.SpeedMmSec).ToString("f2"); // mm/Sec


            // ACコマンド送信した ハンドル、アクセル値 表示
            tb_AccelVal.Text  = CersioCt.sendAccelValue.ToString("f2");
            tb_HandleVal.Text = CersioCt.sendHandleValue.ToString("f2");

            //labelMoveBaseX.Text = CersioCt.hwMVBS_X.ToString("f2");
            //labelMoveBaseAng.Text = CersioCt.hwMVBS_Ang.ToString("f2");

            // グリッド表示
            dataGridViewReceiveData.Rows[(int)GeridRow.MoveBase].Cells[1].Value = CersioCt.hwMVBS_X.ToString("f2");
            dataGridViewReceiveData.Rows[(int)GeridRow.MoveBase].Cells[2].Value = CersioCt.hwMVBS_Y.ToString("f2");
            dataGridViewReceiveData.Rows[(int)GeridRow.MoveBase].Cells[3].Value = CersioCt.hwMVBS_Ang.ToString("f2");

            dataGridViewReceiveData.Rows[(int)GeridRow.CmdVel].Cells[1].Value = CersioCt.nowAccValue.ToString("f2");
            dataGridViewReceiveData.Rows[(int)GeridRow.CmdVel].Cells[2].Value = "0.00";
            dataGridViewReceiveData.Rows[(int)GeridRow.CmdVel].Cells[3].Value = CersioCt.nowHandleValue.ToString("f2");

            dataGridViewReceiveData.Rows[(int)GeridRow.ActionMode].Cells[1].Value = BrainCtrl.ModeCtrl.GetActionModeString();

            dataGridViewReceiveData.Rows[(int)GeridRow.StackCnt].Cells[1].Value = BrainCtrl.noPowerTrainCnt.ToString();
            dataGridViewReceiveData.Rows[(int)GeridRow.StackCnt].Cells[2].Value = BrainCtrl.noFowrdCnt.ToString();

            // 自律走行情報
            if (bRunAutonomous)
            {
                // 動作内容TextBox表示
                lbl_ActionMode.Text = "自律走行[" + BrainCtrl.ModeCtrl.GetActionModeString() + "]";
            }
            else
            {
                lbl_ActionMode.Text = "モニタリング モード";
            }

            // 画面描画
            PictureUpdate();
        }
        /// <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();
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 描画と親密な定期処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tm_Update_Tick(object sender, EventArgs e)
        {
            if (null != BrainCtrl && null != BrainCtrl.LocSys)
            {
                LocPreSumpSystem LocSys = BrainCtrl.LocSys;

                // tm_UpdateHw_Tick
                {
#if !UnUseLRF
                    // LRF接続状況 表示
                    if (LocSys.LRF.IsConnect())
                    {
                        // LRFから取得
                        if (LocSys.LRF.isGetDatas)
                        {
                            lb_LRFResult.Text = "OK";                           // 接続して、データも取得
                        }
                        else
                        {
                            lb_LRFResult.Text = "OK(noData)";       // 接続しているが、データ取得ならず
                        }
                    }
                    else
                    {
                        // 仮想マップから取得
                        lb_LRFResult.Text = "Disconnect";
                    }
#endif

                    // 実走行時、bServerと接続が切れたら再接続
                    if (updateHwCnt % 100 == 0)
                    {
                        // 状態を見て、自動接続
                        if (!CersioCt.TCP_IsConnected())
                        {
                            CersioCt.ConnectBoxPC_Async();
                        }
                    }

                    // ロータリーエンコーダ(Plot座標)情報
                    if (CersioCt.bhwREPlot)
                    {
                        // 自己位置に REPlot情報を渡す
                        LocSys.Input_RotaryEncoder(CersioCt.hwREX, CersioCt.hwREY, CersioCt.hwREDir);

                        // 受信情報を画面に表示
                        lbl_REPlotX.Text   = CersioCt.hwREX.ToString("f1");
                        lbl_REPlotY.Text   = CersioCt.hwREY.ToString("f1");
                        lbl_REPlotDir.Text = CersioCt.hwREDir.ToString("f1");
                    }

                    // ロータリーエンコーダ(タイヤ回転数)情報
                    if (CersioCt.bhwRE)
                    {
                        if (CersioCt.bhwCompass)
                        {
                            // 自己位置に情報を渡す
                            LocSys.Input_RotaryEncoder_Pulse(CersioCt.hwRErotL, CersioCt.hwRErotR, CersioCt.hwCompass);
                        }

                        lbl_RErotR.Text = CersioCt.hwRErotR.ToString("f1");
                        lbl_RErotL.Text = CersioCt.hwRErotL.ToString("f1");
                    }

                    // 地磁気情報
                    if (CersioCt.bhwCompass)
                    {
                        // 自己位置推定に渡す
                        LocSys.Input_Compass(CersioCt.hwCompass);

                        // 画面表示
                        lbl_Compass.Text = CersioCt.hwCompass.ToString();
                    }

                    // GPS情報
                    if (CersioCt.bhwGPS)
                    {
                        // 途中からでもGPSのデータを拾う
                        if (!LocPreSumpSystem.bEnableGPS)
                        {
                            // 応対座標算出のために、取得開始時点のマップ座標とGPS座標をリンク
                            LocPreSumpSystem.Set_GPSStart(CersioCt.hwGPS_LandX,
                                                          CersioCt.hwGPS_LandY,
                                                          (int)(LocSys.R1.X + 0.5),
                                                          (int)(LocSys.R1.Y + 0.5));
                        }

                        // 自己位置推定に渡す
                        if (CersioCt.bhwUsbGPS)
                        {
                            // 角度情報あり
                            LocSys.Input_GPSData(CersioCt.hwGPS_LandX, CersioCt.hwGPS_LandY, CersioCt.hwGPS_MoveDir);
                        }
                        else
                        {
                            // 角度情報なし
                            LocSys.Input_GPSData(CersioCt.hwGPS_LandX, CersioCt.hwGPS_LandY);
                        }

                        // 画面表示
                        lbl_GPS_Y.Text = CersioCt.hwGPS_LandY.ToString("f5");
                        lbl_GPS_X.Text = CersioCt.hwGPS_LandX.ToString("f5");
                    }

                    // ROS LRF取得
                    if (rb_LRF_ROSnode.Checked)
                    {
                        // LRFのデータを外部から入力
                        LocSys.LRF.SetExtData(CersioCt.GetROS_LRFdata());
                    }

                    // AMCL
                    LocSys.Input_AMCLData(CersioCt.hwAMCL_X, CersioCt.hwAMCL_Y, CersioCt.hwAMCL_Ang);

                    // LED状態 画面表示
                    if (CersioCt.ptnHeadLED == -1)
                    {
                        lbl_LED.Text = "ND";
                    }
                    else
                    {
                        string ledStr = CersioCt.ptnHeadLED.ToString();

                        if (CersioCt.ptnHeadLED >= 0 && CersioCt.ptnHeadLED < CersioCtrl.LEDMessage.Count())
                        {
                            ledStr += "," + CersioCtrl.LEDMessage[CersioCt.ptnHeadLED];
                        }

                        if (!ledStr.Equals(lbl_LED.Text))
                        {
                            lbl_LED.Text = ledStr;
                        }
                    }

                    // BoxPC接続状態確認
                    if (CersioCt.TCP_IsConnected())
                    {
                        // 接続OK
                        tb_SendData.BackColor       = Color.Lime;
                        tb_ResiveData.BackColor     = Color.Lime;
                        lb_BServerConnect.Text      = "bServer [" + CersioCt.TCP_GetConnectedAddr() + "] 接続OK";
                        lb_BServerConnect.BackColor = Color.Lime;
                    }
                    else
                    {
                        // 接続NG
                        tb_SendData.BackColor       = SystemColors.Window;
                        tb_ResiveData.BackColor     = SystemColors.Window;
                        lb_BServerConnect.Text      = "bServer 未接続";
                        lb_BServerConnect.BackColor = SystemColors.Window;
                    }


                    // 送受信文字 画面表示
                    if (null != CersioCt.hwResiveStr)
                    {
                        tb_ResiveData.Text = CersioCt.hwResiveStr.Replace('\n', ' ');
                    }
                    if (null != CersioCt.hwSendStr)
                    {
                        tb_SendData.Text = CersioCt.hwSendStr.Replace('\n', ' ');
                    }

                    // USB GPSからの取得情報画面表示
                    if (null != usbGPS)
                    {
                        tb_SirialResive.Text = usbGPS.resiveStr;

                        if (!string.IsNullOrEmpty(usbGPS.resiveStr))
                        {
                            CersioCt.usbGPSResive.Add(usbGPS.resiveStr);
                        }
                        usbGPS.resiveStr = "";

                        if (CersioCt.usbGPSResive.Count > 30)
                        {
                            CersioCt.usbGPSResive.RemoveRange(0, CersioCt.usbGPSResive.Count - 30);
                        }
                    }

                    // bServerエミュレーション表記
                    lbl_bServerEmu.Visible = CersioCt.bServerEmu;

                    updateHwCnt++;
                }

                // マップ上の現在位置更新
                BrainCtrl.LocSys.update_NowLocation();

                // パーティクルフィルター自己位置推定 演算
                if (cb_VRRevision.Checked)
                {
                    // 常時PF演算
                    if (cb_AlwaysPFCalc.Checked)
                    {
                        BrainCtrl.LocSys.ParticleFilter_Update();
                    }

                    // 自己位置補正執行判断
                    {
                        // 補正執行フラグ
                        bool bRevisionIssue = false;

                        // ボタン操作、またはマップ情報から 補正要請があるか?
                        if ((bLocRivisionTRG || BrainCtrl.bRevisionRequest))
                        {
                            bRevisionIssue  = true;
                            bLocRivisionTRG = false;
                        }

                        // 一定時間で更新
                        if ((updateMainCnt % 30) == 0 && !cb_DontAlwaysRivision.Checked)
                        {
                            Brain.addLogMsg += "LocRivision:Timer(時間ごとの位置補正)\n";
                            bRevisionIssue   = true;
                        }

                        if (bRevisionIssue)
                        {
                            string logMsg;

                            // 自己位置補正
                            logMsg = LocSys.LocalizeRevision(rb_UseGPS_Revision.Checked);

                            // REPlotを補正後の位置座標でリセット
                            {
                                CersioCt.SendCommand_RE_Reset();

                                CersioCt.setREPlot_Start(LocSys.E1.X * LocSys.MapToRealScale,
                                                         LocSys.E1.Y * LocSys.MapToRealScale,
                                                         LocSys.E1.Theta);
                            }

                            Brain.addLogMsg += logMsg;
                        }
                    }
                }

                // MAP座標更新処理
                LocSys.MapArea_Update();

                // 自律走行(緊急ブレーキ、壁よけ含む)処理 更新
                BrainCtrl.AutonomousProc(cb_EmgBrake.Checked,
                                         cb_EHS.Checked,
                                         cb_InDoorMode.Checked,
                                         bRunAutonomous);
            }

            // REからのスピード表示
            tb_RESpeed.Text = CersioCtrl.SpeedMH.ToString("f1");

            // ハンドル、アクセル値 表示
            tb_AccelVal.Text  = CersioCtrl.nowSendAccValue.ToString("f2");
            tb_HandleVal.Text = CersioCtrl.nowSendHandleValue.ToString("f2");

            // 自律走行情報
            if (bRunAutonomous)
            {
                // 動作内容TextBox表示

                // エマージェンシーブレーキ 動作カラー表示
                if (null != BrainCtrl)
                {
                    if (BrainCtrl.EBS.EmgBrk && cb_EmgBrake.Checked)
                    {
                        cb_EmgBrake.BackColor = Color.Red;
                    }
                    else
                    {
                        cb_EmgBrake.BackColor = SystemColors.Control;
                    }

                    if (BrainCtrl.EHS.Result != EmergencyHandring.EHS_MODE.None && cb_EHS.Checked)
                    {
                        cb_EHS.BackColor = Color.Orange;
                    }
                    else
                    {
                        cb_EHS.BackColor = SystemColors.Control;
                    }

                    // UntiEBS Cnt
                    lbl_BackCnt.Text = "EBS cnt:" + BrainCtrl.EmgBrakeContinueCnt.ToString();
                    //lbl_BackProcess.Visible = BrainCtrl.bNowBackProcess;
                    lbl_BackProcess.Text = BrainCtrl.ModeCtrl.GetActionModeString();
                }
            }
            else
            {
                lbl_BackProcess.Text = "モニタリング";
            }


#if LOGWRITE_MODE
            // 自律走行、またはロギング中
            if (bRunAutonomous || bRunMappingAndLogging)
            {
                // ログファイル出力
                formLog.Output_VRLog(ref BrainCtrl, ref CersioCt);

#if LRFLOG_OUTPUT   // LRFログ出力
                // LRFログ出力
                // データ量が多いので、周期の長い定期処理で実行
                if (LocSys.LRF.IsConnect() && null != LocSys.LRF.getData())
                {
                    formLog.Output_LRFLog(LocSys.LRF.getData());
                }
#endif  // LRFLOG_OUTPUT

#if GPSLOG_OUTPUT // GPSログ出力
                if (null != usbGPS)
                {
                    // ログ出力
                    formLog.Output_GPSLog(usbGPS.resiveStr);
                }
#endif  // GPSLOG_OUTPUT
            }
#endif  // LOGWRITE_MODE

            // ログバッファクリア
            formLog.LogBuffer_Clear(ref BrainCtrl, ref CersioCt);

            // 画面描画
            PictureUpdate();
        }