EurekaMoments

ロボットや自動車の自律移動に関する知識や技術、プログラミング、ソフトウェア開発について勉強したことをメモするブログ

Occupancy Grid MapでLiDARの点群から埃を除去するROSプログラム

目的

前回の記事で書いたように、数年ぶりにROSを使う機会がありました。

www.eureka-moments-blog.com

その機会の中で、屋外でLiDARが埃やその他ノイズを検知したときの
点群をフィルタリングするプログラムを作ったので、そのアルゴリズム
とその性能検証、ソースコードについて紹介しようと思います。

目次

  • 目的
  • 目次
  • 目標設定
    • 残すべき対象①: 大きな静止物体
    • 残すべき対象②: 移動物体
    • 残すべき対象③: 地面
    • 除去すべき対象: 上記以外の埃やその他ノイズ
  • Occupancy Grid Mapの利用
  • 地図を構築するためのパラメータ
  • 3次元点が所属するセルのインデックス計算
  • 各セルに属する物体の高さ推定
  • ベイズの定理による占有確率の更新
  • 対数の性質を利用した確率更新の計算
  • 占有確率に関するパラメータ
  • 占有確率に基づくフィルタリング性能の検証
    • Grid Mapの初期化
    • 占有確率の更新
    • 埃+ノイズとそれ以外の点群の区別
    • 埃とノイズの点群の除去
  • ROSプログラムの設計とソースコード
    • 点群を座標変換するPointCloudTransformer
    • 埃やノイズを除去するPointCloudDustFilter
  • まとめ
続きを読む

ROSでプログラミングをする際に最低限知っておくべきことのまとめ

目的

最近、約8年ぶりにROSを使ったプログラミングをすることに
なったのですが、あまりに久しぶりすぎて基本的なことを全て
忘れてしまっていました。
今回また一から調べなおして整理したので、またいつでも
おさらいできるようにまとめておくことにします。

目次

  • 目的
  • 目次
  • 参考書籍
  • 動作環境
  • ROS1のインストール
  • インクルードパスの設定
  • 作業用ワークスペースを作る
  • 環境変数を設定する
  • パッケージを作る
  • Publisherノードを作る
  • Subscriberノードを作る
  • プログラムを実行する
  • 独自のメッセージ型を作成する
  • 独自メッセージを使って通信するノードを作成する
  • tfで座標変換する
  • rqt_graphでノード間のつながりを確認する
  • rostopicでトピックの内容を確認する
  • rvizで可視化する
  • ユニットテストを実行する
続きを読む

構造化データを前処理する際のPython逆引きメモ

目的

データ分析の仕事をする際は、Pythonで専用のスクリプトを書いたりして
実施することがほとんどですが、自分がやりたい処理をするのに未だに
pandasやnumpy, matplotlibなどの使い方を調べたりすることがあります。
今回は、csvファイルを読み込んだときのような構造化データを処理する
際によく使うコードを、今後すぐ思い出せるようにメモに残しておこうと
思います。

目次

  • 目的
  • 目次
  • DataFrameの各項目型やメモリサイズを確認する
  • DataFrameに欠損値が含まれているか調べる
  • DataFrameに含まれる各データの統計量を計算する
  • データ間の相関係数を計算する
  • 各データの出現数をカウントする
  • 欠損値を除外する
  • 欠損値を補完する
  • 文字列を数値へ置き換える
  • 不均衡データを均衡化する
  • 文字列を集約する
  • データを正規化する
  • データをグループ化する
  • 主成分分析
続きを読む

JavaとSpring BootによるWebアプリ開発の基礎

目的

今後も長くソフトウェアエンジニアとしてのキャリアを築いていくことを
考えたときに、Webやネットワーク、データベースといった技術を利用した
システムを開発できる能力は必須だなと思うようになりました。

そこで、ちょうど今年から仕事でJavaを扱うようになったのと、つい最近
上記の書籍が発売になったのをきっかけに、Webアプリ開発を勉強し始めました。

今回は、その勉強の一環であるタスク管理アプリと、その開発を通じて学んだ
Webアプリ開発の基礎についてまとめたいと思います。

目次

  • 目的
  • 目次
  • Webアプリとは
  • Webアプリの仕組み
  • HTTP通信
  • HTTP通信とHTTPS通信
  • フレームワークを利用したアプリ開発
  • Spring BootによるWebアプリ開発
  • Spring Bootを用いたタスク管理アプリの開発
    • 要件定義
    • 開発用プロジェクトの作成
    • プロジェクトの中身の確認
    • プラグインの設定
    • IntelliJからアプリをビルド・実行するための設定
    • アプリのビルドと実行
    • アプリをコマンドラインから起動できるようにする方法
    • Maven Wrapperとは
    • MVCモデル
    • コントローラを実装するためのアノテーション
    • データベースの導入
    • SQLによるデータベースの操作
    • Javaプログラムからのデータベース接続
    • H2データベースの利用
    • データベーステーブルの初期化
    • データベース操作用クラスの作成
      • JdbcTemplateクラス
      • DI(Dependency Injection: 依存性の注入)
      • タスク情報を保持するモデルの作成
      • データベースにタスク情報を追加するメソッドの実装
      • タスク情報を全て取得するメソッドの実装
      • データベースからタスク情報を削除するメソッドの実装
      • データベースのタスク情報を更新するメソッドの実装
      • データベースから特定のタスクidを取得するメソッドの実装
    • コントローラクラスの作成
      • @Controllerアノテーションによるコントローラの作成
      • TaskListDaoクラスのフィールドへの追加
      • タスクを追加するエンドポイントの作成
      • HTTPリクエストにおけるGETとPOST
      • テンプレートエンジンによるビューの作成
      • Thymeleafの利用
      • HTMLテンプレートの作成
      • タスク一覧表示機能のエンドポイントの作成
      • CSSによるテンプレートの装飾
      • タスク情報を削除するエンドポイントの追加
      • タスク情報を更新するエンドポイントの追加
    • 動作確認
続きを読む

Kth Largest Element in a Stream問題とC++サンプルコード

背景

プログラミングテストの練習問題として、
優先度付きキューの一種であるヒープを利用した
Kth Largest Element in a Stream問題を解いたので、
その解法をメモしておく。

目次

  • 背景
  • 目次
  • 問題
  • 解法
続きを読む

Reverse Linked List問題とC++サンプルコード

背景

プログラミングテストの練習問題として、
連結リストの並びを逆にするReverse Linked List問題を
解いたので、その解法をメモしておく。

目次

  • 背景
  • 目次
  • 問題
  • 解法
    • 1. Iterativeパターン
    • 2. Recursiveパターン
    • 全体サンプルコード
続きを読む