ROSユーザーのためのconda環境構築

最近流行りの機械学習なんかをやりたいとき、Pythonで環境構築って大変ですよね。
ローカルの環境も汚れますし...。
コードを動かしながら機械学習を学べる教材などではAnacondaやMinicondaを使っているものをよく見ます。
そしてこれらの環境を作るとき、ROSユーザーは割と困ることが多いんですが、意外と記事が少なかったりするのでここに残すことにしました。環境は以下のとおりです。

- Ubuntu18.04
- Python3.6
- Miniconda

## Minicondaのインストール
[ここ](https://docs.conda.io/en/latest/miniconda.html)からPython3.7の64bit版をダウンロード

```
$ cd ~/Downloads
$ bash Miniconda3-latest-Linux-x86_64.sh
```

上のコマンドを実行し、端末の指示にしたがってインストールを進めます。
最後に ```conda init```を実行するか聞かれるので、yesと答えれば環境構築は終了となります。

正常にインストールできた場合、```conda init```の実行で何が起きるのかは以下をご覧ください。

![Screenshot from 2019-11-24 15-35-37 (コピー).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263384/8612db57-4c95-1519-3595-dc5e39e1b0c9.png)

.bashrcが編集されるようなので、中身を一応確認してきましょう。
追記されたのは以下の部分です。

![Screenshot from 2019-11-24 15-38-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263384/87c99614-0547-3e88-ab5c-c2a660e9ab76.png)

### ここで注意！
.bashrcでROSの読み込みを行っている場合、```conda init```のときに以下のようなワーニングが出ます。

![Screenshot from 2019-11-21 14-29-54 (コピー).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263384/47d91618-ef35-b5ad-78f3-d48af331cce4.png)

ROSの環境を読み込んでいると、PYTHONPATHが/opt/ros/melodic/lib/python2.7/dist-packagesを指すようになっているからですね。
なので、インストール前にはROSの読み込みを無効にしておきましょう。

## condaを用いてROSの環境構築

以下のコマンドを打つだけ

```
$ conda create --name ros --channel conda-forge ros-core ros-actionlib ros-dynamic-reconfigure python=2.7
$ conda activate ros
```

これだけで、condaの仮想環境上にROSの環境ができるのって便利ですね。
roscoreやrosrun、roslaunchなどの基本コマンドは使えます。

## 自作パッケージ
condaを使った仮想環境上でROSを動かす上で気になるのは自作パッケージです。
今回はROS1を使っているのでC++でパッケージなどを作成すると、catkin_makeが必要になります。

https://github.com/nakano16180/roscpp_practice
上記リンクのパッケージを今回使用しました。

### はまった点
本来ならば、githubのパッケージをcloneしてcatkin_makeすればrosrunで起動することができます。
しかし今回はまったのはこちら。pthreadへのパスが通っていない模様？

![Screenshot from 2019-11-28 16-50-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263384/c34db8ed-02bd-df9c-dd11-1cbefb2f1859.png)

これを解決するために、CMakeLists.txtを以下のように編集しました。

<details><summary>CMakeLists.txt</summary><div>

```CMakeLists.txt
cmake_minimum_required(VERSION 2.8.3)
project(roscpp_practice)

## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)

## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
  rosbag
)

## System dependencies are found with CMake's conventions
find_package(Boost REQUIRED COMPONENTS system)
find_package(Threads REQUIRED)  # ここ追記


## Uncomment this if the package has a setup.py. This macro ensures
## modules and global scripts declared therein get installed
## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html
# catkin_python_setup()

###########
## Build ##
###########

## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
# include
  ${catkin_INCLUDE_DIRS}
)

## Declare a C++ library
# add_library(${PROJECT_NAME}
#   src/${PROJECT_NAME}/roscpp_practice.cpp
# )

## Add cmake target dependencies of the library
## as an example, code may need to be generated before libraries
## either from message generation or dynamic reconfigure
# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
# add_executable(${PROJECT_NAME}_node src/roscpp_practice_node.cpp)
add_executable(talker src/talker.cpp)
add_executable(listener src/listener.cpp)
add_executable(bag_write src/bag_write.cpp)
add_executable(bag_read src/bag_read.cpp)

## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")

## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

## Specify libraries to link a library or executable target against
# target_link_libraries(${PROJECT_NAME}_node
#   ${catkin_LIBRARIES}
# )
target_link_libraries(talker
  ${catkin_LIBRARIES}
  Threads::Threads  ##追記
)
target_link_libraries(listener
  ${catkin_LIBRARIES}
  Threads::Threads  ##追記
)
target_link_libraries(bag_write
  ${catkin_LIBRARIES}
  Threads::Threads  ##追記
)
target_link_libraries(bag_read
  ${catkin_LIBRARIES}
  Threads::Threads  ##追記
)

```
</div></details>

以上のように編集してやることで無事、buildして実行することができました。
![Screenshot from 2019-11-30 14-20-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263384/fa551947-cb76-c4bf-b1c1-111aa9f282c4.png)

## 最後に
ここまで書いといてなんですが、Python３系が使えるROS2に早く移行しましょう！