usbipdが実行できない
WSL2でUSBデバイスを使いたく,以下に従っていた.
USB デバイスを接続する | Microsoft Learn
以下のエラーに遭遇した.
$ usbipd wsl attach --busid 1-2 usbipd: error: There are no WSL distributions installed; see https://docs.microsoft.com/windows/wsl/basic-commands#install on how to install one.
また,リストさせてもインストールされているディストリビューションが見つからない.
しかし,microsoft storeからUbuntu22.04をインストールしたし,実行できるぞ.どういうことだ?
wsl -l -v Windows Subsystem for Linux has no installed distributions. Distributions can be installed by visiting the Microsoft Store: https://aka.ms/wslstore
結論,管理者側にwslをインストールしていなければならなかった.
no installed distributions · Issue #5252 · microsoft/WSL · GitHub
再度,Ubuntu22.04を管理者側で設定しなおし,usbipdを実行したら成功した.
WSL2環境のPlatformIOでeigenを使用すると,Teensyのabsとroundが衝突する
以下のmainファイルをコンパイルすると,Teensyフレームワークのabsマクロと,Eigenが内部で使用しているstd::abs関数との間で名前の衝突が発生する.
同様にroundも衝突するようだ.
WSL2でのみ起きる現象で,Ubuntuやwindows10では発生しない.
#include <Arduino.h> #include <Eigen/Core> void setup() { } void loop() { }
Compiling .pio/build/main/src/main.cpp.o In file included from /home/hidaka/.platformio/packages/framework-arduinoteensy/cores/teensy4/WProgram.h:46, from /home/hidaka/.platformio/packages/framework-arduinoteensy/cores/teensy4/Arduino.h:6, from src/main.cpp:1: /home/hidaka/.platformio/packages/framework-arduinoteensy/cores/teensy4/wiring.h:164:17: error: expected unqualified-id before '{' token 164 | #define abs(x) ({ \ | ^ /home/hidaka/.platformio/packages/framework-arduinoteensy/cores/teensy4/wiring.h:164:17: error: expected ')' before '{' token 164 | #define abs(x) ({ \ | ~^ /home/hidaka/.platformio/packages/framework-arduinoteensy/cores/teensy4/wiring.h:167:2: error: expected unqualified-id before ')' token 167 | }) | ^ /home/hidaka/.platformio/packages/framework-arduinoteensy/cores/teensy4/wiring.h:164:17: error: expected unqualified-id before '{' token 164 | #define abs(x) ({ \ | ^ /home/hidaka/.platformio/packages/framework-arduinoteensy/cores/teensy4/wiring.h:164:17: error: expected ')' before '{' token 164 | #define abs(x) ({ \ | ~^ /home/hidaka/.platformio/packages/framework-arduinoteensy/cores/teensy4/wiring.h:167:2: error: expected unqualified-id before ')' token 167 | }) | ^ In file included from .pio/libdeps/main/eigen/Eigen/Core:78, from src/main.cpp:2: /home/hidaka/.platformio/packages/toolchain-gccarmnoneeabi-teensy/arm-none-eabi/include/c++/11.3.1/complex: In function 'std::complex<_Tp> std::__complex_log(const std::complex<_Tp>&)':
対策として,以下のようにEigenをインクルードする前にマクロをundefし,インクルード後にマクロをdefineし直す.
#include <Arduino.h> #undef abs #ifdef round #define ROUND_WAS_DEFINED #undef round #endif #include <Eigen/Core> #define abs(x) ({ \ typeof(x) _x = (x); \ (_x > 0) ? _x : -_x; \ }) #ifdef ROUND_WAS_DEFINED #define round(x) ((long) __builtin_round(x)) #undef ROUND_WAS_DEFINED #endif void setup() { } void loop() { }
SureStar社 LiDAR R-Fans-16の使い方
購入するとwindows用のviewerソフトと、ROSパッケージrfans_driverが送付される。
ROSパッケージはディレクトリ名がROSDriverとなっている。
githubにリポジトリが存在するようだが、設定ファイルがないので、購入時に送付されるパッケージを使用したほうがよい。
https://github.com/Surestar-LiDAR/StarROS
LiDAR側はWeipu防水コネクタにまとまっており、そこからEthernet用のRJ45、電源用のXT-30、D-sub9ピン(用途不明)が分岐する。
LiDARの電源(12V)を接続して、電源スイッチをONにすると待機電流0.5 A程度流れる。
LANに接続すると、192.168.0.3にIPアドレスが設定される。
pingして確認しよう
$ ping 192.168.0.3 PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data. 64 bytes from 192.168.0.3: icmp_seq=6 ttl=128 time=0.129 ms 64 bytes from 192.168.0.3: icmp_seq=7 ttl=128 time=0.129 ms 64 bytes from 192.168.0.3: icmp_seq=8 ttl=128 time=0.135 ms
ROSパッケージをビルドしてから、node_manager.launchを起動する
cd ~/noetic_ws/src/ROSDriver catkin build --this roslaunch rfans_driver node_manager.launch
正常に起動すると、LiDARが回転し始め、/rfans_driver/rfans_pointsがパブリッシュされる
rvizで確認
roscd rfans_driver rviz -d RFans_Rviz_cfg.rviz
上記はルーターを使用しているが、ロボットに載せる場合には直接PCのLANアダプタに挿すだろう。
その場合は以下のコマンドでeth0のIPアドレスを192.168.3.100(なんでもいい)に設定し、LiDARのIPアドレスに静的ルートを追加する。
sudo ifconfig eth0 192.168.3.100 sudo route add 192.168.0.3 eth0
Autodesk Inventorでclark y翼を作成
Inventorのスケッチの機能でexcelから座標データをインポートすることができるので、それを使用します。
まず、以下から座標データをコピー
http://airfoiltools.com/airfoil/details?airfoil=clarky-il
xlsxファイルにしたいので、まずcsv形式でファイルを作成、頑張ってカンマ区切りにして、先ほどの座標を保存します。
excelでcsvを開いて、保存→拡張子xlsxを指定して保存します。
座標の順序も調整する必要があって、座標が連続するように入れ替えてやる必要があります。
(ここはそのうち自動でやりたいね)
Inventorでは、2Dスケッチで、挿入→点を選択します。
先ほどの作成したファイルを選択します。
このとき、オプションで「線分を作成」を指定します。
こんな感じでインポートできました。(長さが1のはずなので拡大しないと見えない)
修正→尺度を指定して大きさを調整します。翼弦長を150 mmにしたい場合、150を指定します。
スケッチを終了して、押し出しを行います。
mbed-cli Dockerから書き込みたいとき
https://github.com/ARMmbed/mbed-tools/issues/308
docker runするときに、--privileged -v /dev/disk/by-id:/dev/disk/by-id -v /dev/serial/by-id:/dev/serial/by-id -v /run/udev:/run/udev:ro オプションを追加
docker上で以下を実行
$ mount /dev/sdb /mnt
挿し直したら
$ mount /dev/sdc /mnt
SSHでwifi接続してIPアドレス固定するまで
まずは有線LANで接続、IPアドレス不明なのでAdvanced IP scannerなどで調べる
nmcli dev wifi connect
SSH接続でやると、エラーがでるので、以下に従う
linux - Not authorized to control networking in SSH console - Super User
sudo vim /etc/polkit-1/localauthority/50-local.d/allow-ssh-networking.pkla
以下を書き込み保存
[Let adm group modify system settings for network] Identity=unix-group:adm Action=org.freedesktop.NetworkManager.network-control ResultAny=yes
確認
nmcli general permissions
wifi接続
nmcli dev wifi connect <SSID> password <PASSWORD>
状態を確認
nmcli -f ipv4 con show <SSID>
以下でipアドレスを固定
nmcli con mod <SSID> ipv4.addresses "192.168.0.77" nmcli con mod <SSID> ipv4.gateway "192.168.0.1" nmcli con mod <SSID> ipv4.method manual nmcli con down <SSID> ; nmcli con up <SSID>
mbed LPC1768とpythonでCAN通信するだけ
mbedとWindows 10とでCAN送受信します。
必要なもの
- mbed LPC1768 ×1
- CANale pro ×1
- MCP2551モジュール ×1
USB-CAN変換はamazonとかで売ってるのもあるね
接続
接続はmbed Handbookのとおり
今回はpin29, 30のみ使用しました。
- p29 - CTX
- p30 - CRX
- VU - VCC
- GND - GND
Windows側はCANable(USB-CAN変換)を接続します。
CANableとMCP2551のCANH, CANL GNDを接続します。
CANableのショートコネクタは基板側にセットします
コード
コード(mbed側)
#include "mbed.h" DigitalOut led1(LED1); DigitalOut led2(LED2); CAN can(p30, p29); int main() { printf("main()\n"); char counter = 0; can.frequency(100000); CANMessage msg; while(1) { printf("loop()\r\n"); if(can.read(msg)) { for(int i = 0; i < msg.len; i++) printf("%d, ", msg.data[i]); led2 = !led2; } wait(0.2); can.write(CANMessage(0x123, &counter, 1)); counter++; } }
python-canをインストールします。
$ pip install python-can
$ pip3 install python-can
import can def demo(): msg = [1,2,3,4,5,6,7,8] can_bus = can.interface.Bus(bustype='slcan', channel='COM20', bitrate=100000) while True: try: send_msg = can.Message(arbitration_id=0x201, data=msg, is_extended_id=False) can_bus.send(send_msg) received_msg = can_bus.recv(0.1) if received_msg: print(received_msg) except KeyboardInterrupt: can_bus.close() break if __name__ == '__main__': demo()
実行結果
mbed側