short lecture note for building a web-based UI of a ROS system (in Japanese)
では、roslibjsを使って、ブラウザからROSのTopicをSubscribe, Publishしてみましょう。
ブラウザ上で動的に動作するプログラムを書くには、JavaScriptという言語を使用します。roslibjsは、このJavaScriptからROSの機能を利用できるようにするライブラリです。このライブラリのファイルを、roslibjs.min.jsをダウンロードすることで入手しましょう。
以下の3ファイルを、www
ディレクトリに配置します。index.html
とscript.js
は、講習資料のsample/pubsub
にあるものをコピーしましょう。
HTMLの<head>
タグ内に、以下のように記述します。これにより、index.html
をブラウザで開いたときに、roslib.min.js
とscript.js
が読み込まれるようになります。
<script src="./roslib.min.js" defer></script>
<script src="./script.js" defer></script>
あなたのプログラムは、script.js
に書き込んでいきましょう。
では、公式ドキュメントを参考に、ブラウザから適当なTopicをSubscribe, Publishしてみましょう。
ただし、ドキュメントでは変数宣言にvar
を用いていますが、今日日使わない古い記法なので、const
またはlet
を使うようにしましょう。基本的にはなんでもかんでもconst
で大丈夫です。この文書はJavaScriptの詳細には立ち入らないので、詳しい解説は省略します。
rosmaster
との接続などは、前述の公式ドキュメントを参照してください。ここでは、トピック周りの記述についてのみ説明します。
roscpp
との相違点として特筆すべきこととして、roslibjs
では、publisherとsubscriberを同じTopic
構造体で扱うことです。ですから、以下のようなコードで、/cmd_vel
というTopicに対して、PublishとSubscribeを同時に行うことができます。
const cmd_vel = new ROSLIB.Topic({
ros : ros,
name : '/cmd_vel',
messageType : 'std_msgs/Int32'
});
const vel = new ROSLIB.Message({
data: 50
})
cmd_vel.publish(angle);
メッセージは、ROSの.msg
ファイルに書いてある定義の中身の通りに書きましょう。今回はstd_msgs/Int32
を使っているので、data
という変数に値を入れています。標準型の.msg
ファイルは、こちらから確認できます。
cmd_vel.subscribe(function (message) {
// ここに、Subscribeしたときの処理を書く
console.log('Received message on ' + cmd_vel.name + '. It says : ' + message.data);
});