Translate

2019年11月28日木曜日

node環境でaws-iot-device-sdk-jsを使っていたら、Emitted 'error' event on DeviceClient instanceと出て落ちる件

node環境でaws-iot-device-sdk-jsをつかったexpressアプリを作って起動したら、

(env) foo@bar:~/tar $ node server.js
Node.js is listening to PORT:3000
connect
events.js:187
      throw er; // Unhandled 'error' event
      ^

Error: premature close
    at onclosenexttick (/home/pi/projects/donkey_agent_telemetry/node_modules/end-of-stream/index.js:54:86)
    at processTicksAndRejections (internal/process/task_queues.js:75:11)
Emitted 'error' event on DeviceClient instance at:
    at MqttClient. (/home/pi/projects/donkey_agent_telemetry/node_modules/aws-iot-device-sdk/device/index.js:772:15)
    at MqttClient.emit (events.js:215:7)
    at TLSSocket.f (/home/pi/projects/donkey_agent_telemetry/node_modules/once/once.js:25:25)
    at onclosenexttick (/home/pi/projects/donkey_agent_telemetry/node_modules/end-of-stream/index.js:54:73)
    at processTicksAndRejections (internal/process/task_queues.js:75:11)
(env) foo@bar:~/tar $


..というエラーがでた..

'error' イベントがemitされたらしいので

device.on('error', function() {
  console.log('error');
})

を使って例外を無視させようとしたけど、
同じエラーが発生..

どうもほかのイベントすべてを
うけとってやらないとエラーでnodeが落ちるらしい。

device.on('reconnect', function() {
  console.log('reconnect');
})

device.on('close', function() {
  console.log('close');
})

device.on('offline', function() {
  console.log('offline');
})

全部のイベントをうけとるようにしたら、
落ちなくなった...

それだけ。

2019年11月26日火曜日

一般ユーザで実行したら "/dev/uinput" cannot be opened for writing と出る件



    from evdev import uinput, UInput
    from evdev import ecodes as e

Raspberry Pi上で上記のようにevdevパッケージを使ったPythonプログラムを実行しようとしたら、

env) foo@bar:~/tar $ python hogehoge.py
"/dev/uinput" cannot be opened for writing
Have you tried running as root? sudo hogehoge.py
env) foo@bar:~/tar $

というエラーが出た。

virutalenv 上でevdevをインストールしたからかも..
とおもって
virtualenv環境ではなくじかにevdevをインストールして、
sudoをつけて実行すると..うごいた..

でも、このプログラムを一般ユーザでうごかしたい..

ということで調べたら、
以下の方法で動いた。

sudo vi /etc/udev/rules.d/40-uinput.rules

してファイルを新規作成し、

SUBSYSTEM=="misc", KERNEL=="uinput", MODE="0660", GROUP="uinput"

と入力し保存。

つぎに、

sudo vi /etc/modules-load.d/uinput.conf

してファイルを新規作成し、

uinput

と入力し保存。

そして

sudo groupadd uinput
sudo usermod -aG uinput <実行ユーザ名>


して実行ユーザを新規作成したuinputグループに参加させる。

そして

sudo reboot

すればよい。


最近のLinux(raspbeianだけど..)は
ルール関係が複雑で、
入社当時のBSDなんかだと安直に

chmod a+rw /dev/uinput

とかしてたけど、
最近のLinux(raspbeianだけど..)は
ルール関係が複雑なので
こんなことしてもリブートしたらすぐに戻っちゃうだろうから..
(やったことないので、ほんとにそうなるかは、わからないけどね)

2019年11月14日木曜日

I2C 通信の smbus ベースのコードをpigpioに移植中にi2c_read_i2c_block_dataではまる

Python で MPU9250 を使おうとして、
以下のリポジトリを発見。

https://github.com/FaBoPlatform/FaBo9AXIS-MPU9250-Python

ただ、既存コードを pigpio ベースで行っているので、
Apache-2.0ライセンスでもあることから、
コードを書き換えてみようとためしてみた。

pigpioのi2c関連の関数は、
pigpio.pi()で取得したオブジェクトに
smbus とほとんど同じ名前で同じ機能があるので
ほいほいと書き換えていった..

引数のアドレスをpigpioハンドラにすれば
ほとんど変更いらずだわ..

..と、思っていたのだけど..

smbusの

read_i2c_block_data(addr, cmd)

の戻り値が

long[]

になっているのに対し、

pigpio の

i2c_read_i2c_block_data(handle, reg, count)

の戻り値は

Tupple

1要素目が0以上が正常読み込みしたことをあらわし、
負値の場合はエラーコードになる。

そして2要素目が取得した値なのだけど..
これがbytearrayになってる..


..めんどくさー



おきをつけあれ。


ちなみに..私は以下のラップ関数で逃げました。

ご参考まで。

def read_i2c_block_data(pi, handler, reg, count):
    """
    SMBusのread_i2c_block_dataと戻り値を合わせるための関数。
    引数:
        handler     pigpio I2C ハンドラ
        reg         デバイスレジスタ
        count       読み込むバイト数
    戻り値:
        int[]       read_i2c_block_dataの戻り値はlong[]だがpython3
                    なのでint[]
    例外:
        ConnectionError エラーの場合
    """
    if pi is None:
        try:
            import pigpio
        except:
            raise
        pi = pigpio.pi()
    (b, d) = pi.i2c_read_i2c_block_data(handler, reg, count)
    if b >= 0:
        data = []
        for i in range(count):
            value = int(d[i])
            data.append(value)
        return data
    else:
        raise ConnectionError('Error:{} in i2c_read_i2c_block_data'.format(
            str(b)))


誤りがあれば、コメント欄にご指摘ください。

OpenAI Gym 環境クラスを独自実装してみる

強化学習を行う場合、Stable BaselinesやTensorFlowなどのAPIではOpenAI Gym準拠の環境クラスを使用することができる。 ので、個別案件に対応する独自環境クラスを作りたい.. ということで実際に作ってみた。 独自環境クラスを実装するには、まずOpen...