可変ブログ

色々メモとか。とりあえず自分が分かるように。その後、なるべく人が見て分かるように。可変。

記事一覧

ROS2参考URLまとめ




プロセス内通信について




マルチスレッド




ROS2⇔ROS1 通信


ROS2 API


python

この方はおそらく同業者だ


俺用ROS2トラブルシューティング

colcon がない
→ 自分で入れよう

sudo apt install python3-colcon-common-extensions




create_subscriptionで警告が出るとき
キューサイズを入れないといけなくなった




コールバック関数でトピック名を取得したい
ラムダ式かbindを使おう



ROS2の setup.bash を必要なときだけ source する

ROS2を入れたけど, setup.bash を source すると地味に時間がかかる.
これを .bashrc で source させるようにすると, ROS2 を使わないときでもターミナルを開くたびに時間がかかって地味にストレス.
かと言って, ROS2 を使うときだけ手打ちで source するのも面倒.
ということで, ターミナル開いて初めてROS2系コマンド (colcon含む) を打つときだけ source させるようなスクリプト書きました.
以下を .bashrc に追記すればOK

colconSetted() {
  if [ -z "$ROS2SETTED" ]; then
    source /opt/ros/dashing/setup.bash
    source ~/ros2_ws/install/setup.bash
    ROS2SETTED=1
  fi
  \colcon "$@"
}
ros2Setted() {
  if [ -z "$ROS2SETTED" ]; then
    source /opt/ros/dashing/setup.bash
    source ~/ros2_ws/install/setup.bash
    ROS2SETTED=1
  fi
  \ros2 "$@"
}
alias colcon="colconSetted"
alias ros2="ros2Setted"

一発なにかROS2系のコマンドを打たないと補完が効かないのが玉にキズ.
それだったらエイリアス組んで自分で打ったほうがいいのではと思ってしまったりするけど気にしない.
あとまっさらな状態からパッケージを作ったとき, ~ros2_ws/install/setup.bash が無いとエラー出る.



おまけで, colconでパッケージを指定してビルドする
colcon build --symlink-install --packages-select
も長くて面倒なので cbp に置き換えるスクリプトを書きました.

cbp() {
  cd ~/ros2_ws && colcon build --symlink-install --packages-select "$@"
  cd -
}




参考URL



C++クラス内でのラムダ式のキャプチャとか

なんとメンバ変数はコピーキャプチャできない
デフォルトキャプチャを=にするとぱっと見コピーキャプチャできてるように見えるが, 実は参照キャプチャされているらしい

あとthisをキャプチャするとthisポインタだけがコピーされると思っていたが, メンバ変数も(参照だけど)触れるようになってる.
つーか下記サイトにちゃんと
[this] : *thisのメンバを参照して、ラムダ式のなかで使用する
って書いてある.

NetEnumの代わりになるLinuxコマンド

sudo nmap -sn 192.168.0.0/24
arp -a

arpのほうはなんかちょっと違う気がする。


windows.hとwinsock.hとwinsock2.hと

winsock.hとwinsock2.hは競合する
windows.hにはwinsock.hが含まれている
windows.hとwinsock2.hをどちらも使いたいときにどうしようもなくなる
windows.hをインクルードする前に下記を定義するとwinsock.hのインクルードを回避してくれる。
#define WIN32_LEAN_AND_MEAN
分割コンパイルの時には複数回ヘッダが読まれることがあるので#define WIN32_LEAN_AND_MEANを記載する位置に注意する。
なるべく上位で定義しないとうまく回避してくれない場合がある。

もしくはインクルードの順番をwinsock2.h -> winsock.hにするとよい。


#define _WINSOCKAPI_
この対処はよくないと思う。
本当はインクルードしてないwinsock.hをインクルードしたからもうしなくていいよっていうウソの定義をしている。
どっかでエラーが出るかもっていうか実際にboost::asioでエラーが出た。
boost::asioには_WINSOCKAPI_が定義されているとエラーを出すところがある。