JetsonNano2GB,GR-ROSEを使ってフォロを動かす

#つくる目的
ROSを使う人を少をしでも増やせれば嬉しいと思い、
ロボットを安く構成しつつ、様々な応用が考えられるロボットを作りたいと思いました。
[フォロを動かした際のYoutube動画](https://youtu.be/Z6jL9sODpIw)
![20201104220621_IMG_2897.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/20b654e2-d2eb-a13b-a06d-b09333b612ea.jpeg)
#目次
1.ロボットの構成
2.それぞれの特徴
&nbsp;2.1.JetsonNano2GBの特徴
&nbsp;2.2.GR-ROSEの特徴
&nbsp;2.3.フォロの特徴
3.動かしてみよう
&nbsp;3.1.JetsonNano2GBをROS対応させる
&nbsp;3.2.GR-ROSEをROS対応させる
&nbsp;3.3.フォロをGR-ROSEで動かす
4.今後の展開
5.まとめ

#1.ロボットの構成
今回の構成は以下の通りとなっています。フォロ自体はGR-ROSEとモータドライバを入れるため、頭部の中を加工して入るようにしました。
![フォロ_概要図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/9f047374-843c-a974-283e-42f95586d87a.png)

![接続図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/545ac465-7d3b-010f-9d99-8f0af975bfaa.png)


#2.それぞれの特徴
JetsonNano2GB、GR-ROSE、フォロの特徴をそれぞれ列挙していきます。
##2.1.JetsonNano2GBの特徴
　JetsonNano2GBの特徴を簡単に記入します。
###2.1.1.とにかく安い！
　 プログラミングやAI、ロボットといったものを学習できるデバイスが￥6,820円(2020/11/15時点)で購入できるのは、素晴らしい時代になったと正直に思いました。
　このJetsonNanoによって、やってみたいことを試して、自分が面白いと思う事に進んでみるきっかけをつかめると思いました。
　[Jetson Nano 2GB 開発者キット](https://akizukidenshi.com/catalog/g/gM-15857/)

###2.1.2.USB Type-Cで動くようになった！
　以下の概要の様にJetsonNano2GBは電源コネクタがDC5VジャックからUSB Type-Cになりました。
https://developer.nvidia.com/embedded/learn/jetson-nano-2gb-devkit-user-guide

　これによってPD対応しているモバイルバッテリーから動かすことが出来るようになり、ロボットやラジコンに搭載しやすくなりました。そこでこちらのバッテリーを使って単体でも動かせるようにしています。
[モバイルバッテリー cheero Power Plus 5 Stick 5000mAh with Power Delivery](https://www.amazon.co.jp/gp/product/B07YP48P18/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1)

##2.2.GR-ROSEの特徴
　GR-ROSEの特徴についても簡単に記入します。
###2.2.1.小さなロボットを動かすのに最適
 GR-ROSEはコンパクトなサイズでありながら多くのI/Oピンを持っており、DIYで何かを動かすにはとても重宝します。更にROS対応させることも簡単かつ、今後のROS2対応を見据えた構成にすることも可能なため、将来性も感じています。

##2.3.フォロの特徴
 フォロを見た瞬間、「魔改造したみたい！」という衝動に駆られつつも、そのタイミングをいつにしようか考えていました。そこにこの”JetsonNano2GB”が出てきたことで魔改造への道へ突き進んでみようと決心しました。
　[ELEKIT(エレキット) フォロ ](https://www.amazon.co.jp/%E3%82%A4%E3%83%BC%E3%82%B1%E3%82%A4%E3%82%B8%E3%83%A3%E3%83%91%E3%83%B3-EK-Japan-MR-9107-%E3%82%A8%E3%83%AC%E3%82%AD%E3%83%83%E3%83%88/dp/B07BF4TBQB/ref=sr_1_7?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E3%83%95%E3%82%A9%E3%83%AD&qid=1605397752&sr=8-7)
###2.3.1.6本足で動く
　フォロの特徴は何と言っても、6本足を器用に使いながら可愛らしく動いていく仕草にあると思います。
![123337629_4124717914210189_9205812697245295606_o.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/7249c24b-e3f5-1aec-371b-35edaf4dbcfd.jpeg)

###2.3.2.前後進・左右旋回が出来る
　フォロの構造を見てみると、たった2個のモータで全ての足を動かしており、更に前後進・左右旋回移動する構造はROSで動かす（魔改造する）のに最適な構造でした。
[フォロ製品概要](https://www.elekit.co.jp/product/MR-9107)
　これを見たらもうやるっきゃない！と衝動のまま作ってしまいました。
#3.動かしてみよう
　では今回行った作業工程について書いていきます。
##3.1.JetsonNano2GBをROS対応させる
JetsonNano2GBをROS対応させるため、JetsonNano2GB自体のセットアップとROSの構築をしていきます。
###3.1.1.JetsonNano2GBのセットアップ
まずはJetsonNano2GBをセットアップしていきます。以下のYoutubeを参考にしながら進めると良いと思います。
[Youtube動画 JetsonNano2GB](https://www.youtube.com/watch?v=uvU8AXY1170&feature=share&fbclid=IwAR0k9OX6nVvqobSs7niYuuvyclQnGT-Sw-NyMd0JPTXY7D_7DiowUsOmqk8)

ここでダウンロードするイメージについて、以下より”Jetson Nano 2GB Developer Kit”をダウンロードしました。
https://developer.nvidia.com/embedded/downloads

ここで注意したいのが「Jetson Nano Developer Kit」と「Jetson Nano 2GB Developer Kit」ではダウンロードするイメージが違うため、以下の図でオレンジ色で囲われた「Jetson Nano 2GB Developer Kit」の方のDownloadを選択しましょう。
![ワークスペース 1_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/da7f6646-18a4-fc32-2540-2d38fe53c82e.png)

###3.1.2.JetsonNano2GBのROS対応
ROSのインストールについては以下を参考にさせて頂きました。 
[Jetson NanoにROSをインストールする方法](https://qiita.com/karaage0703/items/aa54e086f0a2f165d3e9)
こちらの中で紹介されています様に、ターミナルを開き以下のコマンドを実行しました。

```bash:ROSのインストール
$ git clone https://github.com/karaage0703/jetson-nano-tools
$ cd jetson-nano-tools
$ ./install-ros-melodic.sh
```
また作業用のcarkin_wsディレクトリの環境を整備します。以下を参考に実施して下さい。
[catkin の workspace を作る](http://wiki.ros.org/ja/catkin/Tutorials/create_a_workspace)
##3.2.GR-ROSEをROS対応させる
GR-ROSE をコントローラとしたロボットが、ROS による topic 通信を使って動く環境を構築します。
##3.2.1. Windows10を使用
私はGR-ROSEのスケッチを書き込む際に Windows10 を使用しています。その場合以下の IDE for Gadget Renesas をインストールしました。Macでも構いません。
##3.2.2. IDE for Gadget Renesas(IDE for GR)
　ここより IDE for Gadget Renesas をインストールしました。

　[IDE for Gadget Renesas](https://www.renesas.com/jp/ja/products/gadget-renesas/ide-gr.html)

##3.2.3. ros_lib.zipをライブラリに追加
　私は以下の岡宮さんの投稿を参考にライブラリを保管しました。

　[rosserial (ROS 1)](http://japan.renesasrulz.com/gr_user_forum_japanese/f/gr-rose/6130/rosserial-ros-1)

　私はこの ros_lib ライブラリを解凍して以下のフォルダに保管して使っております。
　C:\Users\ユーザ名\Documents\Arduino\libraries

##3.2.4. 使用するスケッチ
GR-ROSEに書き込んだ内容は以下となります。

```cpp:folo_robot_ros.ino
#include <ros.h>
#include <ros/time.h>
#include <geometry_msgs/Twist.h>
#include <std_msgs/Float64.h>
#include <sensor_msgs/JointState.h>
#include <std_msgs/String.h>
#include <stdlib.h>
#include <Arduino.h>

ros::NodeHandle nh;
std_msgs::Float64 mydata;

//cmd_vel用
float linear_x=0.000;//speed x [m]
float linear_y=0.0;//speed y [m]
float linear_z=0.0;//speed y [m]
float angle_z=0.00;//speed z [rad/s]

unsigned long last_time=0;
unsigned long current_time=0;

float step_time=10000;//(μsec)


/////////////////////////// ROS  callback //////////////////////////////////////////////////
void messageCb(const geometry_msgs::Twist& twist) {//ここでcmd_vel tpoicの内容を取得している
  linear_x = twist.linear.x;
  linear_y = twist.linear.y;
  linear_z = twist.linear.z;
  angle_z = twist.angular.z;  
}
ros::Subscriber<geometry_msgs::Twist> sub("cmd_vel", &messageCb);

///////////////////////// motor drive   ///////////////////////////////////////////////////
void motor_vel(float x,float sita){　//float x,float sitaの値で2個のモータを動かす
  float straight_time =0;
  float curve_time    =0;

  if(x>1){
    x=1;
  }  
  else if(x<0.48 && x>0.1){//DCモータを動かしているため鈍い動きの値を強制的にオフセットしている
    x=0.48;
  }  
  else if(x>-0.48 && x<-0.1){//DCモータを動かしているため鈍い動きの値を強制的にオフセットしている
    x=-0.48;
  }  
  else if(x<-1){
    x=-1;
  }
  
  if(sita>1){
    sita=1;
  }  
  else if(sita<0.20 && sita>0.1){
    sita=0.20;
  }
  else if(sita>-0.20 && sita<-0.1){
    sita=-0.20;
  }
  else if(sita<-1){
    sita=-1;
  }  

///////////////////////// 以下で100μsecの間でONとOFFする時間の割合を決めてスイッチングしている(PWMの代替) /////////////////////////////////
  straight_time =abs(x   )*step_time;
  curve_time    =abs(sita)*step_time;
  
  last_time=micros();
  current_time = micros();
   while(current_time<(last_time+step_time)){
    if(current_time<(last_time+straight_time)){ 
     if(x>0){    
        digitalWrite(A2,HIGH);
        digitalWrite(A3, LOW);
      }
      else{
        digitalWrite(A2, LOW);
        digitalWrite(A3,HIGH);
      }
    }
    else{
        digitalWrite(A2, LOW);
        digitalWrite(A3, LOW);
    }
    
    if(current_time<(last_time+curve_time)){
      if(sita>0){    
        digitalWrite(A0,HIGH);
        digitalWrite(A1, LOW);
      }
      else{
        digitalWrite(A0, LOW);
        digitalWrite(A1,HIGH);
      }     
    }
    else{
        digitalWrite(A0, LOW);
        digitalWrite(A1, LOW);   
    }    
    current_time = micros();
  }
    
}

///////////////////////////// setup  /////////////////////////////////////////////////   
void setup() { 
  pinMode(A0, OUTPUT);
  pinMode(A1, OUTPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, OUTPUT);
  delay(10);
  digitalWrite(A0, LOW);
  digitalWrite(A1, LOW);
  digitalWrite(A2, LOW);
  digitalWrite(A3, LOW);  
  delay(10);
  Serial.begin(115200); 
  
  //ROSの初期設定
  nh.getHardware()->setBaud(115200);//baudrateを1Mbpsに設定
  nh.initNode();
  nh.subscribe(sub); 
  Serial.println("folo woke up!");
  nh.loginfo("ROS woke up!!");

  last_time=micros();
  current_time = micros();  
}

///////////////////////////// loop  /////////////////////////////////////////////////   
void loop() {
  nh.spinOnce();        
  motor_vel(linear_x,angle_z);
}
```
これでフォロがROSのcmd_vel　topicを使って動くようになりました。

##3.3.フォロをGR-ROSEで動かす
ではフォロを動かすためのrosserialと、マウス等で操作できるようにインストールしていきます。

```bash:rosserial,teleop_toolsのインストール
$ sudo apt install ros-melodic-rosserial ros-melodic-rosserial-arduino ros-melodic-mouse-teleop
```
あとはターミナルでそれぞれコマンドを実行していきます。一つ一つ確実に動かしていくことがポイントです。

```bash:roscoreの起動
$ roscore
```

```bash:rosserialの起動
$ sudo chmod a+rw /dev/ttyACM0
$ rosrun rosserial_python serial_node.py _port:=/dev/ttyACM0 _baud:=115200
```
```bash:mouseteleopの起動
$ rosrun mouse_teleop mouse_teleop.py mouse_vel:=cmd_vel
```

如何でしょうか？マウス操作でフォロが動くようになったと思います。これを応用し、様々なデバイスで操作できるようになります。

#4.今後の展開
　今回はROSを使ってマウスによる操作までを書きましたが、JetsonNanoの得意分野であるカメラを使った画像認識と連携しながらフォロを動かすことや、他の端末と処理を分散すればフォロでマップ(SLAM)を作ったり、自動航行することも可能だと思っています。

#5.まとめ
　今回はJetsonNano2GB,GR-ROSE,フォロを使ってROSで動くロボットを作ることができました！こう言ったロボットがこれからも沢山出てくることを期待し、より多くの人がROSを使っていけたら嬉しいです。またこのフォロにカメラを搭載したり更なる改造をしていこうと思っています。