コンテンツへスキップ

これまで、ROSをラズパイにいれ、デバックしやすいようにエディタを用意し、Topicを軽く紹介しました。今回はその続きで、service,parameterに関しての記事です。

目次

  • はじめに
  • Service
  • Service のサンプルコード
  • service の動作
  • service の他の項目
  • Parameter
  • Parameter のサンプルコード
  • Parameter の動作
  • roslaunch
  • 雑記
  • 参考

はじめに

OSとは、ロボット開発を促進するミドルウェアで、特に取り上げる基本要素は以下の3つです。

  • Topic
  • Service
  • Parameter

これまでインストールやTopicについて書いてきましたので良ければ参考にしてください。ROSの詳細についても書いています。Ubuntuに入れた回でROSの理念の概要、Topicの回でROSの通信や構造について多少詳しく書いています。

また、この記事では参考本に沿ってやっていきます。サンプルコードとして記載したのは一部です。全文は本に載っているので参考にしてください。

参考本

Service

Topic回と同様に濃い青が実際に作るプログラム、薄い青がプログラムによって作られたもの、矢印がデータの流れを表しています。

serviceのイメージ図

serviceはNode間の1対1の双方向同期通信です。Topicは複数のNodeにmessageを送っていましたが、serviceは送ったデータを相手が受け取ったかどうかを知りたい場合などに使用します。

非連続的な通信であり、応答が終了すると通信の接続は切断されます。

serviceのサンプルコード

tutorial_serviceを作成します。依存パッケージはmessage_generation , roscpp, std_srvs です。

service_server.cpp

int main(int argc, char **argv){
  ros::init(argc, argv, "service_server");
  ros::NodeHandle nh;
  ros::ServiceServer srv = nh.advertiseService("say_hello", serviceSayHello);
  ros::spin();
  return 0;
}

service_serverノードは、"say_hello"サービスを提供し、コールバック関数serviceSayHelloを呼び出します。 serviceSayHelloはコンソールで"Hello World"と言うだけの関数ですので、カットしました。 ros::spin関数で永遠にコールバックを待機させています。

service_client.cpp

int main(int argc, char** argv)
{
  using std_srvs::Empty;
  ros::init(argc, argv, "service_client");
  ros::NodeHandle nh;
  ros::ServiceClient cli = nh.serviceClient<Empty>("say_hello");
  Empty args;
  bool ret = cli.call(args);
  if(ret) ROS_INFO("Sucess");
  else ROS_INFO("Failure");
  return 0;
}

service_clientノードは、"say_hello"サービスを利用するクライアントです。 ros::ServiceClient::callでサービスビスを呼び出し、戻り値をうけとり、呼び出しの成否をbool型retで受け取ります(ちょっと自信無いですが)。 成功した場合はコンソールで"Sucess"と表示します。"成功"は正しくは"Success"ですが、綴りを間違えました。

CMakeListでservice_server,service_clientノードを指定し、ビルドします。

serviceの動作

serviceの動作

以下のように表示されてますね(Sucess は Successです)。

  • Client ->Sucess
  • Server ->Hello World

ノードの様子を確認します。グラフを表示するときには以下のようにコマンド入力します。

$rosrun rqt_graph rqt_graph
tutorial_service動作中のノード

service_serverノードが起動されていることがわかります。serverしか表示されないみたいですね。

Serviceの他の項目

  • 独自型
  • 非同的な使用方法 actionlib

actionはサービスに似た双方向非同期通信です。目標(Goal)、結果(Result)、中間結果(Feedback)で構成されます。 要請から応答までの時間が長い場合や処理中に中間結果が必要な場合に利用されます。

parameter

parameterのイメージ図

ParameterはROSに用意されている設定ファイルに当たる機能です。変数とデフォルトが設定されます。 実機の設定値を決定するのは大変ですが、parameterを利用すると、毎回ソースファイルから変更する手間を省くことができます。

parameterのコード

tutorial_paramパッケージを作成します。依存パッケージはroscppだけです。

param_test.cpp

int main(int argc, char **argv)
{
    ros::init(argc, argv, "param_test");
    ros::NodeHandle nh;
    std::string text = nh.param<std::string>("text", "Hello World");
    int repeat_times = nh.param<int>("repeat_times", 10);
    double frequency = nh.param<double>("frequency", 0.5);
    ros::Rate loop_rate(frequency);
    for(int i = 0; i < repeat_times; i++){
        ROS_INFO("%s", text.c_str() );
        loop_rate.sleep();
    }
    return 0;
}

パラメータの登録とコンソールへの表示を指示しています。

ros::NodeHandle::paramでパラメータを登録します。text,repeat_time,frequencyを指定し、第一引数の名前のParameterがParameter Server上にない場合、第2引数で与えた値を引数に返すように設定します。

param_testノードを作成してビルドします。

parameterの動作

Parameterの動作
  • text ->"Hello World"
  • repeat_times -> 10回
  • frequency -> 0.5Hz

Parameterを指定せずに実行すると、それぞれが指定されていないのでparam_test.cppで記述した通りの規定値(デフォルト)で実行されました。

tutorial_paramのノード

Parameterの登録

以下のようにコマンドを入力すると、Parameter test,5回,2Hzで実行されます。

$ rosparam set /text "Parameter test"
$ rosparam set /repeat_times 5
$ rosparam set /frequency 2.0
$ rosrun tutorial_param param_test

この設定ファイルを外部に保存する場合dump、書き込む場合load機能を実行します。

$rosparam dump ~/params.yaml

作成されたファイルは以下のようになっています。

frequency: 2.0 //記述した部分
repeat_times: 5 //記述した部分
rosdistro: 'melodic

  '
roslaunch:
  uris: {host_ubuntu__38799: 'http://ubuntu:38799/'}
rosversion: '1.14.3

  '
run_id: 74601454-52ee-11e9-94d4-000c2958b845
text: Parameter test //記述した部分

roscoreを再起動すると、これらのパラメータが起動していない状態になりますが、loadするとパラメータが復元できます。

$ rosparam load ~/params.yaml
inomata@ubuntu:~/catkin_ws/src/tutorial_param$ rosparam list
/frequency
/repeat_times
/text
~省略(重要部分のみ表記)~

roslaunch

rosrun以外でノードを起動する方法にroslaunchがあります。roslaunchは複数のノードを実行するときなどに使用される機能です。

tutorial_paramパッケージ内にlaunchディレクトリを作成し、launchファイルを作成し、node,parameterを記述します。

param_test.launch.txt

<?xml version="1.0"?>
<launch>
    <node pkg="tutrial_param" type="param.test" name="param.test" output="screen" />
    <param name="text" value="parameter test" type="string" />
    <param name="repeat_times" value="5" type="int" />
    <param name="frequency" value="2.0" type="double" />
</laaunch>

roslaunchを実行します。roscoreを事前に起動しておかなくてもlaunchと同時に起動します。以下のように使用します。

$roslaunch [パッケージ] [launchファイル]
$roslaunch tutorial_param param_test.launch 
... logging to /home/inomata/.ros/log/74601454-52ee-11e9-94d4-000c2958b845/roslaunch-ubuntu-14888.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://ubuntu:42297/

SUMMARY
========

PARAMETERS
 * /frequency: 2.0
 * /repeat_times: 5
 * /rosdistro: melodic
 * /rosversion: 1.14.3
 * /text: parameter test

NODES
  /
    param_test (tutorial_param/param_test)

ROS_MASTER_URI=http://localhost:11311

process[param_test-1]: started with pid [14912]
[ INFO] [1553954248.157679236]: parameter test
[ INFO] [1553954248.658104672]: parameter test
[ INFO] [1553954249.158001451]: parameter test
[ INFO] [1553954249.658660154]: parameter test
[ INFO] [1553954250.157878784]: parameter test
~省略~
shutting down processing monitor complete done 

このように、launchファイルの設定が読み込まれるので、パラメータの設定や動作のログの保存が簡単にできます。 以下のようにしてノードを複数作成することもできます。

<?xml version="1.0"?>
<launch>
    <node pkg="tutorial_param" type="param_test" name="param_test1" output="screen" >
        <remap from="text" to="param_test1/text" />
        <remap from="repeat_times" to="param_test1/repeat_times" />
        <remap from="frequency" to="param_test1/frequency" />
        <param name="text" value="parameter test1" type="string" />
        <param name="repeat_times" value="5" type="int" />
        <param name="frequency" value="2.0" type="double" />
    </node>
    <node pkg="tutorial_param" type="param_test" name="param_test2" output="screen" >
        <remap from="text" to="param_test2/text" />
        <remap from="repeat_times" to="param_test2/repeat_times" />
        <remap from="frequency" to="param_test2/frequency" />
        <param name="text" value="parameter test2" type="string" />
        <param name="repeat_times" value="10" type="int" />
        <param name="frequency" value="1.0" type="double" />
    </node>
</launch>

実行結果

$roslaunch tutorial_param param_test_multi.launch 
                  ~省略~
process[param_test1-2]: started with pid [16453]
process[param_test2-3]: started with pid [16461]
[ INFO] [1553955293.937496298]: parameter test2
[ INFO] [1553955293.950236042]: parameter test1
[ INFO] [1553955294.448465352]: parameter test1
[ INFO] [1553955294.922201847]: parameter test2
[ INFO] [1553955294.930736280]: parameter test1
[ INFO] [1553955295.430756405]: parameter test1
[ INFO] [1553955295.921917747]: parameter test2
[ INFO] [1553955295.930332254]: parameter test1
[param_test1-2] process has finished cleanly
log file: /home/inomata/.ros/log/2a93dc86-52f6-11e9-94d4-000c2958b845/param_test1-2*.log
[ INFO] [1553955296.921807747]: parameter test2
[ INFO] [1553955297.921376642]: parameter test2
[ INFO] [1553955298.922054324]: parameter test2
[ INFO] [1553955299.922576736]: parameter test2
[ INFO] [1553955300.921124094]: parameter test2
[ INFO] [1553955301.921790482]: parameter test2
[ INFO] [1553955302.921487235]: parameter test2
[param_test2-3] process has finished cleanly
~省略~
done

雑記

ROSシリーズはなんの独自性もない記事になってしまい、反省してます。ラズパイにモータを取り付けるか、Scamperを動かしてもう少し面白い記事にしていきます。

参考

以前、Raspberry Pi 3 B + に Ubuntu MATE(16.04) を入れ、ROSでhelloworldしました。 基本的な機能を確認します。
catkin_makeは重いかも。ラズパイちゃんが固まるので注意。

目次

  • ROSとは
  • Topic
  • Topicのサンプルコード
  • 動作
  • 雑記
  • 参考

ROSとは

ロボット開発を促進するミドルウェアです。ROSではすべてモジュールとモジュール間通信の形式で構成されています。誰かが作ったプログラムを、詳細を知らないままに使用できます。1つ1つのモジュールをノードと呼びます。

ROSではすべての処理が「ノード(Node)とノードがメッセージ(Message)をやりとりする」という構造になっています。それらの集合がパッケージ(Package)と呼ばれます。ノードとノードの通信を行うのがマスタ(Master)で、roscoreコマンドで起動します。

ビルドはすべてパッケージフォルダ内のCMakeLists.txtに記述され、catkinで行われます。(Hydroバージョン以降)

  • Topic
  • Service
  • Parameter

この投稿では参考の本のtopicついてさわりのみ扱います。

topic

濃い青が実際に作るプログラム、薄い青がプログラムによって作られたもの、矢印がデータの流れを表しています。

Topic はノード間でやり取りされるデータの入れ物(話題)です。データを送る動作をpublish、データを受け取る動作をSubscribeといいます。

Publisherはノードの起動時にTopic名をMasterに登録し、Messageで定めた形式で他のノードに送信します。 Subscriverは指定されたTopicを発振しているPublisherを問い合わせます。

名前と型などが設定されていて、Topicの名前を指定すればどのノードからでもデータを読み取ることができます。また一度接続されればメッセージ送受信が継続されます (非同期通信)ので、高頻度の通信を行うセンサ信号の送受信などに使用されます。

topicのサンプルコード

$cw
$catkin_create_pkg tutorial_topic roscpp std_msgs

まず上のようにパッケージを作成します。catkin_create_pkg パッケージ名 依存パッケージ のように書きます。

publisher.cpp

#include <ros/ros.h>
#include <std_msgs/Int32.h>

int main(int argc, char **argv)
{
  ros::init(argc, argv, "publisher");
  ros::NodeHandle nh;
  ros::Publisher pub = nh.advertise<std_msgs::Int32>("number", 10);
  
  ros::Rate loop_rate(1);
  std_msgs::Int32 cnt;
  cnt.data = 0;
  
  while(ros::ok())
  {
    ROS_INFO("Count : %d", cnt.data);
    pub.publish(cnt);
    cnt.data++;
    loop_rate.sleep();
  }
  return 0;
}
  • ros::init(argc, argv, ノード名)はノードの初期化を行う関数です。
  • ros::NodeHandle はROSシステムにアクセスし、他のノードと通信を行うクラスです。
  • ros::NodeHandle::.advertise(topicの名前,バッファ容量)でtopicの登録を行っています。
  • loop_rate(1)で1Hzのウェイトをかけてループしています。
  • std_msgs::Int32は32bit符号付整数のラッパークラスです。ラッパークラスとは、別のプログラム(群)を包んで隠蔽し、使いやすくしたクラスです。今はデータはcnt.dataに格納されています。
  • ros::ok()は基本的にtrue、CNTR+Cで停止したときにfalseを返します。

subscriber.cpp

#include <ros/ros.h>
#include <std_msgs/Int32.h>

void onNumberSubscribed(const std_msgs::Int32 &msg)
{
  ROS_INFO("I heard: [%d]", msg.data);
}

int main(int argc, char **argv)
{
  ros::init(argc, argv, "subscriber");
  ros::NodeHandle nh;
  ros::Subscriber sub = nh.subscribe("number", 10, onNumberSubscribed);
  ros::spin();
  return 0;
}
  • ros::NodeHandle::subscribe(topic名, バッファ容量, コールバック関数名)でSubscribeするTopicを設定しています。今は"number"というTopicを受信するたびにonNumberSubscribedが呼び出されます。
  • ros::spin()は無限ループで、CNTR+Cで中断されると、以降の処理は行われません。

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
project(tutorial_topic)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
)

catkin_package()
include_directories(${catkin_INCLUDE_DIRS})

add_executable(publisher src/publisher.cpp)
target_link_libraries(publisher ${catkin_LIBRARIES})

add_executable(subscriber src/subscriber.cpp)
target_link_libraries(subscriber ${catkin_LIBRARIES})

CMakeLists.txtはファイルを作成する指示書みたいなものです。自動で作成されるものを編集します。

  • cmake_minimum_requiredにはバージョン、prjectにはproject名、find_packageには依存パッケージが入っていると思います。
  • catkin_packageはcatkinビルドのオプションを指定します。
  • include_directories()はインクルードフォルダを指定します。今は各パッケージのincludeフォルダのヘッダーファイルを指定しています。

add_executable(実行ファイル名 src/実行ファイル名.cpp)以下をそれぞれ書き足します。add_executableはビルド後に実行するファイルを、target_link_librariesには生成時に必要なファイルを指定します。以下で ビルドします。

$cd ~/catkin_ws
$caikin_make -DCATKIN_WHITELIST_PACKAGES="パッケージ名"
$roscore
$rosrun tutorial_topic subscriber
$rosrun tutorial_topic publisher

指定したパッケージのみビルドし、それぞれ実行します。rosrunなどは起動したままにするので、端末は複数開いてください。

topicの動作

出力はこんな感じ。下のコマンドでノードとデータの移動をグラフとして表示できます。

$rosrun rqt_graph rqt_graph

publisherノードとsubscriberノードがnumberというtopicを受け渡ししているのがわかります。

topicはプリミティブ型は使えないので、ラッパーされたメッセージ型を使わなければなりません。int型の代わりにstd_msgsパッケージのInt32というメッセージ型を使っています。

その他

参考にした本には以下についてのサンプルコードが載っています。

  • 独自型の定義
  • spinOnce
  • AsyncSpinner
  • 同期

ROSでは独自型を定義する事ができます。ただし、ROSの「他の人のコードも利用できる」という性質上、独自型を作成するのは最低限にすべきでしょう。 また、上のサンプルコードにはspin関数を使っているので複数のTopicをSubscribeする事はできません。ノンブロッキングなspinOnceなどを使う必要があります。

また、Lidarの情報を扱う際には同期が活躍します。

雑記

モーターとセンサを取り付けたい。こいつ単体で何かできるようにしてやりたい。

参考

目次

  • やった事
  • 目的
  • ラズパイとは
  • ROSとは
  • 環境構築1 Ubuntu
  • 環境構築2 ROS

やった事

Raspberry Pi 3 B+ に Ubuntu MATE と ROSをインストールし、ROSで動作確認を行いました。PCはWindows10です。

目的

これは Web X IoT メイカーズチャレンジ のハッカソンの一環としての活動で、機能の1つである通知機能をやったので、もっといろいろやってみる準備をします。 =>webIoTメイカーズチャレンジに参加前編

一方でゼミでROSをやっていて、全然解らなくてヤバいので家で勉強しようかとも思っています。というわけで、

  • ROSが使える
  • Webとの通信ができる

上記2点を満たした環境を用意しようと思います。調べてみるとRaspbian(ラズパイで一番スタンダードであろうOS)でROS環境を作るのは大変そうなので、Ubuntuでいきたいと思います。ラズパイに向いているのは軽量なMATEらしいですので採用。

Raspberry Piとは

ラズパイとは、内蔵ハードディスクなどを搭載しない代わりに、SDカード又はmicroSDを起動および長期保存用のストレージに利用する、「ワンボードマイコン」と呼ばれるハードウェアです。ラズベリーパイ財団より安価な教育用のシングルボードコンピューターとして開発されました。

つまり、PCほどの計算の能力はないけど、PCみたいに使えるIoTに向いた機械です。標準でネットにつなげたりするので初心者に優しいらしい。今回私はRaspberryPi 3 model B+ を使います。一番新しい奴です。

ラズパイ本体の他にいくつか用意するものがあります。

  • SDカード(ubuntuMATE、ROSを入れるなら32GB以上)
  • ディスプレイ(HDMLが接続できるTVでOK。PS4をやってるやつとか)
  • 有線ネットワーク(raspberryPiは3はwifiでもいける)
  • キーボード
  • マウス

RSコンポーネントRaspberry Pi 3 B +マザーボード

Team microSDHCカード 32GB 高速転送UHS-1 日本国内10年保証 SD変換アダプター付属 正規品

アイトランク iTrunk Raspberry Pi 3用USB電源アダプター PSE認証 5V 2.5A Raspberry Pi 3 Model B/B+ Raspberry Pi 2 Model B Raspberry Pi Model B+ B Plus適用

この章の参考

ROS とは

ソフトウェア開発者のロボット・アプリケーション作成を支援するライブラリとツールを提供しているオープンソースのソフトウェアです。特徴として以下をあげます。

  • ソフトウェアプラットホームである
  • ミドルウェアである
  • フレームワークである

ソフトウェアプラットホーム

情報プラットホームのエコシステムの4要素としてハードウェア、OS、アプリケーション、ユーザがあります。 「情報プラットホームのエコシステム」というのはわかりにくい言い回しですが、これは俗な言い方をすれば「技術が流行る」ということです。

現在私たちはスマホを持ち、アプリをインストールして使って居ますが、このようにスマホが流行るとよりよいアプリが開発されてさらに利用される、というような循環が生まれます。

ロボットが身近な存在になり、 ユーザーや開発者が増え、市場が活発になれば様々な技術が生まれて行く。このようなサイクルを作るために必要なものがロボットソフトウェアプラットホーム です。

ROSの機能

技術を流行らせるためにはソフトウェアを使い回せるようにしたり、開発者がロボットのすべてを知らなくても一部だけのソフトウェアを作ればいいようにしたりする必要があります。

ROSでは機能(モジュール)を小さな単位(ノード)に分割し、ノード間で厳格なプロトコルのもとで異なる言語でも通信する仕組みになっています。それによって、C++で書かれたモジュールとPythonで書かれたモジュール間で通信するような事を可能にしています。

また、パッケージ管理、デバッグ用ツール、開発ツールなどが整っているので開発がしやすくなっており、誰でも公開できるようになっています。

という訳でROSはミドルウェアとフレームワークの側面をとったロボットソフトウェアプラットホームです。(という風にまとめましたがどうでしょう)

この章の参考

Ubuntuとは

ラップトップ、デスクトップ、そしてサーバーに利用することができるOSで、無料で提供されています。一般のコミュニティによって開発されており、Linuxの派生のDebianから派生して作られました。カノニカル社が支援しており、Linuxとしては資金的にも人員的にも非常に手厚い支援によって開発されています。 半年ごとにリリースされていて開発が早い一方で、長期補償板(LTS)も存在します。最新のアプリケーションを利用する事も、安定した環境で作業する事も出来ます。また、Ubuntu Japanese Teamによって日本語環境が整えられています。インストール後すぐに使える、GUIでデスクトップでマウスで操作できる、など初心者にも使いやすいOSです。

今回入れるのはUbuntuの派生の一つである Ubuntu MATE です。メモリ消費が軽いのでラズパイ向きです。

この章の参考

環境構築1 Ubuntu MATE

起動まで

ラズビアンでROS環境を作るのは大変そうなので、ubuntu の中でラズパイに向いている ubuntu MATE 環境を作ります。このとき、

ラズパイ公式 Downloads

でダウンロードしたのを使うと、ラズパイ3 model B+ではOSが動きません。虹&雷マークで固まってしまいます。

雷マークは電圧不足のマークですが、電源を変えてもダメでした。調べてみるとシステムファイルの不具合でも発生するとのこと。ラズパイはB B+でハードもファームウェアも違うらしい。なのでいろいろ設定が必要みたいです。 下のサイトが最高に神なので乗せていきます。ありがとうございます。このサイトの添付に3B+でも動くように修正されたimgファイルがありますので、これを使います。

RaspberryPi 3B+にROSを導入する - Isao HARA

このページのubuntu MATE からダウンロードした「ubuntu-mate-16.04~.img.xz」を解凍します。このとき解凍は7-zipをインストールして使いました。


「ubuntu-mate-16.04~.img」をSDカードに書き込みます。このSDカードがラズパイのメモリになります。書き込みにはWin32 Disk Imagerをインストールしました。microSDをセットして起動すると、

出ました。ついに!(ここまで調べるのになんやかんや2日)

ここからはubuntu上での作業です。言語等の説明は省略します。ただ、wifi設定は後でやるのが無難だと思います。wifi設定に失敗するとユーザーが登録されなくなるのではじめからやり直す事になります。左上の アプリケーション/システムツール/MATE端末 で指示を出していきます。この端末はよく使うので右クリックしてデスクトップに追加しておくと良いと思います。

更新

まずはいろいろ更新 //コメント

sudo apt apdate //最新のパッケージを取得
sudo apt dist-upgrade// 最新のパッケージの更新と不要なパッケージの削除
sudo apt autoremove//依存関係で必要なくなったパッケージの削除

初回の更新なのでこれだけで1時間くらい掛かりました。

日本語入力

日本語設定をします。システム/設定/ユーザー向け/言語サポートででたウインドウの「言語のインストールと削除...」を押してインストール、「システム全体に適用」そのあと再起動します。もう一度言語サポートを開いて「キーボード入力に使うIMシステム:」のドロップダウンリストから「fcitx」を選択して再起動します。

インターネットブラウザ

インターネットブラウザのChromiumをインストールします。 私はいつもネットにつなっているか試すとき猫で検索をかけるんですが、あらかじめ入っているfirefoxというブラウザがcrashしたという通知が出ました。新しくChromiumを入れます。Chromium は Google Chrome のベースらしいです。コマンドのsudoというのは管理者権限のようなものです。

sudo apt install chromium-browser

以上です。

本来ならリモートデスクトップしたいんですが、うまくいきませんでした。出来たら追記します。RDPできるとコピペができます。

この章の参考

以前使って居たラズパイでは画面サイズがおかしくなりました。画面の大きさはディスプレイによっては合っていないことがあります。以下を見ました。メモとして張っておきます。

環境構築2 ROS

参考に挙げた本によれば、2019年現在(次のROS LTSまでは)Ubuntu 16.04 Xenial Xerus(LTS)(またはLinux Mint 1.8x) + ROS Kinetic Kameがいいらしいです。

以下を順番に実行しました //コメント

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' //関連サーバのURL追加
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116//ROS関連サーバの公開キー。サーバ更新のたびに変化するのでwikiで確認してください
sudo apt-get update  //ubuntuのアップデート さっきやったからやらなくていいかも
sudo apt-get upgrade 
sudo apt-get install ros-kinetic-desktop-full //rosのインストール 関連ライブラが含まれる
sudo apt-get install ros-kinetic-rqt*//グラフィカルユーティリティーツールrqtに関連するすべてのパッケージのインストール 上で基本的なqrtの機能はインストールされるためやらなくてもいい
sudo rosdep init //ROSのメインコンポーネントを利用したりコンパイルする際に、ROSのOSに依存したライブラリやツールをインストールするツールであるrosdepを初期化
rosdep update 
sudo apt-get install python-rosinstall //ROSパッケージをインストールするときに役立つrosinsrallのインストール
source /opt/ros/kinetic/setup.bash //環境変数の読み込み
mkdir -p ~/catkin_ws/src //ROS専用のビルドシステムcatkinのワークスペースcatkin_wsを作成、初期化
cd ~/catkin_ws/src
catkin_init_workspace 
cd ~/catkin_ws/ 
catkin_make //ビルドコマンドcatkin_make。ビルド関連ファイルはbuild、実行関連ファイルはdevelに作成される
source ~/catkin_ws/devel/setup.bash //catkinビルドシステムの環境設定ファイルの読み込み

このあとROSの動作確認のために

roscore

してエラーをはきました。

reboot //再起動

再起動してからroscoreしたら動きました。成功の場合、最後に

started core service [/rosout]

と書かれた文が表示されます。ROSを使うときはorscoreは動かしっぱなしにするので端末を複数開いて使います。 Ctrl+Cで終了することができます。

source のコードを毎回書くのは面倒なので、いくつか設定します。エディタにはemacsを使いました。

emacs ~/.bashrc

で開いて、以下を付け加えました。今回はショートカットコマンドと環境設定の自動読み込みだけ追加します。

# 環境変数
source /opt/ros/kinetic/setup.bash
source ~/catkin_ws/devel/setup.bash

# コマンド
alias cw='cd ~/catkin_ws'
alias cs='cd ~/catkin_ws/src'
alias cm='cd ~/catin_ws && catkin_make'

変更を反映するために一度端末を閉じてからもう一度開いて

source ~/.bashrc

これで自動で読み込まれるようになりました。ラズパイを起動してすぐにroscoreでもオッケーです。

最低限のエディタ

その前に、エディタが入っていないので、ひとまず最低限のエディタの用意をします。ひとまず知ってるエディタemacsをインストール。好きなのを使ってください。

sudo apt-get install emacs24

ROSのテスト

roscoreが起動できればどのサイトでもオッケーみたいでしたが、つまらないのでROSに入っているシミュレーションツールを動かしてみます。

roscore //すでに起動している場合は不要
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key

この状態で←↑→↓など矢印を押してみると、カメが動きます。楽しい!!

これでデータの流れを可視化します。

rosrun rqt_graph rqt_graph

このカメ、矢印上で前進、右で120度右、左で120度左を向きました。動かしにくいので設定をいじりたかったんですが、やめました。

この章の参考

雑談

私はすべてのSNSで亀のアイコンにしているんですが、ROSのシミュレーションも各バージョンで毎回カメでなので運命を感じざるを得ませんね。
追記(2019/3/20)Amazonリンクを増やしました。