Ejemplo n.º 1
0
        /// <summary>
        /// recogThreadの行う処理です.このメソッドを直接呼び出さないでください.
        /// </summary>
        private void recogThread_Task()
        {
            App.logger.Info("Surface.recogThread_Task() start");

            if (Started != null)
            {
                Started(this, new EventArgs());
            }

            Camera camera = Camera.GetInstance();

            camera.Start();

            /* Z軸をSpeed1(低速)でマイナス方向に動かして,最下点もしくは下降距離分だけ移動させる.*/
            MotorControler mc = MotorControler.GetInstance(parameterManager);

            speedBeforeStart = mc.Speed;


            bool   flag;
            double temp_z;

            mc.Inch(PlusMinus.Minus, motorSpeed, VectorId.Z);
            flag = true;
            while (flag)
            {
                int brightness = CountHitPixels();
                if (brightness > 8000)
                {
                    flag = false;
                }
                //if (brightness < 10000) flag = false;//
            }

            /*
             *          UpTopRecognized(this, new eventArgs());
             * LowBottomRecognized(this, new eventArgs());
             *          LowTopRecognized(this, new eventArgs());
             *          UpBottomRecognized(this, new eventArgs());
             */
            mc.SlowDownStop(VectorId.Z);
            surfaces[0] = mc.GetPoint().Z;
            System.Diagnostics.Debug.WriteLine(string.Format("{0}", mc.GetPoint().Z));
            Thread.Sleep(100);



            mc.Move(new Vector3(0.0, 0.0, -0.2));
            mc.Join();
            Thread.Sleep(100);


            mc.Inch(PlusMinus.Minus, motorSpeed, VectorId.Z);
            flag = true;
            while (flag)
            {
                int brightness = CountHitPixels();
                if (brightness < 5000)
                {
                    flag = false;                   //
                }
                // if (brightness < 4000) flag = false;
            }


            surfaces[1] = mc.GetPoint().Z;//
            // surfaces[2] = mc.GetPoint().Z;
            System.Diagnostics.Debug.WriteLine(string.Format("{0}", mc.GetPoint().Z));


            flag = true;
            while (flag)
            {
                int brightness = CountHitPixels();
                //if (brightness > 4000) flag = false;
                if (brightness > 5000)
                {
                    flag = false;
                }
            }


            mc.SlowDownStop(VectorId.Z);
            // surfaces[1] = mc.GetPoint().Z;
            surfaces[2] = mc.GetPoint().Z;//
            System.Diagnostics.Debug.WriteLine(string.Format("{0}", mc.GetPoint().Z));
            Thread.Sleep(100);
            // Thread.Sleep(150);//

            //  mc.Move(new Vector3(0.0, 0.0, -0.2));
            mc.Move(new Vector3(0.0, 0.0, -0.23));//
            mc.Join();
            Thread.Sleep(100);
            //Thread.Sleep(150);//

            mc.Inch(PlusMinus.Minus, motorSpeed, VectorId.Z);

            flag = true;
            while (flag)
            {
                int brightness = CountHitPixels();
                // if (brightness < 2000) flag = false;
                if (brightness < 3000)
                {
                    flag = false;                   //
                }
            }

            mc.SlowDownStop(VectorId.Z);
            surfaces[3] = mc.GetPoint().Z;
            System.Diagnostics.Debug.WriteLine(string.Format("{0}", mc.GetPoint().Z));
            Thread.Sleep(100);
            // Thread.Sleep(150);//

            // temp_z = (surfaces[0] - 0.05) - mc.GetPoint().Z;
            temp_z = (surfaces[0] + 0.02) - mc.GetPoint().Z;//
            mc.Move(new Vector3(0.0, 0.0, temp_z));
            mc.Join();
            Thread.Sleep(100);
            //Thread.Sleep(150);//


            /*
             *          // モータZ軸をマイナス方向(下方向)に稼働させる
             *          try {
             *                  // 下降の開始
             *                  mc.SetMotorSpeed(IO.MotorSpeed.Speed3);
             *                  mc.Inch(MechaAxisAddress.ZAddress, PlusMinus.Plus);
             *          } catch (MotorAxisException) {
             *                  // すでに最下点に位置していた場合は,catchのスコープが実行される.
             *                  isOnBottomLimit = true;
             *          }
             *
             *          // 最下点もしくは下降距離分に下降したかを監視する.
             *          double startPoint = mc.GetPoint().Z;
             *          while (!isOnBottomLimit) {
             *                  // 移動距離の確認
             *                  if (loweringDistance != 0) {
             *                          isOnBottomLimit = (loweringDistance <= Math.Abs(mc.GetPoint().Z - startPoint));
             *                  }
             *
             *                  // モータの移動可能最下点到達か否かの確認
             *                  isOnBottomLimit |=
             *                          (mc.GetAbnomalState(MechaAxisAddress.ZAddress)
             *                          == MotorAbnomalState.AxisLimitPlus);
             *          }
             *          // 最下点に到達したため,モータの移動を止める.
             *          // 最下点に到達時のイベントを発生させる
             *          mc.StopInching(MechaAxisAddress.ZAddress);
             *          if (OnMotorBottomLimited != null) {
             *                  OnMotorBottomLimited(this, new EventArgs());
             *          }
             *
             *          // 遅延を行わないとモータドライバが動作不良を起こす場合がある.
             *          Thread.Sleep(300);
             *
             * */



            /* -------------------- 下降の完了 ---------------- */

            /* 上昇しながら撮影中の画像を分析する */
            // 最下点からZ軸をプラス方向に動かす.
            // 撮影中の画像がゲルの中か否かを判定する.
            // ベース及びその他の場所と,ゲルの中の境界である座標を記録する.


/*
 *
 *
 *                      mc.Inch(PlusMinus.Plus, motorSpeed, VectorId.Z);
 *                      startPoint = mc.GetPoint().Z;
 *
 *
 *         // bool flag = true;
 *
 *          while (flag) {
 *              //Thread.Sleep(delayTime);
 *
 *              byte[] b = camera.ArrayImage;
 *              Mat src = new Mat(440, 512, MatType.CV_8U, b);
 *              Mat mat = src.Clone();
 *
 *              Cv2.GaussianBlur(mat, mat, Cv.Size(3, 3), -1);
 *              Mat gau = mat.Clone();
 *              Cv2.GaussianBlur(gau, gau, Cv.Size(31, 31), -1);
 *              Cv2.Subtract(gau, mat, mat);
 *              Cv2.Threshold(mat, mat, 10, 1, ThresholdType.Binary);
 *              int brightness = Cv2.CountNonZero(mat);
 *
 *              if (brightness > 3000) flag = false;
 *          }
 *
 *          mc.StopInching(MechaAxisAddress.ZAddress);
 *          surfaces[3] = mc.GetPoint().Z;
 *          System.Diagnostics.Debug.WriteLine(string.Format("{0}", mc.GetPoint().Z));
 *
 *
 *
 *        //  Vector3 speed = new Vector3(30, 30, 0.4);//つかわないけど
 *         // Vector3 tolerance = new Vector3(0.001, 0.001, 0.001);//つかわないけど
 *        //  Vector3 distance = new Vector3(0, 0, 0.3);
 *        //  mc.Move(distance, speed, tolerance);
 *
 *          Thread.Sleep(100);
 *
 *
 */

            /*
             *
             *
             * mc.Inch(PlusMinus.Plus, MotorSpeed, VectorId.Z);
             * double currentPoint = mc.GetPoint().Z;
             *
             * bool dice = true;
             *
             * while (dice) {
             *
             *  double nowPoint = mc.GetPoint().Z;
             *
             *  double renge = nowPoint - currentPoint;
             *
             *  if (renge > 0.20) dice = false;
             *
             *
             *
             *
             * }
             * mc.StopInching(MechaAxisAddress.ZAddress);
             *
             * Thread.Sleep(100);
             *
             *
             * /
             *
             *
             * //  mc.MoveDistance(0.2, VectorId.Z);
             * //   mc.Join();
             * // Thread.Sleep(2000);
             * //  System.Diagnostics.Debug.WriteLine(string.Format("{0}", mc.GetPoint().Z));
             * /*
             *
             * mc.Inch(PlusMinus.Plus, motorSpeed, VectorId.Z);
             * flag = true;
             * while (flag) {
             *
             *  byte[] b = camera.ArrayImage;
             *  Mat src = new Mat(440, 512, MatType.CV_8U, b);
             *  Mat mat = src.Clone();
             *
             *  Cv2.GaussianBlur(mat, mat, Cv.Size(3, 3), -1);
             *  Mat gau = mat.Clone();
             *  Cv2.GaussianBlur(gau, gau, Cv.Size(31, 31), -1);
             *  Cv2.Subtract(gau, mat, mat);
             *  Cv2.Threshold(mat, mat, 10, 1, ThresholdType.Binary);
             *  int brightness = Cv2.CountNonZero(mat);
             *
             *  if (brightness < 4000) flag = false;
             * }
             *
             *
             * surfaces[2] = mc.GetPoint().Z;
             * System.Diagnostics.Debug.WriteLine(string.Format("{0}", mc.GetPoint().Z));
             *
             */


/*
 *
 *
 *          flag = true;
 *          while (flag) {
 *
 *              byte[] b = camera.ArrayImage;
 *              Mat src = new Mat(440, 512, MatType.CV_8U, b);
 *              Mat mat = src.Clone();
 *
 *              Cv2.GaussianBlur(mat, mat, Cv.Size(3, 3), -1);
 *              Mat gau = mat.Clone();
 *              Cv2.GaussianBlur(gau, gau, Cv.Size(31, 31), -1);
 *              Cv2.Subtract(gau, mat, mat);
 *              Cv2.Threshold(mat, mat, 10, 1, ThresholdType.Binary);
 *              int brightness = Cv2.CountNonZero(mat);
 *
 *              if (brightness > 4000) flag = false;
 *          }
 *
 *          mc.StopInching(MechaAxisAddress.ZAddress);
 *          surfaces[1] = mc.GetPoint().Z;
 *          System.Diagnostics.Debug.WriteLine(string.Format("{0}", mc.GetPoint().Z));
 *
 *
 *          //mc.Move(distance, speed, tolerance);
 *
 *
 *
 *
 *
 *
 *
 *          // 遅延を行わないとモータドライバが動作不良を起こす場合がある.
 *          Thread.Sleep(100);
 *
 *
 */

/*
 *
 *          mc.Inch(PlusMinus.Plus, MotorSpeed, VectorId.Z);
 *          double current2Point = mc.GetPoint().Z;
 *
 *          bool dice2 = true;
 *
 *          while (dice2) {
 *
 *              double nowPoint = mc.GetPoint().Z;
 *
 *              double renge = nowPoint - current2Point;
 *
 *              if (renge > 0.20) dice2 = false;
 *
 *
 *
 *
 *           }
 *
 *          mc.StopInching(MechaAxisAddress.ZAddress);
 *
 *          Thread.Sleep(100);
 *
 */

            // mc.MoveDistance(0.2, VectorId.Z);
            // mc.Join();

            //  Thread.Sleep(2000);
            // System.Diagnostics.Debug.WriteLine(string.Format("{0}", mc.GetPoint().Z));

            /*          mc.Inch(PlusMinus.Plus, motorSpeed, VectorId.Z);
             *        flag = true;
             *        while (flag) {
             *
             *            byte[] b = camera.ArrayImage;
             *            Mat src = new Mat(440, 512, MatType.CV_8U, b);
             *            Mat mat = src.Clone();
             *
             *            Cv2.GaussianBlur(mat, mat, Cv.Size(3, 3), -1);
             *            Mat gau = mat.Clone();
             *            Cv2.GaussianBlur(gau, gau, Cv.Size(31, 31), -1);
             *            Cv2.Subtract(gau, mat, mat);
             *            Cv2.Threshold(mat, mat, 10, 1, ThresholdType.Binary);
             *            int brightness = Cv2.CountNonZero(mat);
             *
             *            if (brightness < 12000) flag = false;
             *        }
             *        mc.StopInching(MechaAxisAddress.ZAddress);
             *        surfaces[0] = mc.GetPoint().Z;
             *        System.Diagnostics.Debug.WriteLine(string.Format("{0}", mc.GetPoint().Z));
             *
             *
             *
             */


            //////////////

            //  mc.AAAAAA();


            /*
             *          stopWatch = new System.Diagnostics.Stopwatch();
             *          stopWatch.Start();
             *
             *          int idNo = 0;
             *          int index = 3;
             #if false
             *          bool[] votes = new bool[numOfVoting];
             *          int[] values = new int[numOfVoting];
             *          double[] points = new double[numOfVoting];
             *
             *                  Thread.Sleep(delayTime);
             *
             *                  // 今回の入力画像の演算結果を多数決配列の最後尾に設定する.
             *                  // 同時に今回の判定値やモータの座標もそれぞれ保持する.
             *                  votes[votes.Length - 1] = IsInGel();
             *                  values[values.Length - 1] = brightness;
             *                  points[points.Length - 1] = mc.GetPoint().Z;
             *
             *                  // 今回と過去一定回数分の結果で多数決をとる.
             *                  presentResult = Vote(votes);
             *
             *                  // 多数決の結果配列を一つずつシフトする
             *                  for (int i = 0; i < values.Length; ++i) {
             *                          votes[i] = (i == votes.Length - 1 ? false : votes[i + 1]);
             *                          values[i] = (i == values.Length - 1 ? 0 : values[i + 1]);
             *                          points[i] = (i == points.Length - 1 ? 0 : points[i + 1]);
             *                  }
             #endif
             *
             *          double previousZVal, presentZVal;
             *          int previousBrightness , presentBrightness;
             *          bool previousResult = false, presentResult = false;
             *          while (index >= 0) {
             *                  Thread.Sleep(delayTime);
             *                  presentZVal = Math.Round(mc.GetPoint().Z, 5);
             *                  presentResult = IsInGel();
             *                  bool isBorder = isBoudarySurface(previousResult, presentResult, index);
             *
             *                  // 撮像・入力画像の確認のイベントを発生させる.
             *                  SurfaceEventArgs eventArgs = new SurfaceEventArgs();
             *                  eventArgs.Id = idNo;
             #if false
             *                  eventArgs.ZValue = points[0];
             *                  eventArgs.Brightness = values[0];
             *                  eventArgs.Distance = Math.Abs(points[0] - startPoint);
             #endif
             *
             *                  presentBrightness = brightness;
             *                  eventArgs.ZValue = presentZVal;
             *                  eventArgs.Brightness = presentBrightness;
             *                  eventArgs.Distance = Math.Abs(presentZVal - startPoint);
             *                  eventArgs.IsInGel = presentResult;
             *                  eventArgs.IsBoundary = isBorder;
             *                  eventArgs.Second = Time;
             ++idNo;
             *                  if (Shooting != null) {
             *                          Thread t = new Thread(new ThreadStart(delegate() {
             *                                  Shooting(this, eventArgs);
             *                          }));
             *                          t.IsBackground = true;
             *                          t.Start();
             *                  }
             *
             *                  if (isBorder) {
             *                          // 境界面であった場合,多数決に用いたZ座標の値の内,最も古い値を境界面の座標として採用する.
             *                          // ここでは境界面として,その座標値を保持している.
             *                          //surfaces[index] = points[0];
             *                          surfaces[index] = presentZVal;
             *
             *                          // 境界面認識時のイベントを発生させる.
             *                          switch (index) {
             *                                  case 3:
             *                                          if (LowBottomRecognized != null) {
             *                                                  LowBottomRecognized(this, eventArgs);
             *                                          }
             *                                          break;
             *                                  case 2:
             *                                          if (LowTopRecognized != null) {
             *                                                  LowTopRecognized(this, eventArgs);
             *                                          }
             *                                          break;
             *                                  case 1:
             *                                          if (UpBottomRecognized != null) {
             *                                                  UpBottomRecognized(this, eventArgs);
             *                                          }
             *                                          break;
             *                                  case 0:
             *                                          if (UpTopRecognized != null) {
             *                                                  UpTopRecognized(this, eventArgs);
             *                                          }
             *                                          break;
             *                          }
             *
             *                          --index;
             *                  }
             *                  previousResult = presentResult;
             *                  previousBrightness = presentBrightness;
             *                  previousZVal = presentZVal;
             *
             *                  // 距離によるエラー終了
             *                  if (mc.GetPoint().Z - startPoint > distanceOut) {
             *                          mc.StopInching(MechaAxisAddress.ZAddress);
             *                          throw new SurfaceFailedException("Distance limit out");
             *                  }
             *          }
             *
             *          mc.StopInching(MechaAxisAddress.ZAddress);
             *          stopWatch.Stop();
             *          dateTime = DateTime.Now;
             *          latestCoord = new Vector2(mc.GetPoint().X, mc.GetPoint().Y);
             */
        }