keimlab’s diary

KEIMLABの電気・電子・制御の開発備忘録と日常生活記録

自宅サーバーのセットアップパッケージ

はじめに

Raspberry Pi 2 の自宅サーバーのスペックに満足できなくなってきたので、余っていた自作PC自宅サーバーに切り替えることにしました。これに伴って、セットアップしたパッケージをメモしていきたいと思います。

環境

・PC : Core i3、メモリ8GB、SSD64GB
・OS : Ubuntu 20.04

パッケージ一覧

ssh
・samba
・apache2
postfix
dovecot
ddnsクライアント
・logwatch

おわりに

最近はGoogleDriveの有料契約で共有できる容量を増やしているため、少し出番の少なくなった自宅サーバーですが、Webの勉強や足元考えているWEBベースのデータ可視化・解析プラットホームの試験など、活躍してもらっています。もっと勉強していろいろなことができるようになりたいですね。

MySQLのセットアップ

はじめに

データベース管理の勉強のため、MySQLをインストールしてみました。
そのときのセットアップログです。

環境

パソコン : 普通のデスクトップパソコン(自作)
OS   : Ubuntu 20.04

手順

1.aptを使ってMySQLをインストールする
 sudo apt install mysql-server mysql-client

2.バージョンを確認する
 mysql --version

 私の環境では、↓のような感じでした。
 mysql Ver 8.0.23-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))

3.MySQLサービスの動作を確認する
 sudo service mysql status

 ↓こんな感じに表示されればOK
 ● mysql.service - MySQL Community Server
  Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
  Active: active (running) since Sat 2021-04-10 21:53:35 JST; 4min 0s ago
 Main PID: 8403 (mysqld)
  Status: "Server is operational"
  Tasks: 37 (limit: 9123)
  Memory: 332.8M
  CGroup: /system.slice/mysql.service
      mq8403 /usr/sbin/mysqld

 4月 10 21:53:34 kyohei-server systemd[1]: Starting MySQL Community Server...
 4月 10 21:53:35 kyohei-server systemd[1]: Started MySQL Community Server.

4.セキュリティの設定  sudo mysql_secure_installation

 ↓のように設定しました。  Securing the MySQL server deployment.
 
 Connecting to MySQL using a blank password.
 
 VALIDATE PASSWORD COMPONENT can be used to test passwords
 and improve security. It checks the strength of password
 and allows the users to set only those passwords which are
 secure enough. Would you like to setup VALIDATE PASSWORD component?
 
 Press y|Y for Yes, any other key for No: y
 
 There are three levels of password validation policy:
 
 LOW Length >= 8
 MEDIUM Length >= 8, numeric, mixed case, and special characters
 STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
 
 Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 0
 Please set the password for root here.
 
 New password:
 
 Re-enter new password:
 
 Estimated strength of the password: 50
 Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
 By default, a MySQL installation has an anonymous user,
 allowing anyone to log into MySQL without having to have
 a user account created for them. This is intended only for
 testing, and to make the installation go a bit smoother.
 You should remove them before moving into a production
 environment.
 
 Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
 Success.
 
 
 Normally, root should only be allowed to connect from
 'localhost'. This ensures that someone cannot guess at
 the root password from the network.
 
 Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
 Success.
 
 By default, MySQL comes with a database named 'test' that
 anyone can access. This is also intended only for testing,
 and should be removed before moving into a production
 environment.
 
 
 Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
  - Dropping test database...
 Success.
 
  - Removing privileges on test database...
 Success.
 
 Reloading the privilege tables will ensure that all changes
 made so far will take effect immediately.
 
 Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
 Success.
 
 All done!
  5.rootユーザーで初期設定をする
 sudo mysql -u root
 
 ↓のように表示される
 Welcome to the MySQL monitor. Commands end with ; or \g.
 Your MySQL connection id is 11
 Server version: 8.0.23-0ubuntu0.20.04.1 (Ubuntu)
 
 Copyright (c) 2000, 2021, Oracle and/or its affiliates.
 
 Oracle is a registered trademark of Oracle Corporation and/or its
 affiliates. Other names may be trademarks of their respective
 owners.
 
 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
 
 mysql> SHOW VARIABLES LIKE 'validate_password%';
 
 ↓のように表示される。
 +--------------------------------------+-------+
 | Variable_name | Value |
 +--------------------------------------+-------+
 | validate_password.check_user_name | ON |
 | validate_password.dictionary_file | |
 | validate_password.length | 8 |
 | validate_password.mixed_case_count | 1 |
 | validate_password.number_count | 1 |
 | validate_password.policy | LOW |
 | validate_password.special_char_count | 1 |
 +--------------------------------------+-------+
 7 rows in set (0.01 sec)
 
 
 mysql> CREATE USER 'kyohei'@'localhost' IDENTIFIED BY 'your_password';
 Query OK, 0 rows affected (0.02 sec)
 
 
 mysql> select user,host from mysql.user;
 +------------------+-----------+
 | user | host |
 +------------------+-----------+
 | debian-sys-maint | localhost |
 | kyohei | localhost |
 | mysql.infoschema | localhost |
 | mysql.session | localhost |
 | mysql.sys | localhost |
 | root | localhost |
 +------------------+-----------+
 6 rows in set (0.00 sec)
 
 
 mysql> SHOW GRANTS FOR 'kyohei'@'localhost';
 +--------------------------------------------+
 | Grants for kyohei@localhost |
 +--------------------------------------------+
 | GRANT USAGE ON . TO kyohei@localhost |
 +--------------------------------------------+
 1 row in set (0.00 sec)
 
 mysql> GRANT all ON *.* TO 'kyohei'@'localhost';
 Query OK, 0 rows affected (0.01 sec)
 
 
 mysql> SHOW GRANTS FOR 'kyohei'@'localhost';
 +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 | Grants for kyohei@localhost |
 +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 | GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON . TO kyohei@localhost |
 | GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,FLUSH_OPTIMIZER_COSTS,FLUSH_STATUS,FLUSH_TABLES,FLUSH_USER_RESOURCES,GROUP_REPLICATION_ADMIN,INNODB_REDO_LOG_ARCHIVE,INNODB_REDO_LOG_ENABLE,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SHOW_ROUTINE,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN ON . TO kyohei@localhost |
 +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 2 rows in set (0.00 sec)
 
 

データベースを使用してみる

データベースを表示するには↓のコマンド。 SHOW DATABASES;

CUI操作を熟知している人は、きっとコマンドラインでなんでもやってしまうのでしょうが、今の私には難しそうです...
GUI環境で操作できる便利なソフトがあるようですので、まずはそちらから取り掛かってみようと思います。

終わりに

 Ubuntu上でMySQLサーバーを構築することができました。
 データベースの操作の仕方はこれから勉強が必要ですが、いろいろできそうです。

参考文献

qiita.com

kawairi.jp

メールサーバーの設定①

はじめに

メールサーバーを設定しようとしたときの記録です。

環境

Raspberry Pi 2 Model B
Ubuntu Mate 18.04

Postfixのインストール・設定

1.postfixをインストールする
sudo apt-get install -y postfix

2.main.cfを編集する
sudo vi main.cf

mail_owner = postfix
myhostname = mail.hogefuga.com
mydomain = hogefuga.com
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
local_recipient_maps = unix:passwd.byname $alias_maps
# mynetworks = 127.0.0.0/8 ←コメント化 mynetworks_style = subnet
mynetworks = 127.0.0.0/8, 192.168.1.1/24
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
sendmail_path = /usr/sbin/postfix
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
setgid_group = postdrop
#html_directory = ←コメント化
# manpage_directory = ←コメント化
#sample_directory = ←コメント化
# readme_directory = ←コメント化

relayhost = [mail.so-net.ne.jp]:587
sudo vi /etc/postfix/relay_password
transport_maps = hash:/etc/postfix/transport
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/relay_password
smtp_sasl_security_options = noanonymous

3.メールエイリアスのデータベースを再構築する sudo newaliases

4.postmap
postmap hash:/etc/postfix/relay_password

5.postfx
sudo /etc/init.d/postfix restart

6.mailutilsをインストール
sudo apt-get install mailutils

7.メールを送信するテスト
mail hogehoge@gmail.com
Cc:
Subject:
test
"Ctrl + d"

上記にて、Gmailアカウントにメールが送信されればOK

#参考文献 qiita.com www.maruko2.com

SurfacePro4にUbuntu18.04を入れる

概要

手持ちの中古ノートPCやRaspberryPiでは、動作がかなり重たいのでもう少し動作を軽快にしたいと思い、メインのノートPCにもUbuntuを入れて、ROS化してみようと思います。ただし、Windowsが使えなくなってしまうのは困ってしまうので、デュアルブート環境とし、Cドライブを汚すのも嫌だったので、SDカードにインストールすることとしました。

※あくまで個人的な備忘録ですので、分かりにくい点が多々あると思いますが、ご容赦ください。

環境

Surface Pro 4
・CPU : Core i7-6650U @ 2.20GHz
・メモリ : 8GB
SSD : 256GB (Ubuntuの記憶域としては不使用)
・SDカード : 128GB

インストール手順

1.Surface Pro 4 のBitLockerを無効化

コントロールパネルから、BitLockerの設定画面に入って、BitLockerを解除します。ファイル数によるようですが、結構時間が掛かります。Ubuntuをインストールしたときに、誤ってSurface本体のSSDブートローダを上書きしてしまうとBitLockerが作動して、ログオンできなくなってしまうことがあるようです。

2.BitLockerの解除キーを入手

万が一、BitLockerが作動してしまった時のために、念のため、解除キーを入手しておきます。以下のリンク先を参照して、Microsoftアカウントにログインして解除キーを入手しました。

3.Ubuntuのイメージファイルをダウンロード

ダウンロード先 : https://releases.ubuntu.com/18.04.4/

4.ダウンロードしたイメージファイルをUSBメモリに書き込む

UnetbootinやbalenaEtcherなどのツールを使用してイメージファイルをUSBメモリなどに書き込みましょう。2GB強あるので、4GB以上のUSBメモリでないと入りません。注意です。

5.UEFIブートの設定・優先順位を変更

UEFIブートの画面に入るためには、電源ON後、すぐに本体ボリューム+のボタンを押すと入れます。そこで、セキュリティブートの項目をMicrosoft OnlyからMicrosoft & 3rd Party CAに変更します。こうするとWindows以外でもブートできるようになるようです。加えて、Boot Configurationの設定で、USB Storageをドラッグ&ドロップで一番上に持っていき、USBメモリからのブートを最優先にします。

6.USBメモリからUbuntuを起動

UEFIブートの設定が正しく設定できていたら、Ubuntuを試すか、インストールするか選択する画面が出てくるので、Ubuntuを試すほうを選択します。まずは、USBメモリから試用版を立ち上げてみて、使用できることを確認してから、インストールをしていきます。

7.インストールウィザードを立ち上げる

起動してデスクトップが表示できたら、デスクトップにインストール用のアイコンが並んでいるので、これをダブルクリックしましょう。

8.インストールウィザードが立ち上がったら、"English"を選択して"Continue"ボタンを押す

※今回、"English"でインストールしたのは、今後ターミナルなどで日本語で出力が返ってくるよりも、英語で出力が返ってくるほうが検索した際にヒットしやすいため。

9."Updates and other software"では、デフォルトのまま

"Updates and other software"では、デフォルトのままで"Continue"ボタンを押します。
※"Install third-party software for graphics and Wi-Fi hardware and additional media formats"にチェックを入れても問題ないようですが、今回は選択しませんでした。

10."Installation type"では、"Something else"を選択して"Continue"を押す

他にもWindowsと共存してインストールできそうな項目が並んでいますが、これを選択するとWindowsのCドライブにインストールされてしまうので、要注意です。

11."Installation type"の続きで、インストール構成や対象のパーティション設定

SDカードが正しく挿入されていれば、"/dev/sda"または"/dev/sdb"が現れます。これがSDカードです。Sizeを確認して、挿したSDカードと合っているか確認しましょう。

(1) もともと何か使用しているSDカードであれば、"-"ボタンを元のパーティションを消します。
(2) Free spaceとして表示されていることを確認して選択します。
(3) Changeボタンを押して、インストールに必要なパーティションを以下のように作成していきます。
(4) EFI領域として、Primaryパーティション、容量100MBを確保
(5) ルート領域として、Primaryパーティション、容量好きなだけ(今回は64GB)、マウントポイントは"/"を選択
(6) swap領域として、Primaryパーティション、容量8GB(搭載メモリの分)を確保
(7) "Device for bootloader installation"では、SDカードのドライブを選択(今回は"/dev/sdb")
(8) 上記を設定したら、"Install Now"ボタンをクリックします。
(9) "Write the changes to disks?"というダイアログが出るので、加えようとしている変更が正しいか確認して、"Continue"をクリック

12."Where are you?"は、Tokyoを選択して"Continue"ボタンを押す

世界地図上に選択している地域として赤丸が付きますが、微妙に東京の場所と違う...

13.ログイン情報の入力を求められるので、適当に入力して"Continue"ボタンを押す

14.インストールが始まったら、ひたすら待つ

結構時間が掛かります。気長に待ちましょう。

15.インストールが終わったら、USBメモリを抜くように指示が出るので、抜いて再起動を掛ける

16.Ubuntuがブートできれば完了!

私の場合は、なぜかGrubコマンドラインが出てきて、少々焦りました。しかし、再起動してUEFIブートの設定でSDカードのドライブ(表示名なんだっけ...?)のブート優先順を上げたら、正常にUbuntuのブートとWindowsのブートを選択できるようになりました。これで、Surface Pro 4Ubuntuをインストールすることができました。お疲れ様でした。

感想

SurfaceにもUbuntuが入るとは思ってもみませんでしたが、入れてみると表示はかなりきれいで見どころがあるなと思いました。思っていたより動作は緩慢でしたが、贅沢は言えませんね。これからSurface Pro 4でもROS入れて、ROSでの開発をしていきたいと思います。

参考

qiita.com

blog.hackdesk.com

ROS上でプログラムを書いてみる

はじめに

前回の記事にて、ROSをインストールできたので、プログラムを動かしてみたいと思います。 ROSの基本動作であるPublishとSubscribeのプログラムを動かします。

環境

・ボード : Raspberry Pi 3
・OS : Raspbian/Buster
・ROSディストリビューション : Kinetic
※ROSのセットアップはこちらで行ったものを使っています。
keimlab.hatenablog.com

catkinワークスペースを作成する

ROSではcatkinワークスペースというディレクトリにて作業を行うのが推奨されているようで、その下に様々なパッケージをぶら下げてプログラムを管理するようになっています。まずは、catkinワークスペースを作成します。

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
catkin_make

パッケージを作成する

次に、catkinワークスペースにテスト用のパッケージを追加します。catkin_create_pkgの1つ目の引数がパッケージ名

catkin_create_pkg hello_world roscpp rospy std_msgs

パッケージを作成すると、以下のようなファイル・ディレクトリが生成されます。

f:id:keimlab:20200501144944p:plain
ファイルツリー構造

プログラムを作成する

publish、subscribeでプロセス間での情報の授受をするプログラムで、プログラミングの世界でいう『Hello World!』の代替にします。公式サイトのTutorialから引用させてもらいますが、以下のプログラムを作成し、下図黄色部のように配置します。

f:id:keimlab:20200501155245p:plain
hello_world パッケージファイル構成

// File name : talker.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>

int main(int argc, char **argv){
  ros::init(argc, argv, "talker");
  ros::NodeHandle n;
  ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
  ros::Rate loop_rate(10);

  int count = 0;
  while (ros::ok()){
    std_msgs::String msg;
    std::stringstream ss;
    ss << "hello world " << count;
    msg.data = ss.str();
    ROS_INFO("%s", msg.data.c_str());
    chatter_pub.publish(msg);
    ros::spinOnce();
    loop_rate.sleep();
    ++count;
  }

  return 0;
}
// File name : listener.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"

void chatterCallback(const std_msgs::String::ConstPtr& msg){
  ROS_INFO("I heard: [%s]", msg->data.c_str());
}

int main(int argc, char **argv){
  ros::init(argc, argv, "listener");
  ros::NodeHandle n;
  ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
  ros::spin();
  
  return 0;
}

メイクファイルを編集する

書いたソースをコンパイル・リンクするように、~/catkin_ws/src/hello_world/CMakeLists.txt(上図のオレンジ部)に以下の記述を追加します。

add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker hello_world_generate_messages_cpp)

add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener hello_world_generate_messages_cpp)

catkin_makeする

catkinワークスペースのルートディレクトリに戻って、makeをします。これで、書いたソースコードコンパイル・リンクされて実行形式のファイルができます。普通のCプログラムのコンパイル時より、エラーメッセージが出ても少々見づらいですが、これはやむなし...

cd ~/catkin_ws
catkin_make

実行する

makeが通ったら、実行してみましょう。今回作成したプログラムは2つのノード間でやり取りするプログラムなので、ターミナルを2つ起動して、実行します。

まずは、最初のターミナルで、roscoreを実行しておき、listener側のプログラムを実行します。 このとき、roscoreを普通に実行してしまうとターミナルのコントロールを失ってしまいますので、以下のように実行してバックグラウンドで実行させるようにします (これが推奨されるのかどうかは...?)。こうすることで無駄にターミナル画面を表示させておく必要がなくなります。roscoreの出力は、~/catkin_ws/roscore.txtに出力されますので、何か気になることがあれば、こちらを参照しましょう。

nohup roscore >> ~/catkin_ws/roscore.txt &

ちなみに、roscoreを終了させたいときには、以下のようにします。

ps aux | grep roscore

これを入力すると以下のような出力を得られます。

username    3808  6.4  3.0  62168 28448 pts/0    Sl   16:07   0:02 /usr/bin/python /opt/ros/melodic/bin/roscore
username    3850  0.0  0.0   5228   596 pts/0    S+   16:08   0:00 grep --color=auto roscore

この出力の中の1行目がroscoreのプロセスを指しています。左から2番目の項目がプロセスIDで、これ使って、プロセスを殺します。上記の例でいうと、3808がroscoreのプロセスIDで、以下のようにコマンドを入力します。

kill -INT 3808

roscoreが起動できたら、先ほどcatkin_makeしてできたhello_worldパッケージのlistenerを実行します。

rosrun hello_world listener

これを実行した直後には何も起きません。このままの状態にして、次に、2つ目のターミナルで、talker側のプログラムを実行します。すると以下のような出力を得ることができ、最初に起動したターミナルの方を見てみると、listener側のプログラムにも表示が随時更新されます。ここまでできればROSプログラムの実行が成功です。(私の環境では、listener側のプログラムで、なぜか最初の3つの内容が取りこぼされてしまっていますが...)。終了させるには、Ctrl + cにて終了させます。

$ rosrun hello_world talker
[ INFO] [1588317288.437682266]: hello world 0
[ INFO] [1588317288.537732649]: hello world 1
[ INFO] [1588317288.637634388]: hello world 2
[ INFO] [1588317288.737640345]: hello world 3
[ INFO] [1588317288.837654010]: hello world 4
[ INFO] [1588317288.937638873]: hello world 5
[ INFO] [1588317289.037641393]: hello world 6
[ INFO] [1588317289.137640267]: hello world 7
[ INFO] [1588317289.237632422]: hello world 8
[ INFO] [1588317289.337640775]: hello world 9
[ INFO] [1588317289.437630378]: hello world 10
$ rosrun hello_world listener
[ INFO] [1588317501.555192296]: I heard: [hello world 3]
[ INFO] [1588317501.654821160]: I heard: [hello world 4]
[ INFO] [1588317501.754862987]: I heard: [hello world 5]
[ INFO] [1588317501.854811639]: I heard: [hello world 6]
[ INFO] [1588317501.954760863]: I heard: [hello world 7]
[ INFO] [1588317502.054814930]: I heard: [hello world 8]
[ INFO] [1588317502.154751812]: I heard: [hello world 9]
[ INFO] [1588317502.254813431]: I heard: [hello world 10]
[ INFO] [1588317502.354735208]: I heard: [hello world 11]
[ INFO] [1588317502.454727088]: I heard: [hello world 12]
[ INFO] [1588317502.554747875]: I heard: [hello world 13]
[ INFO] [1588317502.654783088]: I heard: [hello world 14]
[ INFO] [1588317502.754856738]: I heard: [hello world 15]
[ INFO] [1588317502.854771953]: I heard: [hello world 16]
[ INFO] [1588317502.954808781]: I heard: [hello world 17]

おわりに

ここまで見ていただき、ありがとうございました。プロセス間通信をしようと思ったら、もっとたくさんコードを書かなきゃいけないようなイメージを持っていましたが、ROSを使うとお手軽にプロセス間の情報共有が楽にできそうですね。これが複数のノード間でもできるというようで、これから挑戦していきたいと思います。ここまで、ネット検索して多くの先人たちの知恵を参考にさせていただきましたが、無償で公開してくれている皆さんに感謝です。私も皆さんに役立つような知恵を発信していきたいですね。

参考サイト

wiki.ros.org qiita.com

公開日 : 2020年5月1日

Raspberry Pi 2 にUbuntu Mateを入れてROSをインストールする

目次

はじめに

ここでは、Raspberry Pi 2にROSを導入するための方法として、Ubuntu Mateを使用してセットアップする方法を記載します。 Raspberry Pi標準のRaspbianを使用した方が、何かと情報があるので、やりやすい側面がありますが、Ubuntuを使用するとapt-get主体の操作でROSをいれることができるので、ROS主体で見た際には、Ubuntuで導入するのもありではないかと思います。

※今 Raspberry Pi 2を使用しているのは、単純に昔に買ったRaspberry Piが余っていたから...本当は新しいRaspberry Pi 4が欲しい...

環境

・使用ボード Raspberry Pi 2
・OS : Ubuntu Mate 18.04 Raspberry Pi
・セットアップ言語:日本語
・SDカード容量 : 32GB
・ネットワーク : 無線LAN接続、LogitechのUSB WiFiドングル使用(...型番なんだっけ?)
・ROSバージョン : Melodic Moleinia

インストール手順

Ubuntu 18.04をインストール

・ダウンロード先 : https://ubuntu-mate.org/download/armhf/
Windows端末で、イメージファイルをダウンロードしたら、balenaEtcherなどでMicro SDカードに書き込みます。
・書き込みが完了したら、Micro SDカードを取り外し、Raspberry Pi 2に差し込んで電源を入れます。
Raspberry Pi 2で電源を入れたらデスクトップ画面が表示され、ウィザードに従って言語・キーボード設定・無線LAN接続情報・アカウント情報やロケールを入力して、セットアップを完了させます。

※最初はSDカードの不良で、Ubuntu Mateのセットアップが途中で止まってしまってしまいました。
 それに気付いたからよいものの、対象ボードが古いからかなと思って、違うバージョンのUbuntuディストリビューションを探したりして時間をだいぶ無駄にしてしまいました。
 SDカードは全うなものを使いましょう。

ROSをインストール

1.一般的なパッケージ用のリポジトリを追加

sudo add-apt-repository universe
sudo add-apt-repository multiverse
sudo add-apt-repository restricted

2.ROS用のリポジトリを追加

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

3.追加リポジトリを含めアップデート

sudo apt-get -y update
sudo apt-get -y upgrade

4.ROSをインストール

sudo apt install ros-melodic-desktop-full

5.rosdepをインストール

sudo apt-get install python-pip
sudo pip install -U rosdep

6.依存関係を解決

sudo rosdep init
rosdep update

7.RaspberryPi電源投入後にROSのセットアップをするようにbashrcにコマンドを追加。

echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc

8.現在のセッションでROSのセットアップを反映

source ~/.bashrc

9.ROSの動作確認

roscore

おわりに

Raspbianを使用すると延々とビルド作業に時間をかける必要があるため、セットアップに時間が掛かりますが、Ubuntuを入れるととても短時間でROSを導入することができます。便利ですね。

参考サイト

tkrel.com

Raspberry Pi にRaspbian環境でROSをインストール

目次

はじめに

オープンソースで開発が進められているROS(Robot Operating System)がロボット製作に便利であるという情報を聞きつけ、試してみたくなった&勉強したいので、自宅RaspberryPiにインストールしてみます。

環境

・ボード : Raspberry Pi 3 Model B Rev 1.2
・SDカード : 32GB
・OS : Raspbian GNU/Linux 10 (buster)
・日本語環境にてセットアップ
Raspberry Pi専用の7inchタッチパネル搭載 ※ただし、SSH接続で遠隔操作しているため、あまり関係なし

インストール手順

前準備

1. dirmngrをインストールする(リポジトリにアクセスするために必要?)

sudo apt-get install dirmngr

2.ROSリポジトリのセットアップ

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

3.Bootstrapの依存関係を解消するために必要なパッケージをインストール

sudo apt-get install -y python-rosdep python-rosinstall-generator python-wstool python-rosinstall build-essential cmake

4.rosdepの初期化を行う

sudo rosdep init
rosdep update

ROSセットアップ

1.catkin ワークスペースを作成する

mkdir -p ~/ros_catkin_ws
cd ~/ros_catkin_ws

2.ROSインストールに必要なパッケージを集める

rosinstall_generator ros_comm --rosdistro kinetic --deps --wet-only --tar > kinetic-ros_comm-wet.rosinstall
wstool init src kinetic-ros_comm-wet.rosinstall

3.collada_urdfの代わりにassimpを入れる(?)

mkdir -p ~/ros_catkin_ws/external_src
cd ~/ros_catkin_ws/external_src
wget http://sourceforge.net/projects/assimp/files/assimp-3.1/assimp-3.1.1_no_test_models.zip/download -O assimp-3.1.1_no_test_models.zip
unzip assimp-3.1.1_no_test_models.zip
cd assimp-3.1.1
cmake .
make
sudo make install

※makeにまぁまぁ時間が掛かるので待つ(30分くらい?)

4.rosdepで依存関係を解消する

cd ~/ros_catkin_ws 
rosdep install -y --from-paths src --ignore-src --rosdistro kinetic -r --os=debian:buster

5.catkinワークスペースをビルドする

sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/kinetic -j2

※ビルドしている最中にメモリ不足でエラーが出て止まるらしいので、"-j2"オプションを入れておく。

6.以下のようなエラーが出てしまった...

make[2]: *** [CMakeFiles/rospack.dir/build.make:76: CMakeFiles/rospack.dir/src/rospack_backcompat.cpp.o] Error 1
/home/pi/ros_catkin_ws/src/rospack/src/utils.cpp:31:10: fatal error: boost/tr1/unordered_set.hpp: No such file or directory
#include <boost/tr1/unordered_set.hpp>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[2]: *** [CMakeFiles/rospack.dir/build.make:102: CMakeFiles/rospack.dir/src/utils.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:371: CMakeFiles/rospack.dir/all] Error 2
make: *** [Makefile:141: all] Error 2
<== Failed to process package 'rospack':
Command '['/opt/ros/kinetic/env.sh', 'make', '-j4', '-l4']' returned non-zero exit status 2

Reproduce this error by running:
==> cd /home/pi/ros_catkin_ws/build_isolated/rospack && /opt/ros/kinetic/env.sh make -j4 -l4

Command failed, exiting.

どうもrospackというのはboostというライブラリに依存しているようで、boost1.58のバージョンが必要らしい。使用していたRaspbian(Buster)では、boost1.67だったので、互換性なくmakeが通らなかった模様。ros wikiに書かれているとおり、

sudo apt remove libboost1.67-dev
sudo apt autoremove
sudo apt install -y libboost1.58-dev libboost1.58-all-dev
sudo apt install -y g++-5 gcc-5
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 20
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 20
sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30
sudo update-alternatives --set cc /usr/bin/gcc
sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 30
sudo update-alternatives --set c++ /usr/bin/g++
sudo apt install -y python-rosdep python-rosinstall-generator python-wstool python-rosinstall build-essential cmake

7.再度ビルドする

sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/kinetic -j2

これでエラーを吐くことなく、終了することができました。

動作確認

1.起動時にROSのセットアップが走るように設定

echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source /opt/ros/melodic/setup.bash

2.以下のコマンドでroscoreを動かしてみます。

roscore

これで以下のような表示がされれば、ROSが正常にインストールされています。
ここまでお付き合いいただきありがとうございます。お疲れ様でした。

... logging to /home/pi/.ros/log/da6fa3ac-8a2b-11ea-a636-b827eb1690ee/roslaunch-raspberrypi-19512.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://raspberrypi:46695/
ros_comm version 1.12.14


SUMMARY
========

PARAMETERS
 * /rosdistro: kinetic
 * /rosversion: 1.12.14

NODES

auto-starting new master
process[master]: started with pid [19522]
ROS_MASTER_URI=http://raspberrypi:11311/

setting /run_id to da6fa3ac-8a2b-11ea-a636-b827eb1690ee
process[rosout-1]: started with pid [19535]
started core service [/rosout]

失敗事項

Desktop版を入れようとしたところ、OpenCVのmakeに失敗をしているようで、以下のようなエラーが出て、先に進めず。 自力では解決負荷だったため、Desktop版を諦め、ROS-Comm版を入れることに...残念。 

おわりに

まずは、ROSを試験する土台を立てることができました。これからはROSでのアプリケーション作成をやってみます。

感想

久しぶりにLinuxでのロボットを動かす環境の構築をやってみて、大学・大学院時代のRTAIのセットアップに苦労していた頃を思い出しました。Webサイトで掲載されている日本語情報を頼りにしても、想定外のエラーが出てしまうことがあり、結局は、公式サイトの英語記事を読みながら進めていって、何とか、インストールすることができました。海外サイトの英語と格闘しながら進めていくのには、粘り強い忍耐が必要ですね。もっとさらっと進められるだけのスキルがあればよいのですが、まだまだ力及ばずのところばかりです。

参考サイト

wiki.ros.org