Toshiki-Keio / wolvez2022

0 stars 0 forks source link

スタック検知について #1

Open Mi-cchy opened 2 years ago

Mi-cchy commented 2 years ago

スタック検知のもろもろを書き示したい所存

Mi-cchy commented 2 years ago

7/18 コード作成

注意点

def stuck_detection(self):
        print("acceralation:",self.bno055.ax**2+self.bno055.ay**2+self.bno055.az**2," const:",ct.const.STUCK_ACC_THRE**2*1000)
        if self.stuckTime > 0:
            print("Stuck!!")
            if time.time() - self.stuckTime > ct.const.STUCK_MOTOR_TIME_THRE:#閾値以上の時間モータを回転させたら
                self.rightMotor.stop()
                self.leftMotor.stop()
                self.stuckTime = 0
                self.countstuckLoop = 0
            else:
                #トルネード実施
                self.rightMotor.go(ct.const.STUCK_MOTOR_VREF)
                self.leftMotor.back(ct.const.STUCK_MOTOR_VREF)

        elif (self.bno055.ax**2+self.bno055.ay**2+self.bno055.az**2) >= ct.const.STUCK_ACC_THRE**2*1000:
            print("stuck count +1")
            print("acceralation:",self.bno055.ax**2+self.bno055.ay**2+self.bno055.az**2)

            self.countstuckLoop+= 1

            if self.countstuckLoop > ct.const.STUCK_COUNT_THRE: #加速度が閾値以下になるケースがある程度続いたらスタックと判定
                print("stuck")
                self.stuckTime = time.time()#スタック検知最初の時間計測
                self.rightMotor.stop()
                self.leftMotor.stop()
            else:
                self.rightMotor.go(70)
                self.leftMotor.go(70)
        else:
            print("not stuck")
            self.rightMotor.go(70)
            self.leftMotor.go(70)
masato1004 commented 2 years ago

特徴画像再構成について


エッジ画像を用いた際の結果

  • 塀など地面以外が写ったwin1の再構成 edge_part_2

  • 何もない地面(グラウンド)が写ったwin5の再構成 edge_part_5


    エッジ画像を用いた再構成について

    再構成誤差が現れることが見込まれる理由

    1. 地面(グラウンド)の場合には砂利などがエッジ検出されることによりエッジ部分が広範にわたる
    2. 地面以外の砂利ではない部分(本番では轍?)が含まれる場合、エッジ部分が少ない
  • 上記2点により、砂利で学習された固有ベクトルを用いた再構成をした場合にはエッジが多いほうが再構成誤差が少ないはず

  • 現在差が出ていない理由として、再構成画像が全体的に薄く(白っぽく)ぼやけてしまっていることが挙げられる

    解決策として下限値の補正などを行う…?

エッジ画像のパラメータ調整方法

今後試験する際にエッジの強度を変えたい場合の簡便な説明

フォルダ

wolvez2022/Testcode/EtoE/baaa_feature.py

変更箇所

Feature_img()クラスedge()メソッド

該当コード

def edge(self):
    #self.output_img_list = []
    self.org_img = cv2.imread(self.imp_p, 1)
    self.img_gray = cv2.cvtColor(self.org_img, cv2.COLOR_BGR2GRAY)
    self.gray=cv2.Canny(self.img_gray,100,200)
    # self.gray=cv2.Canny(self.img_gray,200,550)  # アーリスではこちらの値を用いた方が適切かも(エッジ検出感度)
    self.save_name = self.sav_d + f"/edge_{self.frame_num}.jpg"
    cv2.imwrite(self.save_name,self.gray)
    self.output_img_list.append(self.save_name)

上記におけるself.gray=cv2.Canny(self.img_gray,100,200)2,3番目の引数の値を変更する

  • 2番目の引数がエッジのつながりやすさ(小さいほどエッジ線がつながりやすい
  • 3番目の引数がエッジ検出の感度(小さいほどエッジ検出感度が高い

回避試験におけるエッジ検出の参考画像

  • 元画像 firstimg0

  • エッジ画像 edge_2022-08-27_14-28-33

Mi-cchy commented 2 years ago

@Masato104 Cannyの0 or 255じゃなくて微分画像の方が画像再構成に適してる説はない? http://opencv.jp/sample/gradient_edge_corner.html

masato1004 commented 2 years ago

@Masato104

Cannyの0 or 255じゃなくて微分画像の方が画像再構成に適してる説はない?

http://opencv.jp/sample/gradient_edge_corner.html

@Mi-cchy @ 確かにその方が濃淡も含めて再現できていいかもですね、、 明日試してみます!

masato1004 commented 2 years ago

cv2.Canny, cv2.Laplacianと、edge(), enphasis()メソッド

=== 結論からいうと勾配によるエッジ検出は既に特徴画像の一つとして存在していた ===


エッジ検出手法

大きく分けて二種類