元高専生のロボット作り

元高専生のロボット作り

主にプログラミング, 電子系について書きます。たまに機械系もやります。メモ代わりの記事ばっか書きます

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形式でファイルを作成、頑張ってカンマ区切りにして、先ほどの座標を保存します。
excelcsvを開いて、保存→拡張子xlsxを指定して保存します。
座標の順序も調整する必要があって、座標が連続するように入れ替えてやる必要があります。
(ここはそのうち自動でやりたいね)

Inventorでは、2Dスケッチで、挿入→点を選択します。

f:id:sgrsn1711:20211203164715p:plain

先ほどの作成したファイルを選択します。
このとき、オプションで「線分を作成」を指定します。

f:id:sgrsn1711:20211203164931p:plain

こんな感じでインポートできました。(長さが1のはずなので拡大しないと見えない)

f:id:sgrsn1711:20211203165155p:plain

修正→尺度を指定して大きさを調整します。翼弦長を150 mmにしたい場合、150を指定します。

f:id:sgrsn1711:20211203165339p:plain

スケッチを終了して、押し出しを行います。

f:id:sgrsn1711:20211203165618p:plain

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などで調べる

SSH接続し、nmcliでwifiに接続する

nmcli dev wifi connect password

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

ja.aliexpress.com

ja.aliexpress.com


USB-CAN変換はamazonとかで売ってるのもあるね






接続

接続はmbed Handbookのとおり
今回はpin29, 30のみ使用しました。

  • p29 - CTX
  • p30 - CRX
  • VU - VCC
  • GND - GND

f:id:sgrsn1711:20210622223350p:plain

CAN - Handbook | Mbedより

Windows側はCANable(USB-CAN変換)を接続します。

CANableとMCP2551のCANH, CANL GNDを接続します。
CANableのショートコネクタは基板側にセットします

f:id:sgrsn1711:20210622223824j:plain




コード

コード(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++;
    }
}


windows側 (python)

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()

実行結果

python
f:id:sgrsn1711:20210622223937p:plain

mbed側
f:id:sgrsn1711:20210622223952p:plain