ROSのスクリプト構成を考えてみる
C++編
pattern1 package
構成: func.h , func.cpp, func_node.cpp
func.h
- include <必要なファイル>
- namespaceをパッケージ名で作成
- Funcクラスを作成
- コンストラクタとデストラクタの定義(Public)
- pubやsub,callbackを定義(Private)
- その他、必要な変数や構造体を定義(Private)
ヘッダには一度だけincludeされるよう以下を書いておこう
#ifndef FUNC_HPP_ #define FUNC_HPP_ <contents> #endif
func.cpp
- include <必要なファイル>
- namespace{ } 無名名前空間を作成。このファイルのみで使用する変数や関数を定義する
- namespaceをパッケージ名で作成
- Funcクラスの内容を記述する
- コンストラクタでpubやsubを作成
- RunMainLoopにsFunctionのメインの実行文を記述
void Func::RunMainLoop(){ ros::Rate rate(0.1); while (ros::ok()){ ros::spinOnce(); <Functionの実装> } }
func_node.cpp
#include func.h int main(int argc, char* argv[]){ ros::init(argc, argv, "func"); ros::start() pattern1::Func func; func.RunMainLoop(); return EXIT_SUCCESS; }
boost libraryとは
参考: Boost - C++入門 boost - ROS Wiki BOOST FOREACH - C++入門
auto
#include <iostream> #include <vector> using namespace std; int main(int argc, char const* argv[]) { std::vector<int> v; v.push_back (1); v.push_back (2); v.push_back (3); for (auto x: v) { cout << x << endl; } return 0; }
参考: auto - C++入門 C++11 範囲ベース for ループ 入門
find
指定された値を検索する
#include <algorithm> #include <iostream> #include <vector> int main() { std::vector<int> v = { 3, 1, 4 }; auto result = std::find(v.begin(), v.end(), 1); if (result == v.end()) { std::cout << "not found" << std::endl; } else { std::cout << "found: " << *result << std::endl; } }
1
参考: find - cpprefjp C++日本語リファレンス
ハンドル
参考: C++ - ハンドル