RaspberryPi ZeroWでROSのパッケージを作る

# ROSのパッケージを作成する

先日RaspberryPi Zero WのRaspbianにインストールしたROSだが、この環境で自前のパッケージを作成してPublisherのサンプルプログラムを動かしてみる。
参考書籍は、[ROSロボットプログラミングバイブル](https://www.amazon.co.jp/dp/B07BKVQG5B/)。
何分にも、自前でビルドした環境のため、いろいろ引っかかってしまったので、そのあたりを中心にメモ。

# 環境設定

※超重要
最初これをしていなかったせいで、せっかく作ったパッケージが見つからないというエラーで悩んだ。
Bash起動時に、環境設定のスクリプトを実行するように設定する。

```
$ echo "source ~/ros_catkin_ws/devel_isolated/setup.bash" >> ~/.bashrc
$ echo "source ~/ros_catkin_ws/devel/setup.bash" >> ~/.bashrc
$ echo "source ~/ros_catkin_ws/devel/local_setup.bash" >> ~/.bashrc
```

# パッケージのスキャフォルド

パッケージのひな型をコマンドで作成する。

```
$ catkin_create_pkg ros_gnss_test message_generation std_msgs roscpp --rosdistro=melodic
```

パッケージ名をros_gnss_Testに変更。
また、本には記載されていなかった、--rosdistro=melodicオプションが必要だった。

# パッケージファイルを書き換える

以下のようにpackage.xmlを書き換えた。コメントは削除してある。

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

  <maintainer email="pi@todo.todo">pi</maintainer>

  <license>TODO</license>

  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>message_generation</build_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>std_msgs</build_depend>
  <build_export_depend>roscpp</build_export_depend>
  <build_export_depend>std_msgs</build_export_depend>
  <exec_depend>roscpp</exec_depend>
  <exec_depend>std_msgs</exec_depend>
  <exec_depend>message_runtime</exec_depend>
  <exec_depend>message_generation</exec_depend>

  <export>
  </export>
</package>
```

# CMakeファイルを書き換える

以下内容にCMakeLists.txtを書き換えた。これもコメント部分は省略。

```
cmake_minimum_required(VERSION 2.8.3)
project(ros_gnss_test)

find_package(catkin REQUIRED COMPONENTS
  message_generation
  roscpp
  std_msgs
)

add_message_files(
  FILES
  MsgGNSS.msg
)

generate_messages(
  DEPENDENCIES
  std_msgs
)

catkin_package(
  LIBRARIES ros_gnss_test
  CATKIN_DEPENDS message_generation roscpp std_msgs
)

include_directories(
  ${catkin_INCLUDE_DIRS}
)

add_executable(${PROJECT_NAME}_node src/ros_gnss_test_node.cpp)

add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

target_link_libraries(${PROJECT_NAME}_node
  ${catkin_LIBRARIES}
)
```

# メッセージファイルを作成

msgディレクトリを作成して、MsgGNSS.msgを作成し、以下を記載

```
time stamp
string data
```

# プログラムファイルを作成

src以下にros_gnss_test_node.cppとして、以下を作成。

```
#include "ros/ros.h"
#include "ros_gnss_test/MsgGNSS.h"

int main(int argc, char **argv)
{
  ros::init(argc, argv, "ros_gnss_test");
  ros::NodeHandle nh;

  ros::Publisher ros_gnss_test_pub = nh.advertise<ros_gnss_test::MsgGNSS>("ros_gnss_msg", 100);
  ros::Rate loop_rate(10);

  ros_gnss_test::MsgGNSS msg;

  while(ros::ok())
  {
    msg.stamp = ros::Time::now();
    msg.data = "test";

    ROS_INFO("send msg = %d", msg.stamp.sec);

    ros_gnss_test_pub.publish(msg);

    loop_rate.sleep();

  }

  return 0;
}
```

# ビルド

ワークスペースのルートに移動して、ビルド。

```
$ catkin_make
```

これでエラーがなければビルドされているはず。

# 実行

roscoreが動いている状態で、以下を実行。

```
$ rosrun ros_gnss_test ros_gnss_test_node
```

コンソールにはログとして、以下のような内容が出力される。

```
[ INFO] [1576429180.394603124]: send msg = 1576429180
[ INFO] [1576429180.494594427]: send msg = 1576429180
[ INFO] [1576429180.594606730]: send msg = 1576429180
[ INFO] [1576429180.694604033]: send msg = 1576429180
```

無事、自分でPublisherが動いた。