EurekaMoments

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

日本企業から中国企業に転職して自動運転エンジニアとして働くことになった話

目的

突然ですが、今年2023年に新卒から12年務めた日本企業を退職し、
中国の企業に転職して現地で自動運転システムエンジニアとして
働くことになりました。

今まで海外で働いた経験も無く、中国語も話せない、そしてコロナ禍
ということもあり、日本企業から中国企業へ転職するというのはかなり
大変だったのですが、なんとか無事に自動運転システムエンジニアとして
雇ってもらうことができました。

自分の今回の転職活動経験が他の誰かの参考にもなればと思い、今回の
記事にまとめることにしました。かなり盛沢山の内容ですが、最後まで
読んでいただけると嬉しいです。

目次

  • 目的
  • 目次
  • 自己紹介
  • 現職について
  • 転職理由
    • 彼女との国際結婚
    • 海外で自動運転技術の研究開発をしたい
  • 転職活動期間
  • 転職する企業を決める際の条件
    • ソフトウェア開発業務に携われる
    • 自動運転システムの研究開発業務に携われる
    • 現状よりも高い給与が貰える
    • ソフトウェア開発の態勢が整っている
  • 転職活動の間にやったこと
    • レジュメを作成する
    • 求人を探して応募する
    • 面接・テストの対策をする
    • 英会話スキルの向上に取り組む
    • オファー内容の交渉をする
  • 応募した企業と選考結果
  • 今回の転職活動における反省点
  • 中国で働く企業・業務について
  • まとめ
  • 最後に
続きを読む

ソフトウェアエンジニアの技術面接で実際に出たC++質問集

目的

自分のように自律移動システムを開発するエンジニアの採用プロセスでは、
C++の知識がどれだけあるかを問われる技術面接が必ずあると思います。

今まで何度か実際に面接を受けたことがありますが、いざ聞かれて答えようと
すると(しかも英語で)、自分がC++の事を全然理解出来ていないということを
思い知らされました。

今後また同じ質問をされたときはちゃんと答えられるように、これまでに
問われた質問の内容と、その模範解答をまとめておこうと思います。

目次

  • 目的
  • 目次
  • 質問集
    • C++とPythonの違い
    • クラス/構造体/共用体の違い
    • ポインタ渡しと参照渡しの違い
      • 値渡し (Pass by Value)
      • ポインタ渡し (Pass by Pointer)
      • 参照渡し (Pass by Reference)
    • constの使い方
    • メモリの扱い方
      • reallocの注意点
    • C++における4大メモリ
      • プログラム用メモリ
      • 静的変数用メモリ
      • スタック用メモリ
      • ヒープ用メモリ
      • スタックとヒープの違い
    • 再帰関数とスタックオーバーフロー
    • メモリリークとは
    • テンプレートとは
      • 値パラメータ
      • クラステンプレート
    • 仮想関数とは
      • オーバーライド
      • 呼び出し
      • 純粋仮想関数
    • 2つのベクトルの内積の求め方
    • 2次元配列のメモリを動的に確保する方法
    • emplace_back/emplaceとは
      • emplace系の特徴
      • push_backとの違い
    • ムーブコンストラクタとは
    • C++におけるコピー
      • シャローコピー(Shallow copy)
      • ディープコピー(Deep copy)
      • コピーコンストラクタの必要性
    • ガベージコレクションとは
      • Scavenge GC
      • Full GC
    • イテレータとは
続きを読む

自然言語データを前処理する際のPython逆引きメモ

目的

これまでにデータ解析の仕事で扱ってきたのは主に
時系列データや画像データなど、数値で表現される
データでした。

しかしながら、最近では自然言語データのように
数値データではないものも解析できることが重量と
なってきました。

今回、上記の書籍で自然言語データに対する前処理の
手法について勉強したのでこの記事でまとめておこうと
思います。

目次

  • 目的
  • 目次
  • 自然言語処理の考え方
  • 形態素解析(Morphological Analysis)
    • 活用例
    • Janomeによる形態素解析
    • 正規表現による不要な文字列の除去
    • 品詞として単語を抽出
    • 単語の出現回数を数える
  • 分割した単語をデータフレームにまとめる
  • 分割した単語の文書行列を作成する
  • 出現回数が多い順に単語を列挙する
  • 出現する文書の比率で次元を削減する
  • TF-IDF値を算出する
  • RNNのためのデータセットを作成する
    • RNNの仕組みや活用例
    • LSTMの仕組みや活用例
    • 単語や句読点、括弧などの単位に文書を区切る
    • 出現数の降順に単語をソートする
    • ソートした単語にIDを付与する
    • 文書中の単語を数値に変換する
    • 単語IDリストの長さを揃える
  • トピック抽出のためのデータセットを作成する
    • ネットワーク分析による抽出
    • 共起ネットワークを作るためのエッジリスト
    • 単語文書行列を作る
    • コサイン類似度を計算する
    • 単語ペアと類似度をリストアップする
    • 関連性の強いペアを抽出する
    • エッジリストを確認する
続きを読む

時系列データを前処理する際のPython逆引きメモ

目的

データ分析の仕事をする中で最も扱う機会が多いのが
時系列データだと思います。その中で欠損値を扱ったり、
統計を取ったり、特徴量を作り出したりするのですが、
毎回やり方を忘れてググっているので、上記の書籍を読んで
こういった前処理の方法をいつでも確認できるように
メモしておこうと思います。

目次

  • 目的
  • 目次
  • 日時のデータをdatetime型に変換する
  • 最初の日時からの経過時間を計算する
  • 各データの統計量を計算する
  • 欠損値の確認と補完
  • 経過時間の単位を変換する
  • データフレーム結合する
  • 基準日時からの経過時間を計算する
  • 重複した行を削除する
  • 特定のデータ列をインデックスにする
  • 部分的時系列を抽出して統計量を計算する
  • データフレームの各列をリストにして結合する
  • 不均衡データから教師データを作成する
    • データの読み込みと可視化
    • K近傍法で教師データを作成する
    • 異常検出モデルを作成する
  • オートエンコーダで教師データを作成する
    • オートエンコーダの仕組み
    • 異常検出モデルを学習する
    • 学習したモデルにテストデータを適用する
続きを読む

画像データを前処理する際のPython逆引きメモ

目的

データ分析の仕事をする際はPythonで専用スクリプトを書いて
大量のデータを一括処理するなんてことをよくやりますが、
今後は画像データに対する処理のスキルも習得する必要性が
出てきました。そこで、上記の書籍から画像データに対する
前処理のやり方をいろいろ学んだので、それらを忘れないように
まとめておくことにします。

目次

  • 目的
  • 目次
  • 画像ファイルを読み込む
  • 配列のサイズを確認する
  • ピクセル値を確認する
    • カラー画像
    • グレースケール画像
    • 2値化画像
  • 機械学習のためのデータセット作成
  • モルフォロジー変換
    • 収縮(Erosion)
    • 膨張(Dilation)
    • オープニング(Opening)
    • クロージング(Closing)
  • ピクセル値のヒストグラム化
  • t-SNEによる次元圧縮
  • 訓練データとテストデータへの分割
  • 画像データの水増し
    • 反転
    • 平滑化
    • 明るさの変更
続きを読む

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で可視化する
  • ユニットテストを実行する
続きを読む