nhk2025b_ros2¶
ros2のwsです
準備¶
- ROS 2 humble をインストール
- Windowsの場合、WSLでUbuntu22.04をインストール後humbleインストール
- Dockerが利用可能な場合、VSCodeのDevContainerを使って環境構築可能
- リポジトリをクローン
cd ~ git clone git@github.com:NITIC-Robot-Club/nhk2025b_ros2.git
- ビルド手順
cd ~/nhk2025b_ros2 colcon build --symlink-install
開発¶
- Issueを作成
- どんな作業をやるのかを明記
- 以下の接頭語をつけること
- feat:新規機能など
- fix:バグ修正
- 例
- feat: nhk2025b_newpackage
- feat(nhk2025b_newpackage): add new feat
- fix(nhk2025b_newpackage): fix zero division
- 要件等をまとめる
- どんな入出力なのか
- 何を変更するのか
- そのバグはどのような状況で再現できるか
- どんな修正を含むのか
- ローカルで新しくブランチを作成
- Issueを開き、右下のDevelopmentの
create branch
を押して自動生成する - この操作により、リモートリポジトリに新しいブランチが作成されます
- 表示されたコマンドをローカルで実行して、新しいブランチをチェックアウトしてください
git fetch origin --prune git checkout ブランチ名
- Issueを開き、右下のDevelopmentの
- 変更を加える
- コミットメッセージは最終的にはまとめられるが、わかりやすいものがいい
- コミットメッセージに規則はない
- auto lintが働いてコードがきれいになります
- 作業前にpullを忘れずに!
- 変更が終わったらpushする
git push origin ブランチ名
- PRを作成する
- githubでリポジトリを開き、作成したブランチを開く
- Compare & pull request ボタンを押してPRを作成する
- PRのタイトルはIssueと同じにする
- コードレビュー&マージ
- kazu-321 にコードレビューを割り当てる
- 時間のあるときにコードの検証等を行うのでマージされるまで待つ
- 3日経ってもマージされない場合はdiscordで連絡
- ローカルブランチを削除
- マージ済みのブランチは残り続けてしまうため以下のコマンドで削除する
git fetch origin --prune git branch -a
git branch -d 削除対象ブランチ名
- マージ済みのブランチは残り続けてしまうため以下のコマンドで削除する
- もし削除できない場合は mainブランチにチェックアウトして、-Dオプションで削除してみてください
ROS 2 テンプレ¶
package.xml¶
<?xml version="1.0"?>
<package format="3">
<name>ーーーパッケージ名ーーー</name>
<version>0.0.1</version>
<description>ーーー説明ーーー</description>
<maintainer email="ーーーメアドーーー">ーーー名前ーーー</maintainer>
<license>MIT</license>
<buildtool_depend>ament_cmake_auto</buildtool_depend>
<depend>rclcpp</depend>
<depend>rclcpp_components</depend>
<depend>ーーー依存ーーー</depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
CMakeLists.txt¶
cmake_minimum_required(VERSION 3.8)
project(ーーーパッケージ名ーーー)
find_package(ament_cmake_auto REQUIRED)
ament_auto_find_build_dependencies()
ament_auto_add_library(${PROJECT_NAME} SHARED
DIRECTORY src
)
target_include_directories(${PROJECT_NAME}
SYSTEM PUBLIC
)
rclcpp_components_register_node(${PROJECT_NAME}
PLUGIN "ネームスペース::クラス名"
EXECUTABLE ノード名
)
ament_auto_package(
INSTALL_TO_SHARE
)
include/パッケージ名/ノード名.hpp¶
#ifndef __ノード名_hpp__
#define __ノード名_hpp__
#include <rclcpp/rclcpp.hpp>
// #include <test_msgs/msg/my_message.hpp>
namespace ネームスペース名 {
class クラス名 : public rclcpp::Node {
public:
クラス名(const rclcpp::NodeOptions & options);
private:
// コールバック関数とか変数とか
// void 受信時に呼び出す関数名(const test_msgs::msg::MyMessage::SharedPtr msg);
// void タイマーで呼び出す関数名();
// rclcpp::Publisher<test_msgs::msg::MyMessage>::SharedPtr パブリッシャー;
// rclcpp::Subscription<test_msgs::msg::MyMessage>::SharedPtr サブスクライバー;
// rclcpp::TimerBase::SharedPtr タイマー;
};
}
#endif//__ノード名_hpp__
src/ノード名.cpp¶
#include "パッケージ名/ノード名.hpp"
namespace ネームスペース名 {
クラス名::クラス名(const rclcpp::NodeOptions & options)
: Node("ノード名",options) {
// パブリッシャー = this->create_publisher<test_msgs::msg::MyMessage>("topic名", 1);
// サブスクライバー = this->create_subscription<test_msgs::msg::MyMessage>
// ("topic名", 1, std::bind(&クラス名::受信時に呼び出す関数名, this, std::placeholders::_1));
// タイマー = this->create_wall_timer(std::chrono::milliseconds(周期),
// std::bind(&クラス名::タイマーで呼び出す関数名, this));
}
// void クラス名::受信時に呼び出す関数名(const test_msgs::msg::MyMessage::SharedPtr msg) {
// msg->test のように->を使って情報にアクセス
// }
// void クラス名::タイマーで呼び出す関数名() {
// 定期的に実行
// }
}
#include <rclcpp_components/register_node_macro.hpp>
RCLCPP_COMPONENTS_REGISTER_NODE(ネームスペース名::クラス名)