プラスプラス開発者ブログ

岩手県盛岡市のシステム開発会社「株式会社プラスプラス」の開発者ブログです。

WindowsでEthereum環境構築でスマートコントラクト、JavaScript実行編

8月1日は何の日?…語呂だと8(ハ)1(イ)ですね!
最高に「ハイ!」って
やつだアアアアアアハハハハハハハハハハーッ

テンション調整を間違えた「軽く熊」です。

以前にスマートコントラクトの記事を書いてから
かなり時間が経ってしまいましたが正当な続編記事です。

ついにスマートコントラクトJavaScriptから呼び出す時がやってきましたッ!

続きを読む

Raspberry Pi 3のセットアップ

こんにちは、プラスプラスの真山です。暑い日はやっぱり冷し中華ですね。

今回はRaspberry Pi(ラズパイ)のご機嫌を伺いながら、色々セットアップしたことを書きたいとおもいます。
まずラズパイにOSをいれなければいけないのですが、からあげブログさんにROSとの関係性をubuntuとRaspbianの2種類書いてあります。(ああ、唐揚げ、食べたい・・・) karaage.hatenadiary.jp
なるほど。とくにこだわりはないのでubuntuにします。

インストール方法は、ubuntuのイメージファイルをどこからか持ってきてmicroSDカードに入れてそれをラズパイに挿すだけです。とっても簡単そうですが・・・。

続きを読む

Raspberry Pi 3を買ってもらった!っていう話

こんにちは、プラスプラスの真山です。最近静止画が動いて見えるようになりました(?)

ROSの勉強をHPのチュートリアルと本を読みながらやっていたんですが、なんだか実感がわかない。
今私は何をやっているんだ?これをどうやればロボットに結びつくのか?

そして
shop.nikkeibp.co.jp
この本を読んでるとすぐロボット出てくる!(そりゃそうだ、ロボット入門って書いてるもん)
そしてまずRaspberry Piがない!(Raspberry Piてなに!?おいしいの!?)

Raspberry Piがない!先に進まない!(進まないことはない)もうダメだ!おなかすいた!と駄々をこねたところ、なんと買ってもらいました!(ヤッター!)

そのRaspberry Pi(通称ラズパイ)がこちらです。
f:id:plusplus-mayama:20180718143045j:plain 基盤剥き出し!!!匂います、基盤の匂いがします。
ラズパイはARMプロセッサを搭載したシングルボードコンピュータで・・・ readwrite.jp
・・・ラズパイでできることはこちらに書いています!

しかしロボットは自作したほうが安いということで買ってもらえませんでした。(笑)
確かに安いし自分で組み立てたほうが仕組みがわかる!

ということで、これからRaspberry Piを使って自作ロボットを作るぞー!

次回ラズパイのセットアップします。

ROSの基本プログラミング(トピック)

こんにちは。プラスプラスの真山です。気づいたら体重が3キロ増えていました。

今回はROSの基本プログラミングとして実際にパッケージを作成してノードを作りメッセージの送受信を行います。
作業の流れとしては、

  • パッケージの作成
  • 設定ファイルの修正
  • メッセージファイル、送受信ノードの作成
  • ビルド
  • 実行

というような流れになっております。

パッケージの作成

まずはじめにパッケージを~/catkin_ws/srcフォルダに作成します。パッケージ名はなんでもいいので今回はros_kihonにします。パッケージを作成するときに依存パッケージを指定します。
今回のパッケージを使うためには、新しくメッセージを生成するときに必要なmessage_generation、ROSの標準メッセージパッケージstd_msgs、ROSでC/C++言語を使うためのクライアントライブラリroscppが必要なのでパッケージ名のあとに記述します。
それではコマンドです。

$ cd ~/catkin_ws/src
$ catkin_create_pkg ros_kihon message_generation std_msgs roscpp

タターン!とエンターキーを押すと~/catkin_ws/srcフォルダにros_kihonパッケージが生成されその中に見覚えのないファイルなどが作られていると思います。なんだこれは?cd移動してlsで確認すると

$ cd ros_kihon
$ ls
include         ← ヘッダーファイルのフォルダ
src            ← ソースコードフォルダ
CMakeLists.txt     ← ビルド設定ファイル
package.xml     ← パッケージ設定ファイル

と出ます。次はこの下のふたつの設定ファイルを修正します。

パッケージ設定ファイル(package.xml)の修正

package.xmlファイルはパッケージの情報を記載したもので、パッケージ名、著作者、ライセンス、依存パッケージなどを定義する重要な設定ファイルです。エディタを使って中身を修正します。

$ gedit package.xml

ずら〜っとよくわかんないことが書かれています。ほとんどはコメントアウトされていますが。
この中身を書き換えて最終的にはこうなります。

<?xml version="1.0"?>
<package>
  <name>ros_kihon</name>
  <version>0.1.0</version>
  <description>The ros_kihon package</description>
  <maintainer email="ros-basic@todo.todo">ros-basic</maintainer>
  <license>TODO</license>
  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>message_generation</build_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>std_msgs</build_depend>
  <run_depend>roscpp</run_depend>
  <run_depend>std_msgs</run_depend>
  <run_depend>message_runtime</run_depend>
</package>
ビルド設定ファイル(CMakeLists.txt)の修正

このファイルには実行ファイルの生成、依存パッケージ優先のビルド、リンク生成など、ビルドの詳細が記載されています。
こちらもエディタで修正します。

$ gedit CMakeLists.txt

こちらも簡潔にすると

#パッケージの名前です
cmake_minimum_required(VERSION 2.8.3)
project(ros_kihon)

#ビルドをする際に必要なパッケージを記載します。
find_package(catkin REQUIRED COMPONENTS
  message_generation
  roscpp
  std_msgs
)

#メッセージを宣言します。
add_message_files(
  FILES
  MsgKihon.msg
)

#依存するメッセージを設定します。std_msgsが無いとビルドでエラーが出ます。
generate_messages(
  DEPENDENCIES
  std_msgs
)

#catkinパッケージオプションのライブラリ、catkinビルドの依存性、システム依存パッケージについて記述します。
catkin_package(
 LIBRARIES ros_kihon
 CATKIN_DEPENDS roscpp std_msgs
)

#インクルードディレクトリを設定します。
include_directories(
  ${catkin_INCLUDE_DIRS}
)

# kihon_publisherノードのビルドオプションです。
#実行ファイル、ターゲットリンクライブラリ、追加依存性などについて記述します。
add_executable(kihon_publisher src/kihon_publisher.cpp)
add_dependencies(kihon_publisher ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(kihon_publisher
  ${catkin_LIBRARIES}
)

# kihon_subscriberノードも同様に書きます。
add_executable(kihon_subscriber src/kihon_subscriber.cpp)
add_dependencies(kihon_subscriber ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(kihon_subscriber
  ${catkin_LIBRARIES}
)

書くことが多い!!!ここで何かが抜けているとエラーが出てビルドができません。 タイプエラーは危険です。
次にここで定義したメッセージファイルを作ります。

メッセージファイルの作成

CMakeLists.txtファイルで定義した、MsgKihon.msgファイルを作成します。
メッセージファイルはmsgフォルダを新しく作りその中に作ります。

$ roscd ros_kihon    ←(今いると思いますが)パッケージフォルダに移動
$ mkdir msg        ←パッケージフォルダの中にmsgフォルダを生成
$ cd msg          ← magフォルダに移動
$ gedit MsgKihon.msg  ← MsgKihon.msgファイルを書く

MsgKihon.msg

time stamp
int32 data
パブリッシャノードの作成

ビルド設定ファイルで記述したパブリッシャノードkihon_publisherを作成する。

$ roscd ros_kihon/src
$ gedit kihon_publisher.cpp


kihon_publisher

#include "ros/ros.h"
#include "ros_kihon/MsgKihon.h" 
int main (int argc, char **argv)
{
  ros::init(argc, argv, "kihon_publisher");
  ros::NodeHandle nh;
  ros::Publisher ros_kihon_pub =
     nh.advertise<ros_kihon::MsgKihon>
     ("ros_kihon_msg", 100);
  ros::Rate loop_rate(10);
  ros_kihon::MsgKihon msg;
  int count = 0;

  while (ros::ok())
  {
    msg.stamp = ros::Time::now();
    msg.data = count;

    ROS_INFO("send msg = %d", msg.stamp.sec);
    ROS_INFO("send msg = %d", msg.stamp.nsec);
    ROS_INFO("send msg = %d", msg.data);
    ros_kihon_pub.publish(msg);
    loop_rate.sleep();
    ++count;
  }

  return 0;
}
サブスクライバノードkihon_subscriberの作成

ビルド設定ファイルで記述したサブスクライバノードを作成します。

$ roscd ros_kihon/src
$ gedit kihon_subscriber.cpp


kihon_subscriber

#include "ros/ros.h"
#include "ros_kihon/MsgKihon.h"

void msgCallback(const ros_kihon::MsgKihon::ConstPtr& msg)
{
  ROS_INFO("receive msg = %d", msg->stamp.sec);
  ROS_INFO("receive msg = %d", msg->stamp.nsec);
  ROS_INFO("receive msg = %d", msg->data);
}

int main(int argc, char **argv)
{
  ros::init(argc, argv, "kihon_subscriber");
  ros::NodeHandle nh;
  ros::Subscriber ros_kihon_sub =
          nh.subscribe("ros_kihon_msg", 100, msgCallback);
  ros::spin();

  return 0;
}
ノードをビルド

パッケージ、メッセージ、ノードの作成ができたらcatkin_wsに移動してビルドを行います。

$ cd ~/catkin_ws
$ catkin_make

f:id:plusplus-mayama:20180620175939p:plain 一旦ここで考えるようです。「なにか曲者がいるぞ!」みたいな感じでしょうか。
少し待ってみると・・・

f:id:plusplus-mayama:20180620175803p:plain あれれ〜!おかし〜ぞ〜?(すみませんタイプエラー(曲者)です・・・笑)
気を取り直して(書きなおして)もう一度ビルドすると!? f:id:plusplus-mayama:20180620180933p:plain おお〜〜〜!
無事にビルドができました!実行してみましょう。

パブリッシャノードの実行

roscoreコマンドでマスタを呼び出した後、別のターミナルにrosrun コマンドでパブリッシャノードを実行します。

$ rosrun ros_kihon kihon_publisher

画像のようにテキストが出力されます。もう止めるまで永遠と流れ続けます。飽きるまで見ましょう。 f:id:plusplus-mayama:20180620182340p:plain

kihon_publisherからパブリッシュされるメッセージは、rostopicコマンドで表示できます。

$ rostopic list
/ros_kihon_msg
/rosout
/rosout_agg

トピックリストにros_kihon_msgトピックの確認ができました。 メッセージの内容を確認してみます。

$ rostopic echo /ros_kihon_msg

f:id:plusplus-mayama:20180620183248p:plain
dataが1ずつ増えて永遠と流れ続けてるのがわかります。

サブスクライバノードの実行

次にサブスクライバのノードを実行してみます。
実行するとパブリッシュされたros_kihon_msgトピックのメッセージを受信して画面に出力します。

$ rosrun ros_kihon kihon_subscriber

f:id:plusplus-mayama:20180621101234p:plain

実行中のノードの通信状態を確認

実行中のノードの関係性をグラフで確認できます。

$ rqt_graph

f:id:plusplus-mayama:20180621102205p:plain


今回はROSトピックの連続したデータを送り、またそれを受信するという基本的なプログラミングを行いました。この送受信内容はbagコマンドを使って保存・再生することもできます。
次回からみんなの人気者、Raspberry Piの登場です。

ROSのコマンド

こんにちは。プラスプラスの真山です。今朝寝違えたのか何かと戦っていたのか、背中がめちゃくちゃ痛いです。

今回はROSでよく使われるコマンドについて書きたいと思います。因みにコマンドを入力するときはTabキーを押すと自動的にコマンドを補間してくれる機能があるので、コマンドを全部覚えていなくても入力ができます。とても便利です。

ROSシェルコマンド

ROSのシェルコマンドはrosbashとも呼ばれるそうです。cdやlsといったbashシェルコマンドの前にrosがついただけです。

roscd [パッケージ名]

指定したROSパッケージのディレクトリに移動します。めちゃくちゃ使います。瞬間移動です。

rosls [パッケージ名]

ROSパッケージのファイルリストを表示します。

rosed [パッケージ名] [ファイル名]

指定したファイルを編集します。私はgedit を使うのであまり使いません。


ROS実行コマンド

実行コマンドは4種類です。

roscore

roscoreは接続状態を管理するマスタを起動します。これをしないと始まりません。

rosrun [パッケージ名] [ノード名]

指定したパッケージのノードを実行します。一つのターミナルで一つのノードを走らせます。

roslaunch [パッケージ名] [launchファイル名]

roslaunchは事前に設定しておけば複数のノードを一度に実行できるコマンドです。とっても便利!

rosclean [オプション]

ROSログファイルの検査と削除に使うコマンドです。


ROS情報コマンド

トピック、サービス、ノード、パラメータなどの情報を確認するときに使います。特にrostopic、rosservice、rosnode、rosparam、rosbagは頻繁に使います。


rosnodeコマンド

ノードの制御や情報取得します

rosnode list

roscoreでマスタに登録されている実行中のノードのリストを表示します。

rosnode ping [ノード名]

指定したノードとリモートコンピュータとの間で通信が可能かテストします。

rosnode info [ノード名]

指定したノードの情報を表示します。トピックの入出力情報も確認できるのでよく使います。

rosnode machine [PC名またはIP]

指定したPCや端末などで実行されているノードのリストを表示します。

rosnode kill [ノード名]

指定したノードを終了するコマンドです。(Ctrl + Cキー でも実行中止できるので私はあまりこのコマンドは使いません)

rosnode cleanup

接続情報が確認できないノードの登録情報を削除します。


rostopicコマンド

現在ネットワーク上で使用されているトピックの情報を得たり、トピックをパブリッシュしたりします。

rostopic list

roscoreに登録されている全てのトピックのリストを表示します。
$ rostopic list -vと入力するとパブリッシュ・サブスクライブされているトピックを分けてさらに各トピックのメッセージ型を表示します。

rostopic echo[トピック名]

指定したトピックのメッセージの内容をリアルタイムで表示します。

rostopic find [メッセージ型名]

指定したメッセージ型のメッセージを使用しているトピックを表示します。

rostopic type [トピック名]

指定したトピックのメッセージ型を表示します。

rostopic bw [トピック名]

指定したトピックのメッセージデータのバンド幅を表示します。

rostopic hz [トピック名]

指定したトピックのメッセージデータのパブリッシュ周期を表示します。

rostopic info [トピック名]

指定したトピックの情報を表示します。

rostopic pub [トピック名] [メッセージ型] [パラメータ]

指定したトピック、メッセージ型、送信したいパラメータ値を使って手動でパブリッシュします。


rosserviceコマンド

現在ネットワーク上で使用されているサービスの情報を得たり、サービスを要請したりするコマンドです。

rosservice list

roscoreに登録されたサービスのリストを表示します。

rosservice info [サービス名]

指定したサービスの情報を表示します。

rosservice type [サービス名]

指定したサービスのサービス型を表示します。

rosservice find [サービス型]

指定したサービス型を用いるサービスを表示します。

rosservice uri [サービス名]

指定したサービスのURIを表示します。

rosservice args [サービス名]

指定したサービスのパラメータを表示します。

rosservice call [サービス名] [パラメータ]

指定したサービス名とパラメータでサービス要請をします。


rosparamコマンド

登録されているパラメータを表示したり、パラメータを設定したりするコマンドです。

rosparam list

roscoreに登録されている全てのパラメータを表示します。

rosparam get [パラメータ名]

指定したパラメータの値を表示します。

rosparam set [パラメータ名]

指定したパラメータの値を設定します。

rosparam dump [ファイル名]

指定したファイルにパラメータを記録します。

rosparam load [ファイル名]

指定したファイルに記録されているパラメータ値を呼び出します。

rosparam delete [パラメータ]

指定したパラメータを削除します。


rosbagコマンド

ログ情報を記録、再生するために使用するコマンドです。

rosbag record [オプション] [トピック名]

指定したトピックのメッセージをbagファイルに記録します。

rosbag info [ファイル名]

指定したbagファイルの情報を確認します。

rosbag play [ファイル名]

指定したbagファイルを再生します。

rosbag compress [ファイル名]

指定したbagファイルを圧縮します。

rosbag decompress [ファイル名]

指定したbagファイルを解凍します。

rosbag filter [入力ファイル名] [出力ファイル名] [オプション]

指定した内容を除去した新しいbagファイルを生成します。

rosbag reindex [ファイル名]

指定したbagファイルのインデックスを再作成します。

rosbag check bag [ファイル名]

指定したbagファイルが現在のシステムで再生できるか確認します。

rosbag fix [入力ファイル名] [出力ファイル名] [オプション]

バージョンの違いによって再生できないbagファイルを再生できるように修正します。


ROS catkin コマンド

catkinビルドシステムを使用し、パッケージをビルドするときに使用します。

catkin_create_pkg [パッケージ名] [依存パッケージ1] [依存パッケージ2] ...

パッケージの自動生成をします。このコマンドによりCMakeList.txtやpackage.xmlファイルを含む空のパッケージが生成されます。

catkin_make

ユーザが作成したパッケージ、ダウンロードしたパッケージをビルドします。


ROS パッケージコマンド

パッケージの情報表示、関連パッケージのインストールなどを行います。

rospack [オプション] [パッケージ名]

指定したROSパッケージの位置、依存関係の表示、全パッケージのリストの表示をします。find、list、depends-on、depends、profileなどのオプションをつけて使用します。

rosinstall

追加パッケージのインストールを行います。

rosdep [オプション]

指定したパッケージが依存しているファイルの確認、インストールをするコマンドです。オプションとしてcheck、install、init、updateなどが使えます。


今回はROSで頻繁に使われるであろうコマンドを書いてみました。しかし全部覚えなくてもTabキーが解決してくれます。ガンガン押しましょう。 次回はROSの基本プログラミングを行いたいと思います。

ROSメッセージ通信

こんにちは、プラスプラスの真山です。

今回はROSのメッセージ通信について書きたいと思います。
前回の「ROSを起動して動かしてみよー!」ではトピックという通信方法を使いましたが、ROSのメッセージ通信には他にも、サービスアクションパラメータなどがあります。一体どういった違いがあるのでしょう。

トピック

トピック通信はデータを送信するパブリッシャと受信するサブスクライバで構成されます。一度接続したら連続してデータ通信が行われるためセンサデータの取得などに使われます。

サービス

サービス通信はサービスを要請するサービスクライアントとサービス要請に応えるサービスサーバで構成され、その間の双方向同期通信方式です。トピックとは違い要請を受けた時だけ応答して、通信が終わると両ノードの接続は切られます。そのためサービス通信はネットワークの負荷が小さい。ロボットの事前に決められた動きをさせる時などに使われます。

アクション

アクション通信は要請から応答までが長い場合や、処理中に中間報告が欲しい場合に使われます。アクションの目標を送信するアクションクライアント、与えられた目標に対する処理を実行し、処理中のフィードバックや結果を送信するアクションサーバで構成されます。

パラメータ

パラメータはグローバル変数のような役割をします。デフォルト値が設定されていて、外部からの読み書きがリアルタイムで可能です。カメラの色補正値、モーターの速度設定などができます。


メッセージ通信の図です。わかりやすいですね。 f:id:plusplus-mayama:20180619161301j:plain

今回はROSのメッセージの概要を書きました。次回はROSで使われるコマンドについて書きたいと思います。

Androidでmetamask不要のウォレットアプリをビルドする

乗るなら飲むな。飲むなら牛乳。牛乳は嫌いな「軽く熊」です。
あっ、でもチーズは大丈夫ですよ。

今回はイーサリアム専用だけどmetamaskを必要としない
ウォレットアプリを見つけたのでAndroid Studio 3.1でビルドしてみます。

仮想通貨でいろいろ調べていた時にEtherPayなるアプリのgithubを発見。
せっかくなのでビルドして動かして解析してみたいなと思ったわけです。

続きを読む