背景
カチャカプロは台車の重さを考慮すると20kgくらい運べる小型搬送機アップデートで複数タスクを指定できるようになったこともあり、標準アプリだけでも活用が出来るようになった。
でもさすがにエレベータ連携とかを標準アプリに期待は出来ないので連携できるような仕組みを構築している。 IoTシステムとしてNode-REDを使っていることもあり、Node-REDとの連携を検討したが更新が途絶えているようだった。
issuesを見ても誰もメンテナンスしてない感を感じた。枯れていればバージョン更新されていなくてもよいかと思うが・・・
https://github.com/julien-pal/node-red-contrib-grpc/issues
カチャカとしてはROS2ブリッジを立てる案もある。
https://github.com/pf-robotics/kachaka-api/blob/main/docs/ROS2.md
ただ、APIブリッジサーバを立てて管理するものを増やしたくは無い。
もやもやして代替案を模索した結果、gRPC自体はNode.js用のモジュールを配布していたので
Node.jsのライブラリを導入してNode-REDから呼ぶことにした。
方法
1.現在のNode-REDのプロジェクトに依存する公式のgRPCを導入する。
cd ~/.node-red/projects/<プロジェクト名>
npm install --save @grpc/grpc-js @grpc/proto-loader
2.最新のコマンドリストを取得する
git clone https://github.com/pf-robotics/kachaka-api.git
3.Node-REDで外部モジュールを使える設定に変更する
nano ~/.node-red/projects/<プロジェクト名>/settings.js
functionExternalModules: true,
対応するコマンドをコードで実行する。以下はGetRobotVersion
(async () => {
const PROJECT_ROOT = '/home/ユーザ名/.node-red/projects/<プロジェクト名>';
const PROTO = path.resolve(PROJECT_ROOT, 'kachaka-api', 'protos', 'kachaka-api.proto');
const KACHAKA_ADDR = 'カチャカのIP:26400';// mdnsがいけるなら kachaka-シリアル番号.local:26400
try {
// .proto をロード
const pkgDef = await protoLoader.load(PROTO, {
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true,
includeDirs: [path.resolve(PROJECT_ROOT, 'kachaka-api', 'protos')]
});
const desc = grpc.loadPackageDefinition(pkgDef);
const Service = desc.kachaka_api && desc.kachaka_api.KachakaApi;
if (!Service || !Service.service) {
node.error('サービス kachaka_api.KachakaApi が見つかりません', msg);
return;
}
const client = new Service(
KACHAKA_ADDR,
grpc.credentials.createInsecure(),
{
'grpc.keepalive_time_ms': 60000,
'grpc.keepalive_timeout_ms': 20000,
'grpc.enable_retries': 1
}
);
if (typeof client.GetRobotVersion !== 'function') {
node.error('メソッド GetRobotVersion が見つかりません', msg);
return;
}
client.GetRobotVersion({}, (err, res) => {
if (err) {
node.error(err, msg);
return;
}
msg.payload = res;
node.send(msg);
});
} catch (e) {
node.error(e, msg);
}
})();
return;
結果
{"_msgid":"XXXXXXXXXXXX","payload":{"metadata":{"cursor":{"low":999760898,"high":29,"unsigned":false}},"version":"3.14.7"},"topic":""}
メリット
プロジェクトごとにgRPCのバージョンやproto(カチャカのコマンドリストなどの定義)を管理できる
Node-REDのプロジェクトクローン時に付随してコピーされる
デメリット
GUIで楽に導入できない
バージョンアップも基本コマンド
まとめ
Node-REDからNode.jsのgRPCライブラリを使って通信可能。動作もサクサク。
カチャカプロのカメラ映像も取得出来ました。
