ubuntu16.04 + ROS + pythonのこまごましたところ

# はじめに
研究の環境を完全にubuntuに移行しようと思い、ubuntu+ROSを入れないといけなかったのでその時の困ったところのメモです
インストール自体はすんなり行くと思うのですが、pythonのこまごましたところに少し詰まったのでそこ話

# 環境
- ubuntu 16.04 LTS
- ROS - kinetic

# ubuntuインストールで詰まったところ
たくさんのサイトがいろいろパーティションとかについてはコメントしてくれてますが、まず、BIOSに辿りつけないという事案が発生

これについては、パソコンごとに違います
自分のパソコンが何なのかを調べてみてください

del
を押すもの

F~
を押すもの
などなど

また、bootのmenuも各パソコンによって違いそうです
適するものがなくても、基本的にはboot optionの一番上を、CD/DVDにしてみたり、Flashdiskにしてみたりするとうまくいきます
よくわからない名前が出ている場合は、HDDの型番だったりします
検索してみてください

# ROSで詰まったところ
特にないと思います
基本的には公式のドキュメントを参考にしてください

http://wiki.ros.org/ja/kinetic/Installation/Ubuntu

# gitとgithub

- https://git-scm.com/book/ja/v1/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-%E6%9C%80%E5%88%9D%E3%81%AEGit%E3%81%AE%E6%A7%8B%E6%88%90
- https://qiita.com/suthio/items/2760e4cff0e185fe2db9

# pythonのこまごました話
よく知られているように、ubuntu16.04はpython2.7と3.5がデフォルトで入ってます
なので、そのままでいいやーって人は特に問題ないと思うのですが、

なんかふとpython3.6使いたいなぁって思って、（全くやる必要ない気もしますが笑とりあえずやってみる）
下記サイトを見ながらやると、

https://www.python.jp/install/ubuntu/index.html

すっかりうまく行った気になります

pyenvを使うのも手だとは思いますが
pathを書き換えると、ROSのpath設定の方に影響が出そうなのでやめときます
pyenvを使っているのは下記の例

https://qiita.com/koooooo/items/b21d87ffe2b56d0c589b

https://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c

が参考になります
システムのpythonを触りたくない人は絶対こっちのほうがいいような気はしています笑
ライブラリ開発したい場合はpyenvなのかな

で、インストールしたはいいんですが
pip3を使うときに注意点があります

pip3で何かをインストールするとpython3.6へと入りますが

sudo apt-get python3-.......
でやると、python3.5に入るというめんどくさい事案が発生

というかそもそもこの
sudo apt-getとpipの違いは何なの？

まず違いから調べてみました
https://askubuntu.com/questions/431780/apt-get-install-vs-pip-install

によれば、apt-getとpip3の違いは

>PyPIはPythonパッケージのインデックスです - Pythonモジュールのリポジトリです。
>pipPyPIからパッケージを直接ダウンロードしてインストールするために使用されます。PyPIはPython Software Foundationによってホストされています。Pythonパッケージのみを扱う特別なパッケージマネージャです。

だそうで、

- バージョンの管理ができるかできないか
- システムのどこにインストールするかを指定できるかできないか

が大きな違いっぽい（aptはできない、pip3はできる）
pip3のほうが良いのかは疑問ですが
違いはそんなになさそうなので気にしなくてもよさそう

では、上記の問題を解決していきましょう

```
python3 --version
```

を見るとpython3.5にリンクされていることがわかるので
シンボリックを使って修正します

https://ykonishi.tokyo/use-python3-6-ubuntu/

のサイトが参考になりますが

```
mkdir -p $HOME/bin
ln -s /usr/bin/python3.6 $HOME/bin/python3
```

にしてしまえばいいというわけです

見てみると、python3.6にできました

正直正しいかわかりませんが笑
まぁできたので良かったです

# ROSはpython2系？
そもそもROS-kineticはどこのpythonを見てるんだろうかと気になりました

というのもkineticは確か、python2系を推奨しているような気がしていたからですが、python3系で書いてる人もいたような。。。

こういう時は試してみます

```
roscore
```

して

```py
#!/usr/bin/env python
# license removed for brevity
import rospy 

rospy.init_node('Python')

while not rospy.is_shutdown():
    str = "hello world %s"%rospy.get_time()
    rospy.loginfo(str)
    print(3/2)
```

https://postd.cc/the-key-differences-between-python-2-7-x-and-python-3-x-with-examples/

で違いがありそうなやつを見てみます
3系⇒2系は基本的なレベルの構文による違いはありません
なので、3系のつもりで書いても基本的にはエラーは出ないと思います

2系はprint()しても回ります

これやると

```
0
```

って出てきます
3系ならこれ小数点ででてくるので、つまり、2系なのね

まぁ2系って書いてあるのでそうだろうとは思ってましたが。。
演算するときは気をつけたほうが良さそうですね

まぁそもそも
sysのpathを見てみると

```
['', '/opt/ros/kinetic/lib/python2.7/dist-packages'...
```

ってなっているので、そりゃそうか
しかもrosの中身みにいったら（上記のpathの中）

python2.7しかありませんね

python3系でどうしてもやりたい人は
多分方法があるはず

ということで探してみます

https://stackoverflow.com/questions/49758578/installation-guide-for-ros-kinetic-with-python-3-5-on-ubuntu-16-04?rq=1

で同じような人がいる

リンクされているところに行ってみると

>Note: Be careful installing python3, you should update python3 alternative to python3.5 before installing and using pip3!

>This is not recommended as usual, but it seems difficult to run rospy from python3 normally. (It requires full recompile of all ROS packages.) Below hack will allow run python3, at least for cozmo_driver.py. I don't know the true risk to do that.

```
sudo apt-get install python3-yaml
sudo pip3 install rospkg catkin_pkg
```

> Note: To get further python3 compat a local version of "transformations.py" is included!

って書いてある
わぉ。。。要は、ROSのパッケージをpython3の中に完全に入れ込む必要があるので、むずかしいって言ってますね

やめておくのが良さそうです

# ROSで毎回コマンドうつのめんどくさい

なんでこれ毎回うつの。。。

```
source ./devel/setup.bash
```

という方は

https://myenigma.hatenablog.com/entry/20121108/1352380080

を参考におねがいします
bashrcはログイン時に読まれるやつなのでそれでいけます

# ROS以外でopenCVが謎に使えない
opencvを入れる時にROSがもともと入ってると，インストールされるのに
単にubuntuでpython3系で使いたいときにROSのPathが邪魔して，

```
python3.6(python3.5)
```

```py
import cv2

ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type
```

ってなり、opencvが使えない（たぶんROSの方のopencvが呼ばれてよくわかんないことになっている気がする）という問題が発生します
pythonの優先順位が勝手に変更されてるみたいですね。。。

つまり，ROS上でOpenCVを使う場合は何にも問題ないですが
単に，UbuntuPCでPython3系でopencvを使いたい場合，使えません

なので、ROSへのmodule探索pathを除去してあげます

```py
import sys
sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')
import cv2
```

こうやるしかないっぽい。。。
しかも注意して欲しいのは
この方法以外でやるとROSが回らなくなったりします
なのでめんどくさいですが、これは仕方ないかも

# Fontどこいった？
windows+anacondaで、Times new romanのフォントがmathfontに反映されずに困っていたことを改善した話はここに書いてあります

https://qiita.com/MENDY/items/02b7d0231d215098b4aa

まぁLinuxでもとやってみると

```
UserWarning: findfont: Font family
['Times New Roman'] not found. Falling back to DejaVu Sans
(prop.get_family(), self.defaultFamily[fontext]))
```

はい
フォント見つかりません

またこれかと思っていたら

https://stackoverflow.com/questions/42097053/matplotlib-cannot-find-basic-fonts

を参考にしてください

```
sudo apt-get install msttcorefonts -qq
```

でうまくいきます
ちなみに、了解が押せなくて焦った方
十字キーで移動できますのでご安心を

あとすごくどうでもいいかもしれませんが

```py
import matplotlib
matplotlib.font_manager...
```

ってやるとうまくいきませんので

```py
import matplotlib.font_manger as font
```

としましょう

# 気づいたらpipが使えなくなっていた
2系しか使えないし、2系にいろいろいれとこうかなぁとおもって

pipをつかっていろいろいれようとすると

あれ

python3系になる


```
pip --version

pip 18.1 from /usr/local/lib/python3.6/dist-packages/pip (python 3.6)
```

。。。

問題ですが
ubuntuであれば

https://askubuntu.com/questions/797721/python-2-7-and-pip-from-3-5

```
python2 -m pip --version
```

```
python2 -m pip install ....
```

で改善します！
こうなりたくない方は、pyenvの使用をおすすめします

# 参考　pyenvを使いたい方

https://qiita.com/Kodaira_/items/feadfef9add468e3a85b

https://qiita.com/mogom625/items/b1b673f530a05ec6b423

ROSを入れていた場合のトラブルについて

https://qiita.com/koooooo/items/b21d87ffe2b56d0c589b
がとてもわかり易いと思います
基本的にはpyenvでローカルに設定するのがいけてるかと

疑問になるのはモジュールだと思います
バージョンは管理できてもpip3等でインストールしたものはどうなっているのか

中の記事にも書いてあると思いますが
普通にpyenvで作ったものは、なにもはいってない状態なのでお得意のpip等々でやるのがよさそうですね

ちなみに多くのサイトでも書かれていますが

全体のバージョンを変える

```
pyenv global 3.5.2
```

ローカル環境で異なるバージョン使う

```
pyenv local 3.4.1
```

システムに標準搭載されてるものに戻す

```
pyenv global system
```


# 補足　ROSのpythonについて
ubuntuを入れてROSを入れたあとに

```
echo $PYTHONPATH
```

とすると

```
/opt/ros/kinetic/lib/python2.7/dist-packages
```

と出てくると思います
これは、pythopathにはROSのpython(おそらくシステムのpython2.7を呼ぶようにしてある)がはいってますよといっている
もちろん /usr/bin に入っているデフォルトpythonについては、呼ぶことができるのでいいんですけど

http://www.tohoho-web.com/python/start.html

これのせいで、もしくはおかげで、ROSのpythonの優先度が一番高くなってそう

# visual codeのフォント
vcのフォントをubuntuにしたので変えたいなぁと思い

https://www.rs.tus.ac.jp/yyusa/ricty.html

https://qiita.com/2celeb/items/865dd294ed499ed5f15c

http://keisanbutsuriya.hateblo.jp/entry/2016/12/07/005733


https://fonts.google.com/specimen/Inconsolata?selection.family=Inconsolata

http://mix-mplus-ipa.osdn.jp/migu/


でいろいろやってみるとできます

ちなみにubuntuはfontは

/usr/share/fonts/


の下にディレクトリをフォント名で作成します

```
$ sudo mv Ricty-Bold.ttf Ricty-BoldOblique.ttf Ricty-Oblique.ttf Ricty-Regular.ttf RictyDiscord-Bold.ttf RictyDiscord-BoldOblique.ttf RictyDiscord-Oblique.ttf RictyDiscord-Regular.ttf /usr/share/fonts/Ricty
```


fontの有効化

```
$  fc-cache -fv
```

vccodeの有効化

```
"editor.fontFamily": " 'Ricty' ",
    "editor.fontSize": 16,
```

# 色いろインストール

管理者権限インストール

```
$ pip3 install --user tensorflow
```

## python-controlに必要なもの

```
$ sudo apt-get install gfortran
$ sudo apt-get install libblas-dev libatlas-dev liblapack-dev
$ sudo apt-get install libopenblas-dev
```

```
$ pip3 install --user slycot
```