Program Listing for File complete_turn_path_obj.h

Return to documentation for file (fields2cover/objectives/rp_obj/complete_turn_path_obj.h)

//=============================================================================
//    Copyright (C) 2021-2024 Wageningen University - All Rights Reserved
//                     Author: Gonzalo Mier
//                        BSD-3 License
//=============================================================================

#pragma once
#ifndef FIELDS2COVER_OBJECTIVES_COMPLETE_TURN_PATH_OBJ_H_
#define FIELDS2COVER_OBJECTIVES_COMPLETE_TURN_PATH_OBJ_H_

#include "fields2cover/types.h"
#include "fields2cover/objectives/pp_obj/pp_objective.h"
#include "fields2cover/objectives/rp_obj/rp_objective.h"
#include "fields2cover/objectives/rp_obj/direct_dist_path_obj.h"
#include "fields2cover/path_planning/turning_base.h"

namespace f2c::obj {

template <class T, class R = PPObjective>
class CompleteTurnPathObj : public RPObjective {
  static_assert(std::is_base_of<pp::TurningBase, T>::value,
      "T must derive from f2c::pp::TurningBase");
  static_assert(std::is_base_of<PPObjective, R>::value,
      "R must derive from f2c::obj::PPObjective");

 public:
  using RPObjective::RPObjective;
  explicit CompleteTurnPathObj(const F2CRobot& params);
  explicit CompleteTurnPathObj(const F2CRobot& params, const T& turn_planner);

 public:
  using RPObjective::computeCost;

  double computeCost(
      const F2CPoint& p1, double ang1,
      const F2CPoint& p2, double ang2) override;

  void setRobot(const F2CRobot& robot);
  void setTurnPlanner(const T& turner);

 private:
  T turn_planner;
  F2CRobot robot;
  R pp_objective;
};


template <class T, class R>
CompleteTurnPathObj<T, R>::CompleteTurnPathObj(const F2CRobot& robot) {
  this->setRobot(robot);
}

template <class T, class R>
CompleteTurnPathObj<T, R>::CompleteTurnPathObj(
    const F2CRobot& _robot, const T& _turner) :
        turn_planner(_turner), robot(_robot) {}

template <class T, class R>
void CompleteTurnPathObj<T, R>::setRobot(const F2CRobot& params) {
  this->robot = params;
}

template <class T, class R>
void CompleteTurnPathObj<T, R>::setTurnPlanner(const T& turner) {
  this->turn_planner = turner;
}


template <class T, class R>
double CompleteTurnPathObj<T, R>::computeCost(
    const F2CPoint& p1, double ang1,
    const F2CPoint& p2, double ang2) {
  return pp_objective.computeCost(
      this->turn_planner.createTurn(this->robot, p1, ang1, p2, ang2));
}


}  // namespace f2c::obj

#endif  // FIELDS2COVER_OBJECTIVES_COMPLETE_TURN_PATH_OBJ_H_