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++ - ハンドル