diff --git a/src/captures/CMakeLists.txt b/src/captures/CMakeLists.txt index 216253c75230057b83739b16319802c0f4d2f69c..8776bb7d109f7621a1b408a03836832993926dbc 100644 --- a/src/captures/CMakeLists.txt +++ b/src/captures/CMakeLists.txt @@ -3,7 +3,9 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) # Forward var to parent scope SET(HDRS_CAPTURE ${HDRS_CAPTURE} - ${CMAKE_CURRENT_SOURCE_DIR}/capture_velocity.h PARENT_SCOPE) + ${CMAKE_CURRENT_SOURCE_DIR}/capture_velocity.h + ${CMAKE_CURRENT_SOURCE_DIR}/capture_wheel_joint_position.h PARENT_SCOPE) SET(SRCS_CAPTURE ${SRCS_CAPTURE} - ${CMAKE_CURRENT_SOURCE_DIR}/capture_velocity.cpp PARENT_SCOPE) + ${CMAKE_CURRENT_SOURCE_DIR}/capture_velocity.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/capture_wheel_joint_position.cpp PARENT_SCOPE) diff --git a/src/captures/capture_wheel_joint_position.cpp b/src/captures/capture_wheel_joint_position.cpp new file mode 100644 index 0000000000000000000000000000000000000000..46caa2d95c6f7aaf4d81e29523b5da2a9aa7d3be --- /dev/null +++ b/src/captures/capture_wheel_joint_position.cpp @@ -0,0 +1,58 @@ +#include "capture_wheel_joint_position.h" +#include "../sensors/sensor_diff_drive.h" +#include "../rotations.h" + +namespace wolf { + +CaptureWheelJointPosition::CaptureWheelJointPosition(const TimeStamp& _ts, + const SensorBasePtr& _sensor_ptr, + const Eigen::VectorXs& _positions, + FrameBasePtr _origin_frame_ptr) : + CaptureMotion(_ts, _sensor_ptr, _positions, Eigen::Matrix2s::Zero(), 3, 3, + _origin_frame_ptr/*, nullptr, nullptr, std::make_shared<StateBlock>(3, false)*/) +{ +// setType("WHEEL JOINT POSITION"); + + const IntrinsicsDiffDrive intrinsics = + *(std::static_pointer_cast<SensorDiffDrive>(getSensorPtr())->getIntrinsics()); + + setDataCovariance(computeWheelJointPositionCov(getPositions(), + intrinsics.left_resolution_, + intrinsics.right_resolution_, + intrinsics.left_gain_, + intrinsics.right_gain_)); +} + +CaptureWheelJointPosition::CaptureWheelJointPosition(const TimeStamp& _ts, + const SensorBasePtr& _sensor_ptr, + const Eigen::VectorXs& _positions, + const Eigen::MatrixXs& _positions_cov, + FrameBasePtr _origin_frame_ptr, + StateBlockPtr _p_ptr, + StateBlockPtr _o_ptr, + StateBlockPtr _intr_ptr) : + CaptureMotion(_ts, _sensor_ptr, _positions, _positions_cov, 3, 3, + _origin_frame_ptr, _p_ptr, _o_ptr, _intr_ptr) +{ +// setType("WHEEL JOINT POSITION"); +} + +Eigen::VectorXs CaptureWheelJointPosition::correctDelta(const VectorXs& _delta, + const VectorXs& _delta_error) +{ + Vector3s delta = _delta + _delta_error; + delta(2) = pi2pi(delta(2)); + return delta; +} + +const Eigen::VectorXs& CaptureWheelJointPosition::getPositions() const +{ + return getData(); +} + +const Eigen::MatrixXs& CaptureWheelJointPosition::getPositionsCov() const +{ + return getDataCovariance(); +} + +} // namespace wolf diff --git a/src/captures/capture_wheel_joint_position.h b/src/captures/capture_wheel_joint_position.h new file mode 100644 index 0000000000000000000000000000000000000000..3db21c9c98df85fe9c618158591f45e044900d8d --- /dev/null +++ b/src/captures/capture_wheel_joint_position.h @@ -0,0 +1,184 @@ +/** + * \file diff_drive_tools.h + * + * Created on: Oct 20, 2016 + * \author: Jeremie Deray + */ + +#ifndef CAPTURE_WHEEL_JOINT_POSITION_H_ +#define CAPTURE_WHEEL_JOINT_POSITION_H_ + +//wolf includes +#include "../capture_motion.h" + +namespace wolf { + +WOLF_PTR_TYPEDEFS(CaptureWheelJointPosition) + +/** + * @brief The CaptureWheelJointPosition class + * + * Represents a list of wheel positions in radian. + */ +class CaptureWheelJointPosition : public CaptureMotion +{ +protected: + + using NodeBase::node_type_; + +public: + + /** + * \brief Constructor + **/ + CaptureWheelJointPosition(const TimeStamp& _ts, + const SensorBasePtr& _sensor_ptr, + const Eigen::VectorXs& _positions, + FrameBasePtr _origin_frame_ptr); + + CaptureWheelJointPosition(const TimeStamp& _ts, + const SensorBasePtr& _sensor_ptr, + const Eigen::VectorXs& _positions, + const Eigen::MatrixXs& _positions_cov, + FrameBasePtr _origin_frame_ptr, + StateBlockPtr _p_ptr = nullptr, + StateBlockPtr _o_ptr = nullptr, + StateBlockPtr _intr_ptr = nullptr); + + virtual ~CaptureWheelJointPosition() = default; + + virtual VectorXs correctDelta(const VectorXs& _delta, + const VectorXs& _delta_error) override; + + const Eigen::VectorXs& getPositions() const; + + const Eigen::MatrixXs& getPositionsCov() const; + +protected: + + Eigen::VectorXs positions_; + Eigen::MatrixXs positions_cov_; +}; + + +/// @todo Enforce some logic on the wheel joint pos data + +//template <typename E> +//constexpr typename std::underlying_type<E>::type val(E&& e) noexcept +//{ +// return static_cast<typename std::underlying_type<E>::type>(std::forward<E>(e)); +//} + +//template <std::size_t N> +//struct NumWheelTraits +//{ +// static constexpr std::size_t num_wheel = N; + +// struct Positions +// { +// using data_t = Eigen::Matrix<Scalar, num_wheel, 1>; +// }; +//}; + +//template <typename Derived> +//struct MobileBaseControllerTraits +//{ +// using controller_t = Derived; + +// static constexpr decltype(Derived::num_wheel) num_wheel = Derived::num_wheel; + +// using wheel_index_t = typename Derived::WheelsIndexes; + +// MobileBaseControllerTraits() +// { +// static_assert(true, ""); +// } +//}; + +//struct DiffDriveController : NumWheelTraits<2> +//{ +// enum class WheelsIndexes : std::size_t +// { +// Left = 0, +// Right = 1 +// }; + +// class Positions +// { +// Eigen::Matrix<Scalar, num_wheel, 1> values_; + +// public: + +// Positions(const Scalar left_wheel_value, +// const Scalar rigth_wheel_value) : +// values_(Eigen::Matrix<Scalar, num_wheel, 1>(left_wheel_value, rigth_wheel_value)) +// { } +// }; +//}; + +//struct DiffDriveFourWheelsController : NumWheelTraits<4> +//{ +// enum class WheelsIndexes : std::size_t +// { +// Front_Left = 0, +// Front_Right = 1, +// Rear_Left = 2, +// Rear_Right = 3 +// }; +//}; + +///** +// * @brief The CaptureWheelJointPosition class +// * +// * Represents a list of wheel positions. +// */ +//template <typename ControllerType> +//class CaptureWheelJointPosition final : +// public CaptureBase, MobileBaseControllerTraits<ControllerType> +//{ +//public: + +// using MobileBaseControllerTraits<ControllerType>::controller_t; +// using typename MobileBaseControllerTraits<ControllerType>::wheel_index_t; +// using MobileBaseControllerTraits<ControllerType>::num_wheel; + +// /** +// * \brief Constructor with ranges +// **/ +// CaptureWheelJointPosition(const TimeStamp& _ts, +// const SensorBasePtr& _sensor_ptr, +// const Eigen::Matrix<Scalar, num_wheel, 1>& _positions) : +// CaptureBase("WHEELS POSITION", _ts, _sensor_ptr), +// positions_(_positions) +// { +// // +// } + +// ~CaptureWheelJointPosition() = default; + +//// void setSensorPtr(const SensorBasePtr sensor_ptr) override; + +// std::size_t getNumWheels() const noexcept +// { +// return num_wheel; +// } + +// template <wheel_index_t wheel_index> +// const Scalar& getPosition() const +// { +// return positions_(val(wheel_index)); +// } + +//protected: + +// Eigen::Matrix<Scalar, num_wheel, 1> positions_; + +// //SensorLaser2DPtr laser_ptr_; //specific pointer to sensor laser 2D object +//}; + +//using CaptureDiffDriveWheelJointPosition = wolf::CaptureWheelJointPosition<wolf::DiffDriveController>; + + +} // namespace wolf + +#endif /* CAPTURE_WHEEL_JOINT_POSITION_H_ */