Turtlebot3(Burger)をROS BridgeしてRustで動かす準備

## はじめに

[株式会社Rist](https://www.rist.co.jp/)のロボットチームの原山です。

Ristは画像認識AIの会社ですが、その他にも色々とやっております。
その中にロボット事業もあり、私はその一員です。

今回はROSとRustについて書いていきます。

## 記事について
社内では、[Rust](https://www.rust-lang.org/)の勉強会があります。
なのでTurtlebot3 BurgerをRustで動かすための準備をしてみたいと思います。

## Rustについて

RustのROSクライアントライブラリーは**rosrust**または**rclrust**です。
今回は、**rosrust**を使用
Rustを使えるようにするには[ここ](https://www.rust-lang.org/ja/tools/install)から。

また、ビルドはcatkin_makeを使用します。


## 環境

Turtlebot3 Burger: Ubuntu 18.04, Dashing(ROS2), ROS Bridge
RemotePC: Ubuntu 18.04, Melodic(ROS1)

## 実機

Turtlebot 3 Burger: Raspberry pi 4 , OpenCR

## TurtleBot3　セットアップ

### Raspberry pi 4 用のSDカード

* [ここ](https://ubuntu.com/download/raspberry-pi)からダンロード。
* [Etcher](https://www.balena.io/etcher/)などでSDカードに書き込み。
* SDカードをRaspberry pi 4に挿入
* usernameはubuntu, passwordはubuntu

### Raspberry pi 4のネットワーク設定

* ターミナルを開く
* ネットワーク設定用のファイルを作成する

```shell
$ sudo touch /etc/netplan/99-netcfg.yaml
$ sudo nano /etc/netplan/99-netcfg.yaml
```

* 下記を記載する
* 
```yaml=
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: yes
      dhcp6: yes
      optional: true
  wifis:
    wlan0:
      dhcp4: no
      dhcp6: no
      addresses: [192.168.0.XXX/24, ] -> IPは適切なのに変更してください。
      gateway4: 192.168.0.1
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]
      access-points:
        Your wifi access point name:
          password: "Your wifi access point password"
```

* Raspberry pi 4を再起動

```shell=
$ sudo netplan apply
$ reboot
```

* サービスの起動

```shell=
systemctl mask systemd-networkd-wait-online.service
```

### Remote PCからRaspberry pi 4に接続

* Raspberry pi 4に接続

```shell=
$ ssh ubuntu@<YOUR NETWORK IP of Raspberry PI>
```

### ROS 2 (Dashing Diademata) をインストール

* [ROS2をインストール](https://index.ros.org/doc/ros2/Installation/Dashing/Linux-Install-Debians/)

* Aptパッケージの更新

```shell=
$ sudo apt update && sudo apt upgrade
```

* ロケールの設定

```shell=
$ sudo locale-gen en_US en_US.UTF-8
$ sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
$ export LANG=en_US.UTF-8
```

* 必要なパッケージをインストールとソースリストの更新

```shell=
$ sudo apt update && sudo apt install curl gnupg2 lsb-release
$ curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
$ sudo sh -c 'echo "deb [arch=amd64,arm64] http://packages.ros.org/ros2/ubuntu `lsb_release -cs` main" > /etc/apt/sources.list.d/ros2-latest.list'
```

* ROS2をインストール

```shell=
$ sudo apt update
$ sudo apt install ros-dashing-ros-base
```

* Turtlebot3パッケージをクローン、各種設定

```shell_session

$ sudo apt install python3-argcomplete python3-colcon-common-extensions libboost-system-dev build-essential
$ mkdir -p ~/turtlebot3_ws/src && cd ~/turtlebot3_ws/src
$ git clone -b ros2 https://github.com/ROBOTIS-GIT/hls_lfcd_lds_driver.git
$ git clone -b ros2 https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git
$ git clone -b ros2 https://github.com/ROBOTIS-GIT/turtlebot3.git
$ git clone -b ros2 https://github.com/ROBOTIS-GIT/DynamixelSDK.git
$ cd ~/turtlebot3_ws/src/turtlebot3
$ rm -r turtlebot3_cartographer turtlebot3_navigation2
$ cd ~/turtlebot3_ws/
$ echo 'source /opt/ros/dashing/setup.bash' >> ~/.bashrc
$ source ~/.bashrc
$ colcon build --symlink-install --parallel-workers 1
```

* .bashrcに下記を記載

```shell
export ROS_DOMAIN_ID=30
export TURTLEBOT3_MODEL=burger
export ROS_MASTER_URI=http://192.168.0.204:11311
export ROS_HOSTNAME=192.168.0.217
```

* OpenCRの設定

[OpenCRの設定方法](https://emanual.robotis.com/docs/en/platform/turtlebot3/ros2_setup/#opencr-setup)


## ROS Bridge 
同僚のサルバトーレさんnの[ROS Bridge記事](https://qiita.com/slabua/items/c430a0f56d6dfd828c21#ros-2-machine)を参考にします。

```
$ sudo apt install ros-dashing-ros1-bridge
```

## Remote PCセットアップ
MelodicのROS1環境をRemote PCにセットアップします。

* [ROS1インストール](http://wiki.ros.org/melodic/Installation/Ubuntu)

## rosrustのセットアップ

* プレーンなパッケージを作成する

```shell-session
$ cd ~/catkin_ws/src
$ catkin_create_pkg turtlebot3_rust_controller
```
turtlebot3_rust_controllerとつけてますが、何でもいいです。

* rustプロジェクトを作成する

```
$ cargo new --bin rust_controller
```

* package.xmlとCMakeLists.txtをturtlebot3_rust_controller内からコピーしてくる。

* package.xml
    * turtlebot3_rust_controllerってところをrust_controllerに変更する

```xml

<?xml version="1.0"?>
<package format="2">
  <name>rust_controller</name>
  <version>0.0.0</version>
  <description>The rust_controller package</description>

  <!-- One maintainer tag required, multiple allowed, one person per tag -->
  <!-- Example:  -->
  <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
  <maintainer email="kazuyuki-harayama@todo.todo">kazuyuki-harayama</maintainer>


  <!-- One license tag required, multiple allowed, one license per tag -->
  <!-- Commonly used license strings: -->
  <!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
  <license>TODO</license>


 ...省略

  <buildtool_depend>catkin</buildtool_depend>


  <!-- The export tag contains other, unspecified, tags -->
  <export>
    <!-- Other tools can request additional information be placed here -->

  </export>
</package>

```

* CMakeLists.txt
    * turtlebot3_rust_controllerってところをrust_controllerに変更する

```cmake
cmake_minimum_required(VERSION 3.0.2)
project(rust_controller)

## 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)

...省略

###################################
## catkin specific configuration ##
###################################
## The catkin_package macro generates cmake config files for your package
## Declare things to be passed to dependent projects
## INCLUDE_DIRS: uncomment this if your package contains header files
## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES turtlebot3_rust_controller2
#  CATKIN_DEPENDS other_catkin_pkg
#  DEPENDS system_lib
)

...省略

add_custom_target(rust_controller
    ALL
    COMMAND cargo build --release -p rust_controller
    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/cargo/release/rust_controller ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/rust_controller
    COMMENT "Building my Rust library"
)

```

* ~/catkin_ws/Cargo.tomlを作って下記を記載

```toml

[workspace]
members = [ "src/rust_test" ]
```

* ~/catkin_ws/.cargo/configを作って下記を記載

```
[build]
target-dir = "build/cargo"
```


次はセットアップができたので次は、[実行する](https://qiita.com/kazuharayama/items/70f2e4984cb43b56394e)を書く。


## 参考

[ROS2]
[Raspberry Pi 4 にROS 2をインストールする](https://rt-net.jp/mobility/archives/13190)
[Raspberry Pi 4 + ROS2 で、最低限のロボットプログラムを作る準備](https://qiita.com/nasu_onigiri/items/39a0b16107e8e7fbbbe1)

[rosrust]
[ROSのnodeをRustで書いてcatkinで管理する](https://qiita.com/nakakura/items/8b2f08e3b0bf782d4536)