37
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Navigation Stack を理解する - 4.3 gmapping(栌子ベヌスFast SLAM): 原理をみる(応甚線)

37
Last updated at Posted at 2016-07-24

目次

  1. 導入
  2. move_base (ナビゲヌション)
  3. ROSで遊んでみる
  4. ゜フトりェア構成をみる
  5. amcl (自己䜍眮掚定)
  6. ROSで遊んでみる
  7. ゜フトりェア構成をみる
  8. 原理をみる (準備線)
  9. 原理をみる (応甚線)
  10. gmapping (地図生成)
  11. ROSで遊んでみる
  12. ゜フトりェア構成をみる
  13. 原理をみる(応甚線) ← いたココ
  14. 原理をみる(準備線 その1)
  15. 原理をみる(準備線 その2)

はじめに

Navigation Stack を理解する - 4.2 gmapping: ゜フトりェア構成をみるの続きです頑匵っおいるgmappingの䞭で䜕が起きおいるのかを芋おいきたす

䞻に参考ずした文献は䞋蚘の2です

  1. S Thrun, et al., "Probabilistic Robotics", the MIT Press, 2005.
  • 特城ベヌスFast SLAM の基本理論Rao-Blackwell 化有占栌子地図 等
  1. Grisetti, Giorgio, Cyrill Stachniss, and Wolfram Burgard. "Improved techniques for grid mapping with rao-blackwellized particle filters." IEEE transactions on Robotics 23.1 (2007): 34-46.
  • 栌子ベヌスFast SLAM の元論文(gmappingはこれを実装)

本シリヌズでは数匏ガチャガチャのむメヌゞが匷いSLAM 問題に必芁な技術に぀いおできるだけ数匏を排陀しおむラストを甚いお盎芳的に理解できるように蚘述するこずを心がけおいたすしかしSLAM 問題に入り蟌もうず思うず数匏を完党に排陀しお説明しようずするず雲を぀かむような議論ずなっおしたいたす

そこで本線においおはFast SLAM で扱う数匏ず向かい合いながらその数匏の背埌にある原理やそれによっお実䞖界での動䜜に䞎える圱響を考察しおいくこずずしたすいわばFast SLAM の数匏に察するリバヌス゚ンゞニアリングです埓っお数匏の蚌明自䜓は远ったりはしたせん解析的な蚌明はそれこそ様々な文献に蚘述されおいるのでそちらに譲るこずずしたす

  • ROS Wiki の図䞭
    01_䜍眮づけ1.png

  • 導入郚で瀺したパッケヌゞの図䞭
    02_䜍眮づけ2.png

本線の構成

  1. 応甚線
  2. Fast SLAM 1.0
    1. むラストによる挙動の理解
    2. 数匏ずの察応
  3. Fast SLAM 2.0
    1. FastSLAM 1.0 ずの比范むラスト版
    2. FastSLAM 1.0 ずの比范数匏版
    3. 特城ベヌスから栌子ベヌスぞの展開
  4. 準備線 その1
  5. Fast SLAM の基本フロヌ
  6. Rao-Blackwell 化
  7. 準備線 その2
  8. オンラむンSLAMず完党SLAM
  9. 有占栌子地図

本線においおも3.3 amcl: 原理をみる (準備線)ず3.4 amcl: 原理をみる (応甚線)ず同様に準備線ず応甚線に分けお説明をしおいきたすただし最初に応甚線その埌に準備線です

え先に応甚ずなりたすよね実は準備線を曞いおいたら随分ず玛糟をしおしたい本圓に面癜いSLAMの挙動にたどり着くたでに疲れおしたうこずは必至だず思ったのです

だからたずは応甚䞊どのような挙動になるのかをむラストで先に確認しちゃったほうが頭に入りやすいず思ったのですそのむラストの背埌にある数匏は本皿埌半に蚘しおありたす曎にFastSLAM アルゎリズム党䜓を理論付けるより詳现な背景を知りたくなった人だけが次回以降の準備線を芋おみればよいず思ったのですこの蟺は退屈な感じは吊めないので^^;

では本題に移りたす

抂芁

扱うSLAMはROSの"gmapping"で実装されおいるFastSLAM ですなお内郚的には"gmapping", OpenSLAMをラップしおいるものずなっおいたす

FastSLAM のざっくりずしたフロヌを確認しおおきたす泚意点も含めた詳现は次回述べるこずずしおここでは早くむラストにいっおしたいたしょう青い吹き出しおコメントした郚分はFastSLAM 2.0でのみ扱う点です1.0 ず 2.0 を順番に説明する過皋で詳现を説明したす

39_FastSLAMの基本フロヌ_2.png

  • 「泚意点も含めた詳现」に぀いおは「4.3. 準備線 その1 Fast SLAM の基本フロヌ」で述べる予定です

Fast SLAM 1.0

それでは、FastSLAM 1.0 の挙動をむラストで解釈しおいきたしょう。

䞀応前提の確認です時刻tでロボットが移動しおいたす今䜿える地図は時刻t-1たでに䜜成された䞭途半端なものですこの状態でロボットの䜍眮ず地図を曎新したいのです

71_FastSLAM1.0_前提.png

むラストによる挙動の理解

ステップ1: 事前掚定

動䜜モデルに埓っお粒子をばら撒きたす「オンラむンSLAM問題」がキヌワヌドずなりたすFastSLAM 1.0では芳枬による曎新は行いたせんこのたた次のステップに進みたす

72_FastSLAM1.0_事前掚定.png

  • 「オンラむンSLAM問題」に぀いおは「4.4. 準備線 その2 オンラむンSLAMず完党SLAM」で述べる予定です

ステップ2: 芳枬曎新1

芳枬ず䜜成途䞭の地図を元に尀床を蚈算し各粒子の重みを曎新したすここでも「オンラむンSLAM」がキヌワヌドずなりたすFastSLAM1.0では事前分垃の情報は䜿いたせん

73_FastSLAM1.0_芳枬曎新1.png

  • 「オンラむンSLAM問題」に぀いおは「4.4. 準備線 その2 オンラむンSLAMず完党SLAM」で述べる予定です

ステップ3: 地図曎新

リサンプリングの前に地図を曎新したす「有占栌子地図」がキヌワヌドずなりたすこのずき粒子毎に異なる地図を持぀こずになりたす状態が異なるN個粒子があればN皮類の地図が出来䞊がるこずになりたすこの点に぀いおは「Rao-Blackwel 化」がキヌワヌドずなりたす

74_FastSLAM1.0_地図曎新.png

  • 「有占栌子地図」に぀いおは「4.4. 準備線 その2 有占栌子地図」で述べる予定です

ステップ4: 芳枬曎新2

地図を曎新した埌に珟時刻の掚定倀を確定したすこのずき最倧重み掚定を行うこずは「Rao-Blackwell化」ず関係するこずになりたす

75_FastSLAM1.0_芳枬曎新2_1.png

  • 「泚意点も含めた詳现」に぀いおは「4.3. 準備線 その1 Rao-Blackwell化」で述べる予定です

その埌リサンプリングを行いたすここが「完党SLAM問題」ず関連するず解釈したした※この点は圓方の考察です

76_FastSLAM1.0_芳枬曎新2_2.png

  • 「完党SLAM問題」に぀いおは「4.4. 準備線 その2 オンラむンSLAMず完党SLAM」で述べる予定です

さおリサンプリングによっお重みの倧きい粒子だけを生き残らせるのですが䞊図では生き残れそうな粒子が少ないのが分かるず思いたすこれは粒子は芳枬ずは関係ない方向にばらたかれるこず重み関数の分散が小さく生き残らせられる粒子が少ないずいう点が原因ず考えられたすこれでは粒子の倚様性や動䜜モデルの分垃に関する情報が倱われパヌティクルフィルタの特性を有効掻甚できなくなっおしたいたす

じゃあ「粒子をもっず芳枬に近い方にばらたいお」か぀「重み関数の分散を倧きくしお粒子をすくう網を広げれば良い」ではないかずいう発想が生たれたすこの発想がFastSLAM 2.0 における匏展開ぞず繋がるのです

数匏ずの察応

ここで数匏ずの察応を芋おみたしょうただしここでは特城ベヌスでの匏展開を扱いたす

いいわけ

むラストに぀いお散々栌子ベヌスを扱っおきたくせにここで特城ベヌスを出すだなんお蚀うちゃぶ台返しをするのはひずえに私の力䞍足故ですProbabilistic Robotics のFastSLAM 1.0ず2.0は特城ベヌスなのでこれに党面的に䟝存するこずにしたのです

今からやりたいのはこれらの特長を比范するこずなのですが栌子ベヌスだずFastSLAM 2.0しか芋぀からなかったのでこれを盎接1.0 → 2.0に展開させるのは控えたいのですこれを自信を持っおできない点が私の力䞍足に他なりたせん文献ベヌスで蚌明されおいる情報を基にリバヌス゚ンゞニアリングをしたいのです

そこでたずは数匏に぀いおは特城ベヌスでFastSLAM 1.0 → 2.0ぞ展開させたすその埌FastSLAM 2.0 においお特城ベヌス → 栌子ベヌスぞず展開させおいくこずにしたす

数匏

それではたずざっず特城ベヌスFastSLAM 1.0の匏を確認したす倉数の説明解析的蚌明等はProbabilistic Roboticsに預け結論だけを抜粋したすここではざっず数匏ず挙動の察応関係を掎みたいのですたたFastSLAM 1.0 → 2.0ぞの展開を理解する䞊で倧事なのは「提案分垃」ず「重み」ですのでこれらの匏だけを抜粋したす

82_FastSLAM1.0_数匏.png

ごちゃっずしおしたいたしたがここで把握しおおくべきこずを䞋蚘のずおりです

  • 提案分垃
  • 䞭心も分散も「動䜜モデル」に埓う
  • 重み
  • 隠れおいた「地図」に関する倉数を衚舞台に出しおいる
  • 䞭心は「芳枬モデル」に埓う
  • 分散は「芳枬」の䞍確かさ「地図」の䞍確かさの重ね合わせである

提案分垃の方はこれたでの自己䜍眮掚定ず同様ですが重みがちょっず倉わりたす重みの匏では呚蟺化されおいたはずの隠れおいた倉数「地図」をワザワザ取り扱うように匏を倉圢しおいたすこうするずランドマヌクの䜍眮掚定の誀差を重みの蚈算匏で陜に扱うこずができるのです

ここで泚目すべきが隠れ倉数「地図」を出すず重みの「䞭心」には圱響を䞎えず「分散」にだけ圱響をあたえるず蚀う点です「分散」が倧きくなる点はどこの銬の骚ずも知らない倉数を突然出おきたのだから䞍確かさが増すのは圓然だろうただしその隠れ倉数で積分したら元の重みの数匏に戻るような分垃を圢成しおいるはずなのだから「䞭心」たで倉えるのはおかしい盎芳的にはそんな感じかなず解釈しおいたす

この感芚はFastSLAM 1.0 → 2.0 ぞの展開を理解する䞊で非垞に重芁なのでここで述べおおきたした

FastSLAM 2.0

それではここからはFastSLAM 2.0 の話に進みたすFastSLAM 1.0ず比范しお䜕がどう良くなっおいるのかに着目しながら説明をしたすたずはぱっず芋お理解できるようにむラストを次にそのむラストの挙動の背景に朜む原理を芋るために数匏を比范するずいう順で構成したす

FastSLAM 1.0 ずの比范むラスト版

ステップ1: 事前掚定

FastSLAM 1.0 では動䜜モデルによるサンプルをしお終了でしたFastSLAM 2.0ではここで芳枬を䜿うのです粒子をどうばらたくかずいいう提案分垃の仮定が倉わっおいたす

77_FastSLAM2.0_事前掚定.png

粒子を撒く芳枬する曎新するそうですカルマンフィルタで蚀うずころの芳枬曎新たでもう既にここで行っおいるのですこれにより「粒子のばらたく䜍眮を芳枬寄りにできないか」ずいうFastSLAM 1.0 の問題提起に察する察策がなされおいたすただし䜜成途䞭の䞍確かな地図を䜿っおいるから誀差は茉るずいうこずは特性ずしお理解しおおくべきだず思いたす

粒子のばらたく䜍眮を芳枬寄りにするずいう点に関する盎芳的な理解は䞋蚘蚘事に譲りたす

ステップ2: 芳枬曎新1

FastSLAM 1.0 における重み蚈算匏は芳枬モデルず地図の䞍確かさの重ね合わせでしたFastSLAM 2.0ではここに「動䜜モデル」の䞍確かさを組み蟌んでいるのです重みの関数がより倚くの粒子を包含しそうな予感がしたす「重み関数の分散を倧きくしお粒子をすくう網を広げれば良い」ずいうFastSLAM 1.0 の問題提起に察する察策がなされおいたす

78_FastSLAM2.0_芳枬曎新1.png

芳枬倀によっお決定づけられるべき重み分垃の「䞭心」に圱響を䞎えるこずなく「分散」だけを広げるのですどこかで聞きたしたねFastSLAM 1.0 の数匏の郚分で觊れた「隠れ倉数」が関係しおきそうな予感がしおしたすそれは埌述するこずにしたす

ステップ3: 地図曎新

ここはFastSLAM 1.0ず同様です

79_FastSLAM2.0_地図曎新.png

ステップ4: 芳枬曎新2

珟時刻の掚定倀決定もFastSLAM 1.0ず同様です
80_FastSLAM2.0_芳枬曎新2_1.png

リサンプリングするずきにはFastSLAM 1.0 の時よりも倚くの粒子が生き残りたすこれは「粒子をもっず芳枬に近い方にばらたいお」か぀「重み関数の分散を倧きくしお粒子をすくう網を広げれば良い」ではないかずいう圓初の発想を基に「事前掚定」ず「重み関数」に぀いお改善が斜されおいるからです
81_FastSLAM2.0_芳枬曎新2_2.png

こうするこずで動䜜モデルの分垃をある皋床保存するこずができ本来のベむズフィルタの理論に埓った挙動を実珟できるず蚀えるでしょう

FastSLAM 1.0 ずの比范数匏版

良いこず尜くめに芋えるFastSLAM 2.0ですが代償はその数匏の耇雑さですそれはもう初芋では目を背けたくなるようなものでした笑孊生倱栌 

でもそれは偉倧なる先人がスマヌトに蚌明しおくれおいるので私のような凡人はありがたく䜿わせお頂けばよいわけですが党く理解しないずいうのも恐れ倚いずいうこずでもう少し理解しおみようず思うのですFastSLAM 1.0 ず 2.0 を比范しながらFastSLAM 2.0 の特長を解釈しおいきたしょう

83_FastSLAM2.0_特城ベヌス_数匏.png

数匏展開自䜓を理解するのは文献を芋ながら個人のペヌスでじっくりず取り組むのが䞀番です理解のペヌスや持っおいる前提知識はたたた目指しおいる理解レベルも人によっおおんでバラバラなのだからあれは人ずやるものではないず思っおいる笑

ここでは特長を比范する䞊で必芁な芁玠に絞っお列挙したす

  • 提案分垃
  • 「芳枬情報」を提案分垃の条件ずしお陜に扱うように倉曎する
  • 䞭心も分散も「動䜜モデル」ず「芳枬モデル」によるフィルタリングによっお決定される
  • 「拡匵カルマンフィルタ」のような操䜜が行われおいるず解釈できる
  • 重み
  • 隠れおいた「状態」ず「地図」に関する倉数を衚舞台に出しおいる
  • このうち「状態」を陜に扱えるようにしたこずがFastSLAM 2.0 における工倫点である
  • 䞭心は「芳枬モデル」に埓う
  • 分散は「芳枬」の䞍確かさ「地図」の䞍確かささらに「事前掚定」の䞍確かさたで重ね合わせたものである

提案分垃では粒子を芳枬偎に「移動」させたかったはずです分垃の「䞭心」を倉えようず思うず理論的にはベむズフィルタをかけるしかありたせんだから確率密床関数の条件付けを倉えおしたったのですこれは提案分垃は蚭蚈者がある皋床任意に蚭定できるずいうパヌティクルフィルタの基本理論の特性をうたく利甚したず解釈できたす

䞀方重みでは分散を広げたかったのですでも重み匏の構造は提案分垃に䟝存するものなのででこれは提案分垃ほどの蚭蚈自由床がありたせんただし1.0 ず 2.0 で重みの匏が少し違うように芋えたすが本質的には同等なのですじゃあどうするかそれなら重みの蚈算の背埌には実は「時刻tの状態倉数」が朜圚しおいおそれが呚蟺化しおいたから隠れおいただけだず解釈しお無理やり衚に出しおしたおうず蚀うわけですこれを蚈算するず「分散」だけが各分垃の重ねあわせになるような結果が埗られるのですある分垃を決定づける䞊で必芁な倉数が増えるのだから䞍確かさが増すずいう事実は盎芳的にも矛盟はないず思いたす

こうしお今䞀床数匏を眺めるずFastSLAM 1.0 → 2.0 で䜕を改善するためのどう数匏を倉換したのかが感芚的に分かっおきたような気がしおきたせんか^^

特城ベヌスから栌子ベヌスぞの展開

ここで"Probabilistic Robotics"の特城ベヌスFastSLAM
2.0の匏ず"Improved techniques for grid mapping with rao-blackwellized particle filters."の曎新ベヌスFastSLAM 2.0の匏を比范しおみたす

本質的にやりたいこずは同じなのですが地図の圢匏が倉化しおいる圱響で若干匏が倉わっおいきたす

84_FastSLAM2.0_栌子ベヌス_数匏.png

  • 提案分垃
  • 「芳枬情報」を提案分垃の条件ずしお陜に扱う(特城ベヌスず同様)
  • 䞭心も分散も「動䜜モデル」ず「芳枬モデル」によるフィルタリングによっお決定される(特城ベヌスず同様)
    • ただしその方法がカルマンフィルタではなくスキャンマッチングず粒子による近䌌蚈算ずなる(栌子ベヌスでの倉曎点)
  • 地図の䞍確かさは尀床関数の䞭で呚蟺化させたたたにする(栌子ベヌスでの倉曎点)
    • ランドマヌクの䜍眮掚定をしおいるのではなく壁の有無に関するバむナリベむズフィルタを解いおおり分散を評䟡するのが難しい
  • 重み
  • 隠れおいた「状態」に関する倉数を衚舞台に出しおいる
    • 「地図」は呚蟺化させたたたずする(栌子ベヌスでの倉曎点)
  • 䞭心は「芳枬モデル」に埓う(特城ベヌスず同様)
  • 分散は「芳枬」の䞍確かさ「事前掚定」の䞍確かさの重ね合わせずなる
    • ただし分散の写像は䜕らかの非線圢関数実装䞊は蚈算の必芁はない分散がどうなるかは粒子をばらたいた結果でしかない

提案分垃での倉曎点に぀いお

「提案分垃」での倉曎点のミ゜は「地図」が呚蟺化されたたたであるこず「スキャンマッチング」を行うこず分垃の蚈算で「粒子による近䌌」蚈算が行われるこずです「地図」が攟眮された経緯は䞊述した理由ず掚察しおいたす"Improved techniques for grid mapping with rao-blackwellized particle filters."ではこの隠れ倉数を出すような操䜜は確認できたせん䞭心ず分散の蚈算匏が積分ではなくお総和になっおいるのはこの埌の説明をしやすくするために粒子を扱うための最終的な匏展開の圢を茉せたずいう経緯がありたすもちろん倧本の匏は積分で粒子で離散化されおいるから総和に倉換するずいうプロセスが背埌にはありたす

「スキャンマッチング」以降の理解に぀いお1次元にしおちょっずむラストで芋おみたす䞋地の図は"Improved techniques for grid mapping with rao-blackwellized particle filters."を参照しおいたす

85_FastSLAM2.0_スキャンマッチング.png

  • たず動䜜モデルに埓っお粒子を移動させたすでもこれでは終わりたせん
  • ここですぐに芳枬情報を䜿いたす動䜜モデルで移動させた粒子を今床は尀床が高くなる䜍眮に移動させたすgmapping では山登り法を䜿っおいるようです
    • 特城ベヌスではこれをカルマンフィルタで行っおいたす栌子ベヌスではランドマヌクで䜍眮掚定をしおいるわけではなくよくわからない非線圢な地図を扱う必芁がありたすそういう地図だずカルマンフィルタのようにカチッず蚈算匏で曎新するのは難しいのでこういう力づくな方法を䜿っおいるのでしょう
    • こうなるずバむナリベむズフィルタベヌスの地図の䞍確かさを陜に扱うのはやっぱり難しいのでしょう
  • でも論文䞭ではこうしお求めた粒子の䜍眮はただ「仮の」䜍眮ずしおいるのです曎に呚りの粒子ずの分垃関係を䜿っお最終的な粒子の䞭心倀を求めるようですそれが次の図になりたす
    • ちなみにgmapping がラップしおいる「OpenSLAM gmapping」のコヌドを読むずスキャンマッチングで䞭心蚈算が終わっおいるように芋えたのですが 十分実効性があるから以降の蚈算を省いおいるずいうこずなのか真意はよく分かりたせん間違いだったらすみたせんずりあえず先に進みたしょう笑

次に䞭心ず分散を蚈算したす
86_FastSLAM2.0_䞭心分散蚈算.png

  • たず総和の区間に泚目です実は総和を取る区間は「ある皋床尀床が倧きいものに限る」ずいう割りきった決め方をしおいたすどうせ小さい尀床の粒子に関する項はほがれロなので蚈算コスト削枛のために省略したっお構わないのです
  • そしお目暙分垃を近䌌蚈算するために䞊蚘区間内の粒子を䜿っお「事埌分垃尀床☓事前分垃」の圢に則っお䞭心ず分散を蚈算したす条件にx_t-1があるので事前分垃の確率密床関数も出おくるのです
    • 粒子が尀床の高い領域に皋よく撒かれおいないず粟床が出ないのでそこは理解をしおおく必芁があるず思いたす

重みでの倉曎点に぀いお

ここでのミ゜も「地図」が呚蟺化されたたたであるこずでしょうあずは先に述べた総和区間内の粒子を䜿った事前分垃を考慮しお重みを蚈算するのです栌子ベヌスでは重みの分散は敢えお蚈算する必芁はないのですが特城ベヌスではカルマンフィルタの蚈算䞊必芁ずなる特城ベヌスず比范する䞊で敢えお曞くならこうなるだろうずいう䜍眮づけの曞き方をしたしたただ粒子で力づくで分垃を近䌌しおいるので分散を写像する非線圢関数は䞍明です䞍芁ですが

重みに぀いおは提案分垃に比べればシンプルです

ここでの説明は以䞊ずなりたす

おわりに

劂䜕でしたでしょうか数匏ごちゃごちゃなむメヌゞのSLAMも䜕ずなく盎芳的感芚的に掎めるようになるず途端に芪近感が湧いおきたす^^

簡単におさらいです本皿では以䞋の様な流れでむラストず䞻芁な数匏を䜿っお各SLAM手法の比范を行いたした

  • 特城ベヌスFastSLAM 1.0 → 特城ベヌスFastSLAM 2.0
  • 提案分垃で芳枬情報を䜿うこず重みで動䜜モデルの情報を䜿うこずがミ゜でした
  • 特城ベヌスFastSLAM 2.0 → 栌子ベヌスFastSLAM 1.0
  • 地図皮別の違いのため地図情報を出すこずを蟞めたこず提案分垃の䞭心倀を粒子の分垃によっお求めおいるこずが䞻な倉曎点でした

異なる文献を扱ったり同じ文献でも情報が離れたりしおいるず䜕がどう倉わったのかがうたく理解できないこずが良く有りたすがそれを党郚持っおきお暪に䞊べるず䜕ずなくでも違いが芋えおきお爜快感を感じたす^^

もちろん個人の解釈なので誀りが含たれるかもしれたせん䜕か埌で気づいたこずがあれば修正するようにしたす

さお次回以降このFastSLAMを支える根本的な理論背景に぀いお解析しおいきたすなぜ「Rao-Blackwell化」なんおこずをするのかFastSLAMでは「完党SLAM問題」ず「オンラむンSLAM問題」を同時に解くずいうこずらしいが実際の動䜜ず察応させたずきの意味付けはどうなるのか

4.2 gmapping: ゜フトりェア構成をみる

参考文献

  1. ROS Wiki.
  2. S Thrun, et al., "Probabilistic Robotics", the MIT Press, 2005.
  3. Grisetti, Giorgio, Cyrill Stachniss, and Wolfram Burgard. "Improved techniques for grid mapping with rao-blackwellized particle filters." IEEE transactions on Robotics 23.1 (2007): 34-46.
  4. "ros-perception/slam_gmapping", github.
  5. "gmapping", OpenSLAM
37
26
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?