gggggraziegrazie

graizegrazieさんのやったこと、学んだことを記録する雑記帳です

2018-01-01から1年間の記事一覧

ROSでXX_msgs::YY::ConstPtrをXX_msgs::YYに変換する方法

例えばsensor_msgs::LaserScan::ConstPtrをsensor_msgs::LaserScanに変換したい時があるかと思います。sensor_msgs::LaserScan::ConstPtrの実体は、boost::shared_ptrになります。そのため、 boost::shared_ptr<sensor_msgs::LaserScan> laserscan_ptr = boost::const_pointer_cast<sensor_msgs::LaserScan>(l</sensor_msgs::laserscan></sensor_msgs::laserscan>…

PCLを使った点群の軸(直線)を推定する手法

他にも色々とあるんだと思いますが、ここではRANSACとPCAを使った点群の軸(直線)を推定する手法について紹介します。 RANSAC(RANdom SAmple Consensus) RANSACとは、ロバスト推定の中の1つの手法です。ロバスト推定とは、データの中に外れ値が含まれてい…

決定木(Decision Tree)

決定木とは、複数のルールを使って組み合わせることで、データを複数のサブセットに分割する手法のことです。分割したサブセットの内容により、分類木や回帰木と呼ばれます。分類木の分割対象はクラスであり、回帰木の対象は出力値です。つまり決定木の作成…

C++における集合演算のための関数たち

C++

席集合や和集合などを作る関数がないか調べたところ、STLとBoostでそれらの関数を見つけたのでメモします。なお、STLとBoostでそれぞれ関数名は一緒です。挙動や入出力は異なりますので、詳細は下記の参考文献をご覧ください。和集合: set_union 積集合: se…

外れ値・異常値の検出手法

外れ値と異常値 外れ値とは、原因が不明だけれども真値から大きく異なる値のことです。一方異常値とは、同じく真値から大きく値が異なるけれども、何故値が真値と異なるのか説明がつく(測定ミス、記入ミスなど)値を指します[4][5]。つまり、異常値外れ値と…

Numpyでの二次元排列の操作方法

順次記載内容を追加してきたいと思います。 二次元配列の作り方 参考文献 二次元配列の作り方 arr = np.empty((0, 2) , float) # 0行2列の二次元配列オブジェクトを生成する arr = np.append(arr, np.array([[x, y]]), axis=0) # np.appendは演算結果を返す…

PCL中のGeneralized ICPを調査してわかったことメモ

PCL中でGeneralized ICP(以降GICP)を調査してわかったことを書き連ねます。適宜更新するため、読みづらいところがあるかもしれませんがご容赦ください。GICPを実行するには、ICPと同様にalignを行えばよい。Levenberg–Marquardt法を使いたいんだけどと思う…

コマンドライン中で指定したパラメータ名をノード中で取得する方法(C++)

結論から言うと、2種類の方法があります。 ros::names::remap : 返り値としてremapされたパラメータ名が取得できます。 resolveName : 返り値としてremapされたパラメータ名が取得できます。第二引数でremapが成功したかをboolで取得できます。 ros::names:…

ROSにおけるシャットダウン処理の書き方

ROSのノードを動かした時、Ctrl-Cでそのノードを落としたいのに、落ちてくれない場合ありますよね。また落ちたとしても、下記の様なexceptionが発生したりするなどして、キレイに落ちてくれなかったりします。 terminate called after throwing an instance …

インピーダンス制御とコンプライアンス制御

インピーダンス制御は、目標値の計算に弾性項と粘性項の両方を加味する。一方コンプライアンス制御は、粘性項を無視して弾性項のみを使う。これにより、コンプライアンス制御は動作速度の抑制は行わないことがわかる。 参考文献 haraduka.hatenadiary.jp htt…

roslaunchでパラメータの値を設定する方法

roslaunchにおいては、タグまたはタグのどちらかを使えば、パラメータの値を設定できる。*下記ではとの両方で記述しているが、どちらか片方だけ記述すればよいことに注意。 *下記では変数型としてstrを記述しているが、他にもint, double, bool, yamlも使…

Canonical Scan Matcher

Canonical Scan Matcherは、連続するscanデータの移動量を推定する手法です。Visual OdometryでPnPを使って移動量を推定するのと、等価の出力といえます。まだ読み進めていないのですが、アブストラクトを読む限り、移動量が大きい場合はエラーが大きくなっ…

Daynamo - Autodesk tool

Dynamoには「Dynamo」と「Dynamo Studio」の2種類があります。前者はAutodesk Revitの拡張ツールでOSSです。また無償でダウンロードできます(そもそものRevitが有償ですが)。後者のDynamo Studioは、スタンドアローンなツールです。こちらは有償です。た…

RhinoVAULT - Rhinoceros plugin

ETH Zurichが開発したプラグインで、Compression-onlyな構造を創造・探求するのに使います。美しい形状を創り出すだけでなく、構造体の原理を理解するのにも使えます。興味がある方は、[1]にTutorial動画が沢山ありますので、そちらをご覧ください。 参考文…

Millipede - Grasshopper plugin

Millipedeとは、Grasshopperのプラグインの1つで、構造解析や最適化を可能にします。数値解析や線形システムの解析解の算出、固有値計算、メッシュのベクトル表現化、メッシュの統合・フィルタリング、固有モード解析なども出来ます。出来ること一覧は、[ht…

Firefly - Grasshopper plugin

Fireflyとは、Grasshopperのプラグインの1つです。つまりは、Rhinocerosのプラグインとも言えます。このプラグインを使うことで、GrasshopperとArduino, Arduinoと接続したデバイスの間でのデータの入出力が可能となります。またGrasshopperのVisual Progra…

Grasshopper - Rhinoceros plugin

本記事では、Grasshopperとはなんぞやについて記述します。どう使うのか等の実践的な話については、お手数ですが他サイトを確認くださいますようお願いいたします。Grasshopperとは、3DモデリングソフトRhinocerosのプラグインです。元々はプラグインでした…

k-d tree

k-d treeとは、K-Dimensional treeの略で、K次元のデータの最近傍点を探索するための手法です[1]。検索対象のデータ数をとした時、データの次元数が大きすぎると線形探索と計算量が変わらないそうです[1]。なお線形探索とは、全探索の1種で一個ずつ検索対象…

ROSを使ったOrbbec Astra Proのキャリブレーション

Astra Proは手頃な価格でかつデプスの有効範囲が長め(8m)なRGB-Dカメラです。このカメラは専用のキャリブレーションツールや、工場出荷時にキャリブレーションが行われている訳ではありません。そのため自分でキャリブレーションツールを探し、キャリブレ…

Sparse Pose Adjustment(SPA)

SPAとは、Konoligeらによって提案された、2D Pose Graphの最適化を効率よく行うための手法です[1]。この手法は線形システムに対して使え、direct sparseコレスキー分解を使うことで効率化を図っています。SRIが開発したopen_karto[2][3]というSLAM向けのライ…

コレスキー(Cholesky)分解

コレスキー分解は、LU分解やQR分解と同様に線形方程式を解くのに使われる手法です。LU分解よりも高速かつ省メモリで解くことができます。これは[3]によると、正定値行列の全固有値は正の値を持つため、LU分解で言えばLを求めると勝手にUも求まることになるそ…

QR分解

QR分解は、の実行列を、次の直交行列との上三角行列Rとの積に分解する操作を指します。なおこの分解は必ず成立します[1]。QR分解は線形最小二乗法を解いたり、[4]曰く行列の固有値を求めるために使用されます。その計算手法としては、ハウスホルダー法やグラ…

LU分解

正方行列を、下三角行列(Lower triangular matrix)と上三角行列(Upper triangular matrix)の積に分解する操作を指します。連立方程式の厳密解を求める際に使われます。また の様に左辺が変化する場合は、計算を各方程式毎に行う必要があるため、計算量がとな…

Branch and Bound(分枝限定法)法

分枝限定法とは、組合せ計画問題で厳密解を求めるための手法の1つです。組合せ計画問題とは、ある関数を最大化するパラメータの組の様に、パラメータの有限個の組み合わせの中から目的を満たす組を求める問題です。分枝限定法は、条件分岐を駆使して問題を…

github上のプロジェクトをカスタムしてbitbucket上に自分専用プロジェクトとしてコミットする方法

下記のページがわかりやすいです。 簡単に説明すると、まずbitbucket上にからのレポジトリを作り、そこにgithub上のレポジトリをpullします。その上で変更点をadd & commitするという流れです。Forking a Github repo to Bitbucket · GitHub

プログラムを書く際に注意すべき点

順次追記していきます。 プログラムを書く際、関数の引数として与える数字の単位系・座標系は、クラス毎・ファイル毎に揃えよう 単位系・座標系が入り混じると、想定と異なる単位系・座標系で数値を入力し、想定と異なる挙動に悩まされる可能性が高まります…

英語の文章を書くときに便利なサービス

ここでは説明を省略します。お手数ですがご自身で内容の確認をお願いいたします。 Grammaly : 文法的な間違いや冠詞・単語の使い方が不正確な場合に指摘をしてくれます www.grammarly.com Reverso Translation : 文法というよりも、冠詞・単語の使い方の間違…

ROSにおけるCMakeLists.txtの書き方

ROS

逐次わかったこと、気づいたことを追記していきます。catkin_package( # ここには自ら(このCMakeLists.txtが含まれているROS Packageのことを書きます INCLUDE_DIRS # headerファイルを探しに行く時のルートディレクトリを記載します → 1)へ LIBRARIES # ad…

PCLの中のGeneralized ICPの使い方

GICPをテストコードを元に使ってみたのですが、うまく収束せず困っていました。そこでgithub上で何かいいサンプルはないかと思って探していたところ、ちょうどよいものがありましたので共有します!ETH ZurichのAutonomous system labが公開しているrepositr…

PCL(Point Cloud Library)の使い方が書かれた資料

PointCloudを使ったコードを書く場合、PCLがよく使われるものと思います。サンプルやテストコードを見ることで使い方を知ることはできますが、解説は殆どありません。今回PCLの中のRegistrationについて書かれた論文がありましたので、メモ代わりに記事にし…