備忘録　ラズパイ5 ROS2　⑥　Ubuntu Desktop 24.04LTSでROS2環境　C++ その2 セットアップ pub.cpp rqt_graph

　前回、C++で初めてのパッケージ・プログラムを作りました。
 　パッケージ名はworksです。
 ```
 yoshi@yoshi:~/ros2_ws$ tree
 .
├── build
├── install
├── log
└── works
    ├── CMakeLists.txt
    ├── include
    │   └── works
    ├── package.xml
    └── src
        └── exec_sample
            └── main.c
```

### 環境
- Raspberry Pi 5 8GB
- 追加ボード；NVMe Base for Raspberry Pi 5 (NVMe Base by Pimoroni)
- Crucial クルーシャル P2シリーズ 500GB 3D NAND NVMe PCIe M.2 SSD CT500P2SSD8
- 初期；RaspberryPi OS Desktop 64bit (Debian version: 12 (bookworm) Release date: March 15th 2024)
- 現在；Ubuntu Desktop 24.04LTS(64-bit)
- ROS2 HumbleではなくJazzy

 Windows10で、検索窓にcmdと入れ、コマンドプロンプトを起動します。
　sshでログインします（第１回参照）。必要ならupdateします。
```
C:\Users\yoshi>ssh yoshi.local
```
ros2が実行できるようにします。
```
$ source /opt/ros/jazzy/setup.bash
$ cd ros2_ws
```
### publishするプログラムを作る

https://zenn.dev/uchidaryo/articles/ros2-programming-5

　works/srcの下に、pubという新しいソースのディレクトリを作り、プログラムpub.cppを保存します。
 ```
yoshi@yoshi:~/ros2_ws$ mkdir works/src/pub
yoshi@yoshi:~/ros2_ws$ nano works/src/pub/pub.cpp
```

 ```pub.cpp
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
#include <stdio.h>

int main(int argc, char **argv)
{
  printf("start publish test\n");
  rclcpp::init(argc, argv);
  auto node = rclcpp::Node::make_shared("publisher_yoshi");
  auto publisher = node->create_publisher<std_msgs::msg::String>("greeting", 1);

  rclcpp::WallRate loop(1);
  int count = 0;
  while (rclcpp::ok()) {
    auto msg = std_msgs::msg::String();
    msg.data = "Hello, world " + std::to_string(count++);
    publisher->publish(msg);
    loop.sleep();
  }

  rclcpp::shutdown();
  return 0;
}
```

```
└── works
    ├── CMakeLists.txt
    ├── include
    │   └── works
    ├── package.xml
    └── src
        ├── exec_sample
        │   └── main.c
        └── pub
            └── pub.cpp
```
　CMakeLists.txtは、前回のままです。
 　ビルドします。
```
yoshi@yoshi:~/ros2_ws$ colcon build
Starting >>> works
Finished <<< works [0.24s]

Summary: 1 package finished [0.38s]
```
　CMakeLists.txtを変更していないので、前回作ったmain.cがビルドされただけですね。

### ヘッダー類を追加したときのエラーの問題を解決する

　CMakeLists.txtを変更します。次のように、pub.cpp部分を追加します。
 ```
add_executable(pub  src/pub/pub.cpp)

install(
  TARGETS pub
  DESTINATION lib/${PROJECT_NAME}
)
```
　ビルドするとエラーが出ました。``rclcpp/rclcpp.hpp``が取り込めなかったようです。

```
yoshi@yoshi:~/ros2_ws$ colcon build
Starting >>> works
--- stderr: works
/home/yoshi/ros2_ws/works/src/pub/pub.cpp:1:10: fatal error: rclcpp/rclcpp.hpp: No such file or directory
    1 | #include "rclcpp/rclcpp.hpp"
      |          ^~~~~~~~~~~~~~~~~~~
```

　では、パッケージのクリエイトで追加しようとすると、
```
yoshi@yoshi:~/ros2_ws$ ros2 pkg create --build-type ament_cmake works --dependencies rclcpp rclcpp_components std_msgs
Aborted!
The directory already exists: ./works
Either remove the directory or choose a different destination directory or package name
```
worksには追加？できなさそうです。まっさらな状態で、上記を実行すると、CMakeLists.txtのなかに、``find_package(..``が追加されているのがわかりました。ros2をインストールした時点で、それらのヘッダー類はすでに全部が含まれているということのようです。1日費やしてなんとなくわかってきました。
　CMakeLists.txtを修正します。ライブラリを使うので探してきてねということを記述します。もともと、``find_package(ament_cmake REQUIRED)``はありました。そのあとに、今回利用する"rclcpp/rclcpp.hpp"と"std_msgs/msg/string.hpp"のために、なぜか3行追加しています。
 　なお、 ``find_package(..``した後に、``add_executable(..``の記述を追加します。順番が逆だとエラーになるようです。
 
```CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project(works)

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rclcpp_components REQUIRED)
find_package(std_msgs REQUIRED)

add_executable(exec_sample
  src/exec_sample/main.c)

install(
  TARGETS exec_sample
  DESTINATION lib/${PROJECT_NAME}
)

add_executable(pub src/pub/pub.cpp)

ament_target_dependencies(pub rclcpp std_msgs)

install(
  TARGETS pub
  DESTINATION lib/${PROJECT_NAME}
)


if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  # the following line skips the linter which checks for copyrights
  # comment the line when a copyright and license is added to all source files
  set(ament_cmake_copyright_FOUND TRUE)
  # the following line skips cpplint (only works in a git repo)
  # comment the line when this package is in a git repo and when
  # a copyright and license is added to all source files
  set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()

ament_package()
```

　ラズパイのターミナルで、ビルドします（必要ないかも）。
 
```
 yoshi@yoshi:~/ros2_ws$ colcon build
```

　可視化ツールrqt_graphを動かします。
 
```
$ source /opt/ros/jazzy/setup.bash
$ rqt_graph
```

　今回作ったプログラムを登録し、起動します。

```
yoshi@yoshi:~/ros2_ws$ source ~/ros2_ws/install/setup.bash
（省略）
yoshi@yoshi:~/ros2_ws$ ros2 pkg list | grep works
ros_workspace
works
yoshi@yoshi:~/ros2_ws$ ros2 run works pub
start publish test
```

　rqt_graphの左上にあるリフレッシュ・アイコンをクリックしたのが次の画面です。nodeの名称が表示されています。たぶん、publisherが動いているようです。

![Screenshot from 2024-07-26 03-31-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/c17bd0a4-41ec-a24f-751f-5f6db3348757.png)




-----------------
<h2>備忘録　ラズパイ5 ROS2</h2>

[①　ハードの用意とUbuntu Desktop 24.04LTS](https://qiita.com/jamjam/items/9ad621bda6ab2e1d325b)

[②　Ubuntu Desktop 24.04LTSでROS2環境　rqt_graphとturtlesim](https://qiita.com/jamjam/items/b7bed8ec9ff68426ac8d)

[③　Ubuntu Desktop 24.04LTSでROS2環境　Python その１ responder（セットアップ）](https://qiita.com/jamjam/items/d124c662813085bc69e3)

[④　Ubuntu Desktop 24.04LTSでROS2環境　Pythonその２responder（コーディングと実行；失敗）](https://qiita.com/jamjam/items/d488e2e4fa88d9882626)

[⑤　Ubuntu Desktop 24.04LTSでROS2環境　C++ その1 セットアップ main.c](https://qiita.com/jamjam/items/4bba331c08805ccda0a8)

[⑥　Ubuntu Desktop 24.04LTSでROS2環境　C++ その2 セットアップ pub.cpp rqt_graph](https://qiita.com/jamjam/items/51eeb26400517883aa59)

[⑦　Ubuntu Desktop 24.04LTSでROS2環境　C++ その3 セットアップ sub.cpp rqt_graph](https://qiita.com/jamjam/items/50f3bc352e4cd0a7959d)

[⑧　Ubuntu Desktop 24.04LTSでROS2環境　C++ その4 bme280.cpp 温度](https://qiita.com/jamjam/items/f64eaae91fefed4eac34)

--------------

https://qiita.com/jamjam/items/692568361dde688fad16