空飛ぶロボットのつくりかた

ロボットをつくるために必要な技術をまとめます。ロボットの未来についても考えたりします。

ROSのスクリプト構成を考えてみる

C++

pattern1 package

構成: func.h , func.cpp, func_node.cpp

func.h

  1. include <必要なファイル>
  2. namespaceをパッケージ名で作成
  3. Funcクラスを作成
  4. コンストラクタとデストラクタの定義(Public)
  5. pubやsub,callbackを定義(Private)
  6. その他、必要な変数や構造体を定義(Private)

ヘッダには一度だけincludeされるよう以下を書いておこう

#ifndef FUNC_HPP_
#define FUNC_HPP_

<contents>

#endif

func.cpp

  1. include <必要なファイル>
  2. namespace{ } 無名名前空間を作成。このファイルのみで使用する変数や関数を定義する
  3. namespaceをパッケージ名で作成
  4. Funcクラスの内容を記述する
  5. コンストラクタでpubやsubを作成
  6. 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

C++11で追加された型推論

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