われがわログ

最適化アルゴリズムとかプログラミングについて書きたい

ROS Noeticのrobot_state_publisherはtf_prefix引数をとらない(2020/11現在)

ROS MelodicからNoeticにアップデートして手持ちのプログラムを動作確認したところ、動かなかった(rvizの可視化でエラーが出た)のでその原因をメモしておく。

根本原因は、robot_state_publisherパッケージがtf_prefix引数をとらなくなったことである。 これにより、ロボット毎に名前空間を切れなくなり、座標変換、およびrvizでの可視化に失敗していた。 下記ページによれば、開発側もこの問題を認識しているようで、tf_prefixという名前になるかはともかく、名前空間を切る機能は戻ってくる模様。

answers.ros.org

github.com

というか、引数を変えるなんていう大きな変更は、まず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の方が意図がわかりやすいので良いのではと思う。

変数にアクセスするタイミングを意識すべきであった。

参考

docs.python.org

stackoverflow.com

余談

C++だとこんな感じにかける。std::bindではなくlambda式を使うのが推奨されているので、 PythonC++を行き来するときは要注意。

#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インストール

docs.microsoft.com

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本体をインストールする

wiki.ros.org

コマンドだけ羅列すると以下の通り。

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のプライベートとパブリックの欄にチェックを入れればよい。

odaryo.hatenablog.com

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

demura.net

qiita.com

www.qoosky.io

github.com

新しいパッケージを作るときに参考にするサイト

demura.net

agoutiを使ってスクレイピングするときの余分な表示を消す

Golang + agouti + ChromeDriver + Chromeスクレイピングをしていたが、プログラム実行時に毎回「DevTools listening on ws://127.0.0.1:2441/devtools/browser/8fd65422-e774-4d35-a0cc-036de4564b9a」のような表示が出て煩かったので、これを非表示にする方法を調べた。

結論から言うと、argsexcludeSwitchesの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)
    //以下、必要な処理を行う

stackoverflow.com

bugs.chromium.org

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パッケージをいれる

senooken.jp

  1. CTANからinconsolataパッケージをDL・展開。
  2. 以下のフォルダを作り、docフォルダの中身を移動 C:\w32tex\share\texmf-local\doc\fonts\insonsolata
  3. 以下のフォルダを作り移動、encフォルダの中身を移動。 C:\w32tex\share\texmf-local\fonts\enc\dvips\inconsolata
  4. 以下のフォルダを作り移動、opentypeフォルダの中身を移動。 C:\w32tex\share\texmf-local\fonts\opentype\inconsolata
  5. 以下のフォルダを作り移動、mapフォルダの中身を移動。 C:\w32tex\share\texmf-local\fonts\map\dvips\inconsolata
  6. 以下のフォルダを作り移動、tfmフォルダの中身を移動。 C:\w32tex\share\texmf-local\fonts\tfm\public\inconsolata
  7. 以下のフォルダを作り移動、type1フォルダの中身を移動。 C:\w32tex\share\texmf-local\fonts\type1\public\inconsolata
  8. 以下のフォルダを作り移動、texフォルダの中身を移動。 C:\w32tex\share\texmf-local\tex\latex\inconsolata
  9. mktexlsrコマンドを実行

inconsolata-zi4のREADMEにあるようにtexmf-local以下に適当にファイルを展開してもOKかもしれないが未確認。

最後に、以下のコマンドを押下してupdmap.cfgにmapファイルを追加すればwarning/errorなしでコンパイルできるようになる。

updmap --add zi4.map

こんな面倒な手順を踏まずに Overleafを使えという話ではあるのだが、会社のセキュリティ的にそうもいかないのが悲しい。

「週末レイトレーシング 余生」を読んだ

前々回記事で紹介した「週末レイトレーシング」の第3巻を読んだのでメモ。

waregawa-log.hatenablog.com

inzkyk.xyz

原著:

https://raytracing.github.io/books/RayTracingTheRestOfYourLife.html

この本まで読むと、確率密度関数を使って重点サンプリングができるようになる。 前巻でレンダリングしたコーネルボックスはこれを実装していなかったため、ノイズが多くなってしまっていたが、これを解決できる。 具体的には、光源(光が強いオブジェクト)に対して重点的にサンプリングし、後で重要度重みをかけてサンプリングを変えた影響を補正している。

重点サンプリングに関しては、以下の記事も参考にした。

aidiary.hatenablog.com

f:id:estshorter:20200814124552p:plain
拡散反射をなくして、ライトだけを重点サンプリングしたコーネルボックス
f:id:estshorter:20200814124557p:plain
ライトと拡散反射に関する混合密度関数を使って重点サンプリングしたコーネルボックス
f:id:estshorter:20200814124607p:plain
ライトだけでなく、球に関しても重点サンプリングしたコーネルボックス
f:id:estshorter:20200814124612p:plain
金属球に対する重点サンプリングの例

「週末レイトレーシング 第二週」を読んだ

前回記事で紹介した「週末レイトレーシング」の第2巻を読んだのでメモ。

waregawa-log.hatenablog.com

inzkyk.xyz

原著: https://raytracing.github.io/books/RayTracingTheNextWeek.html

感想としては、効率的に衝突を判定するデータ構造であるBVHのところはかなり面白い。今回のレンダリング画像だと、最後のやつ以外使っていないんだけど。 一方、ノイズ処理だったりボリュームレンダリングのところの説明が足りないなぁという印象。後者については訳注+コードを読みつつ自分の頭で考えたらわかったが、前者はコードだけがある状態だったので、なぜこれでうまくいくのかが納得できなかった。 ただ、全体的にはわかりやすく、この本をやると板・直方体・光源がレンダリングできるようになって汎用性が増すので、前作をやった人は是非やってみてほしい。 複数光源がある場合、どう処理するのか疑問だったのですっきりした。 ちなみに、最後の画像の出力には私のPCでは半日以上かかった。

以下、出力画像集。

f:id:estshorter:20200814124433p:plain
跳ねる球とチェッカーテクスチャ
f:id:estshorter:20200814124437p:plain
チェッカーテクスチャの球2つ。コードギアスでこんな構図(ルルーシュがギアス受け取るらへん?)あったなと思った。
f:id:estshorter:20200814124441p:plain
パーリンノイズテクスチャ
f:id:estshorter:20200814124458p:plain
パーリンノイズをいい感じにしたやつ
f:id:estshorter:20200814124501p:plain
乱流ノイズ
f:id:estshorter:20200814124505p:plain
パーリン+乱流ノイズ。大理石のようになる。
f:id:estshorter:20200814124510p:plain
画像テクスチャの貼り付け
f:id:estshorter:20200814124519p:plain
発光オブジェクトの追加
f:id:estshorter:20200814124534p:plain
コーネルボックス。光源が小さく、ちゃんとサンプリングできていないのでノイズがでている。
f:id:estshorter:20200814124538p:plain
ボリューム(霧)レンダリング
f:id:estshorter:20200814124542p:plain
詰め合わせ