ROS×PCL　ROS　Pub＆Sub

今回は簡単なPublishとSubscribeをするノードの作成をします

## Requirement
- [package作成](https://qiita.com/kosei1515/items/ac80b221e34516ce568d)

## Make Package
ここではすでに```beginner_tutorials```というパッケージができていると仮定します
環境変数の読み込み忘れずに

```
source /opt/ros/melodic/setup.bash
```

workspaceに移動しmakeします

```
cd ~/catkin_ws
catkin_make
```

これでbuild完了です
以下でできたファイルが確認できます

```
cd ~/catkin_ws/
ls
```
実行するとこんな感じです

> ```
> build
> devel
> src
> ```

これ以降ターミナルを実行するたびに以下を実行すれば環境変数を読み込めます

```
source ~/catkin_ws/devel/setup.bash
```

毎回読み込むのがめんどくさかったら以下を実行しましょう！

```
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
```

プログラムはPCLをみこしてC++で書いていきます
まずはフォルダーに移動します。VSCode入ってる人はcode .でフォルダーを開けます

```
cd ~catkin_ws/src/beginner_tutorials
code .
```

ここからはコードです　
PCLをみこしてあえてC++の推奨に準拠して書いていきます

まずはメッセージをPublishするノードを書きます

```beginner_tutorials/include/beginner_tutorials/talker.h
#include<ros/ros.h>
#include<std_msgs/String.h>

namespace talker_node{
class Talker{
public:
    Talker();
    ~Talker();
    void talker_publish(std_msgs::String &msg);

private:
    ros::NodeHandle nh_;
    ros::Publisher std_pub_;
};
}

```
```beginner_tutorials/src/talker.cpp
#include<beginner_tutorials/talker.h>
namespace talker_node{

Talker::Talker(){
    std_pub_=nh_.advertise<std_msgs::String>("talker_node/string", 10);
}

Talker::~Talker(){}

void Talker::talker_publish(std_msgs::String &msg){
    std_pub_.publish(msg);
}
}

```

```beginner_tutorials/src/talker_main.cpp
#include <ros/ros.h>
#include <beginner_tutorials/talker.h>

int main(int argc, char **argv){
    ros::init(argc, argv, "talker_node");
    talker_node:Talker talker;
    ros::Rate loop_rate(10);

    while(ros::ok()){
        std_msgs::String msg;
        msg.data = "hello ros&pcl!!";
        talker.talker_publish(msg);
        ros::spinOnce();
        loop_rate.sleep();
    }   
}
```

次にPublishされたメッセージをSubscribeして表示するノードを書きます

```beginner_tutorials/include/beginner_tutorials/listener.h
#include<ros/ros.h>
#include<std_msgs/String.h>

namespace listener_node{
class Listener{
public:
    Listener();
    ~Listener();
    void string_callback(const std_msgs::String &msg);

private:
    ros::NodeHandle nh_;
    ros::Subscriber std_sub_;
};
}

```
```beginner_tutorials/src/listener.cpp
#include<beginner_tutorials/listener.h>
namespace listener_node{

Listener::Listener(){
    std_sub_ = nh_.subscribe("talker_node/string", 10, &Listener::string_callback, this);
}

Listener::~Listener(){}

void Listener::string_callback(const std_msgs::String &msg){
    ROS_INFO("get msg is ~%s~", msg.data.c_str());
}
}

```

```beginner_tutorials/src/listener_main.cpp
#include <ros/ros.h>
#include <beginner_tutorials/listener.h>

int main(int argc, char **argv){
    ros::init(argc, argv, "listener_node");
    listener_node::Listener listener;
    ros::spin();
}
```

以上でコードは完成です
最後にCMakeファイルを編集します

```beginner_tutorials/CMakeLists.txt
cmake_minimum_required(VERSION 3.0.2)
  project(beginner_tutorials)

  ## Find catkin and any catkin packages
  find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs)

  ## Declare a catkin package
  catkin_package()

  ## Build talker and listener
  include_directories(include ${catkin_INCLUDE_DIRS})
  ## Declare C++ library
  add_library(${PROJECT_NAME} 
    src/talker.cpp
    src/listener.cpp
  )

  add_executable(talker_node src/talker.cpp src/talker_main.cpp)
  target_link_libraries(talker_node ${catkin_LIBRARIES})

  add_executable(listener_node src/listener.cpp src/listener_main.cpp)
  target_link_libraries(listener_node ${catkin_LIBRARIES})
```

もうちょいです
最後にmakeしましょう

```
cd ~/catkin_ws
catkin_make
```

これで完成！

実行してみます

その前にターミナルをいくつも開くと面倒なので```teminator```をインストールしましょう

```
sudo apt install terminator
```

これで```Ctrl+Shift+e```でターミナルが横分割にでき、```Ctrl+Shift+o```で縦分割にできます

では新しくターミナルを開き以下を実行します
sourceを自動で読み込むようにしてない人はsourceを忘れずに

１つめ　roscore

```
roscore
```

2つ目

```
rosrun beginner_tutorials talker_node
```

3つ目

```
rosrun beginner_tutorials listener_node 
```

うごきましたか？？

おつした！

## next

##previous

https://qiita.com/kosei1515/items/ac80b221e34516ce568d

## references
https://qiita.com/kosei1515/items/bbd73d71aa9bdc6a4467