ROS Noeticのrobot_state_publisherはtf_prefix引数をとらない(2020/11現在)
ROS MelodicからNoeticにアップデートして手持ちのプログラムを動作確認したところ、動かなかった(rvizの可視化でエラーが出た)のでその原因をメモしておく。
根本原因は、robot_state_publisher
パッケージがtf_prefix
引数をとらなくなったことである。
これにより、ロボット毎に名前空間を切れなくなり、座標変換、およびrvizでの可視化に失敗していた。
下記ページによれば、開発側もこの問題を認識しているようで、tf_prefix
という名前になるかはともかく、名前空間を切る機能は戻ってくる模様。
というか、引数を変えるなんていう大きな変更は、まずdeprecated warningを出した後にするべきだと思うのだが、、、 ビルドツールの乱立(catkin_make catkin_tools, ament, colcon)といい、ROSの開発側は互換性を軽んじているところがある。
Pythonでループ内でlambdaを使う際には注意しろ
Pythonでlambdaで関数オブジェクトを作り、リストにループで突っ込んだところ、 意図した結果にならず盛大に時間を溶かしたのでメモしておく。
まとめ
C++の std::bind
みたいにPythonのlambdaを使う場合には functools.partial
を使う。
本文
以下のコードの出力は何だろうか?
lambdas = [lambda : i for i in range(3)] for f in lambdas: print(f())
私は
1 2 3
となることを予想して上記プログラムを書いた。 だが、正解は
2 2 2
である。
これは、lambdaがi
にアクセスするタイミングが実行時であることに起因する。
0,1,2と出力させたい場合には、以下のように書く必要がある。
from functools import partial lambdas = [partial(lambda i: i, i) for i in range(3)] for f in lambdas: print(f())
partialを使わずに
lambdas = [lambda x=i: x for i in range(3)]
でもよいが、paritalの方が意図がわかりやすいので良いのではと思う。
変数にアクセスするタイミングを意識すべきであった。
参考
余談
C++だとこんな感じにかける。std::bind
ではなくlambda式を使うのが推奨されているので、
PythonとC++を行き来するときは要注意。
#include <iostream> #include <vector> #include <functional> int main() { auto lambdas = std::vector<std::function<int()>>{}; for (int i=0;i<3;i++){ lambdas.push_back([i]{ return i; }); } for (int i=0;i<3;i++){ std::cout << lambdas[i]() << std::endl; } }
std::bind
を使うとこう。
int nop(int x){ return x } ---- lambdas.push_back(std::bind(nop, i));
WSL2でのROS (Melodic)の初期設定
ROSを触る機会があったのでまとめておく。 ROSはMelodic、OS はUbuntu18.04、XサーバはVcXsrvを想定。
XサーバにX410を使いたいとき → Using X410 with WSL2 - X410.dev
WSL2インストール
aptのサーバを日本にしておくとDLが早い。
sudo sed -i 's/\/\/archive.ubuntu.com/\/\/jp.archive.ubuntu.com/g' /etc/apt/sources.list sudo sed -i 's/\/\/us.archive.ubuntu.com/\/\/jp.archive.ubuntu.com/g' /etc/apt/sources.list sudo sed -i 's/\/\/fr.archive.ubuntu.com/\/\/jp.archive.ubuntu.com/g' /etc/apt/sources.list
ROS2インストール
まず、公式ページに従ってROS本体をインストールする
コマンドだけ羅列すると以下の通り。
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt update sudo apt install ros-melodic-desktop-full echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc source ~/.bashrc sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential sudo rosdep init rosdep update
catkin toolsをインストールしておく。
catkin build
でビルドできるようになる。
sudo apt install python-catkin-tools
ワークスペースを作成する。
mkdir -p ~/catkin_ws/src
ビルドできるか確認
cd ~/catkin_ws
catkin build
WSL2向けGUI設定
# Xサーバー通信用のアプリ群を入れる sudo apt install x11-apps -y # 環境変数を設定する ## rvizを正常起動させるため、間接レンダリングしない echo 'export LIBGL_ALWAYS_INDIRECT=0' >> ~/.bashrc ## /etc/resolv.confから取得した、ホストPCのIPアドレスをDISPLAY変数に代入 echo 'export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '\''{print $2}'\''):0' >> ~/.bashrc source ~/.bashrc
VcxSrvは、Native openglのチェックを外し、Disable access controlにチェックを入れる。 さらに、以下のサイトを参考にWindowsディフェンダーの設定を変更する。 具体的には、VcxSrvのプライベートとパブリックの欄にチェックを入れればよい。
Windows上でVcxSrvを起動したのち、Ubuntu上でxeyes
と打ってGUIが表示されれば、GUI環境は正しく設定できている。
もしGazebo起動時に
[Err] [REST.cc:205] Error in REST request
のようなエラーが出力されていた場合は、~/.ignition/fuel/config.yaml
中のURLをhttps://api.ignitionrobotics.org
に修正すればよい。
また、同じくGazebo起動時に
ALSA lib confmisc.c:767:(parse_card) cannot find card '0' ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or directory ALSA lib confmisc.c:392:(snd_func_concat) error evaluating strings ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory ALSA lib confmisc.c:1246:(snd_func_refer) error evaluating name ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM default AL lib: (EE) ALCplaybackAlsa_open: Could not open playback device 'default': No such file or directory
とエラーが出る場合には、以下の内容を/etc/asound.conf
に書き込み、alsaが使うデフォルトのオーディオデバイスをnullに設定すればよい。
pcm.!default {
type plug
slave.pcm "null"
}
この設定では音は鳴らないが、ROSを使う上で特に問題はないだろう。
Ref
新しいパッケージを作るときに参考にするサイト
agoutiを使ってスクレイピングするときの余分な表示を消す
Golang + agouti + ChromeDriver + Chromeでスクレイピングをしていたが、プログラム実行時に毎回「DevTools listening on ws://127.0.0.1:2441/devtools/browser/8fd65422-e774-4d35-a0cc-036de4564b9a」のような表示が出て煩かったので、これを非表示にする方法を調べた。
結論から言うと、args
とexcludeSwitches
の2つのオプションを以下のようにChromeDriver
に渡せばよい。
chromeArgs := agouti.ChromeOptions( "args", []string{ "--headless", "--disable-gpu", }) chromeExcludeSwitches := agouti.ChromeOptions( "excludeSwitches", []string{ "enable-logging", }) driver := agouti.ChromeDriver(chromeArgs, chromeExcludeSwitches) defer driver.Stop() //本当はエラーハンドリングが必要 driver.Start() page, _ := driver.NewPage() page.Navigate(URL) //以下、必要な処理を行う
W32TeX でいれたTeXでaamas.clsやacmart.clsを使う
W32TeX でいれたTeXでaamas.clsやacmart.clsを使おうとしたらパッケージがなく warning/errorが出たのでメモ。 なお、最初はwarningを見落としており、公式のとは違ったフォーマットのPDFファイルが出力されて焦った。
手順
まず、以下のパッケージをインストールする。
具体的には、latex PACKAGE_NAME.ins
などとしてinsファイルからコンパイルした後、C:\w32tex\share\texmf-local\tex\latex\PACKAGE_NAME
以下にstyファイル等を配置する。
- cmap
- ncctools
- preprint
- totpages
次に、以下のページを参考にzi4パッケージをいれる
- CTANからinconsolataパッケージをDL・展開。
- 以下のフォルダを作り、docフォルダの中身を移動
C:\w32tex\share\texmf-local\doc\fonts\insonsolata
- 以下のフォルダを作り移動、encフォルダの中身を移動。
C:\w32tex\share\texmf-local\fonts\enc\dvips\inconsolata
- 以下のフォルダを作り移動、opentypeフォルダの中身を移動。
C:\w32tex\share\texmf-local\fonts\opentype\inconsolata
- 以下のフォルダを作り移動、mapフォルダの中身を移動。
C:\w32tex\share\texmf-local\fonts\map\dvips\inconsolata
- 以下のフォルダを作り移動、tfmフォルダの中身を移動。
C:\w32tex\share\texmf-local\fonts\tfm\public\inconsolata
- 以下のフォルダを作り移動、type1フォルダの中身を移動。
C:\w32tex\share\texmf-local\fonts\type1\public\inconsolata
- 以下のフォルダを作り移動、texフォルダの中身を移動。
C:\w32tex\share\texmf-local\tex\latex\inconsolata
mktexlsr
コマンドを実行
inconsolata-zi4のREADMEにあるようにtexmf-local
以下に適当にファイルを展開してもOKかもしれないが未確認。
最後に、以下のコマンドを押下してupdmap.cfg
にmapファイルを追加すればwarning/errorなしでコンパイルできるようになる。
updmap --add zi4.map
こんな面倒な手順を踏まずに Overleafを使えという話ではあるのだが、会社のセキュリティ的にそうもいかないのが悲しい。
「週末レイトレーシング 余生」を読んだ
前々回記事で紹介した「週末レイトレーシング」の第3巻を読んだのでメモ。
原著:
https://raytracing.github.io/books/RayTracingTheRestOfYourLife.html
この本まで読むと、確率密度関数を使って重点サンプリングができるようになる。 前巻でレンダリングしたコーネルボックスはこれを実装していなかったため、ノイズが多くなってしまっていたが、これを解決できる。 具体的には、光源(光が強いオブジェクト)に対して重点的にサンプリングし、後で重要度重みをかけてサンプリングを変えた影響を補正している。
重点サンプリングに関しては、以下の記事も参考にした。
「週末レイトレーシング 第二週」を読んだ
前回記事で紹介した「週末レイトレーシング」の第2巻を読んだのでメモ。
原著: https://raytracing.github.io/books/RayTracingTheNextWeek.html
感想としては、効率的に衝突を判定するデータ構造であるBVHのところはかなり面白い。今回のレンダリング画像だと、最後のやつ以外使っていないんだけど。 一方、ノイズ処理だったりボリュームレンダリングのところの説明が足りないなぁという印象。後者については訳注+コードを読みつつ自分の頭で考えたらわかったが、前者はコードだけがある状態だったので、なぜこれでうまくいくのかが納得できなかった。 ただ、全体的にはわかりやすく、この本をやると板・直方体・光源がレンダリングできるようになって汎用性が増すので、前作をやった人は是非やってみてほしい。 複数光源がある場合、どう処理するのか疑問だったのですっきりした。 ちなみに、最後の画像の出力には私のPCでは半日以上かかった。
以下、出力画像集。