Remove robotis_math
robotis_math is moved to ROBOTIS_Math repository
This commit is contained in:
@ -1,42 +0,0 @@
|
||||
cmake_minimum_required(VERSION 2.8.3)
|
||||
project(robotis_math)
|
||||
|
||||
find_package(catkin REQUIRED COMPONENTS
|
||||
roscpp
|
||||
cmake_modules
|
||||
)
|
||||
|
||||
find_package(Eigen REQUIRED)
|
||||
|
||||
###################################
|
||||
## catkin specific configuration ##
|
||||
###################################
|
||||
|
||||
catkin_package(
|
||||
INCLUDE_DIRS include
|
||||
LIBRARIES robotis_math
|
||||
CATKIN_DEPENDS roscpp
|
||||
# DEPENDS system_lib
|
||||
)
|
||||
|
||||
###########
|
||||
## Build ##
|
||||
###########
|
||||
|
||||
include_directories(
|
||||
include
|
||||
${catkin_INCLUDE_DIRS}
|
||||
${Eigen_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
add_library(robotis_math
|
||||
src/robotis_math_base.cpp
|
||||
src/robotis_trajectory_calculator.cpp
|
||||
src/robotis_linear_algebra.cpp
|
||||
)
|
||||
|
||||
add_dependencies(robotis_math ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
|
||||
|
||||
target_link_libraries(robotis_math
|
||||
${catkin_LIBRARIES}
|
||||
)
|
@ -1,81 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2016, ROBOTIS CO., LTD.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of ROBOTIS nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*******************************************************************************/
|
||||
|
||||
/*
|
||||
* robotis_linear_algebra.h
|
||||
*
|
||||
* Created on: June 7, 2016
|
||||
* Author: sch
|
||||
*/
|
||||
|
||||
#ifndef ROBOTIS_MATH_ROBOTIS_LINEAR_ALGEBRA_H_
|
||||
#define ROBOTIS_MATH_ROBOTIS_LINEAR_ALGEBRA_H_
|
||||
|
||||
#include <cmath>
|
||||
|
||||
#define EIGEN_NO_DEBUG
|
||||
#define EIGEN_NO_STATIC_ASSERT
|
||||
|
||||
#include <Eigen/Dense>
|
||||
#include "step_data_define.h"
|
||||
|
||||
namespace robotis_framework
|
||||
{
|
||||
|
||||
Eigen::MatrixXd getTransitionXYZ(double position_x, double position_y, double position_z);
|
||||
Eigen::MatrixXd getTransformationXYZRPY(double position_x, double position_y, double position_z , double roll, double pitch, double yaw);
|
||||
Eigen::MatrixXd getInverseTransformation(Eigen::MatrixXd transform);
|
||||
Eigen::MatrixXd getInertiaXYZ(double ixx, double ixy, double ixz , double iyy , double iyz, double izz);
|
||||
Eigen::MatrixXd getRotationX(double angle);
|
||||
Eigen::MatrixXd getRotationY(double angle);
|
||||
Eigen::MatrixXd getRotationZ(double angle);
|
||||
Eigen::MatrixXd getRotation4d(double roll, double pitch, double yaw);
|
||||
Eigen::MatrixXd getTranslation4D(double position_x, double position_y, double position_z);
|
||||
|
||||
Eigen::MatrixXd convertRotationToRPY(Eigen::MatrixXd rotation);
|
||||
Eigen::MatrixXd convertRPYToRotation(double roll, double pitch, double yaw);
|
||||
Eigen::Quaterniond convertRPYToQuaternion(double roll, double pitch, double yaw);
|
||||
Eigen::Quaterniond convertRotationToQuaternion(Eigen::MatrixXd rotation);
|
||||
Eigen::MatrixXd convertQuaternionToRPY(Eigen::Quaterniond quaternion);
|
||||
Eigen::MatrixXd convertQuaternionToRotation(Eigen::Quaterniond quaternion);
|
||||
|
||||
Eigen::MatrixXd calcHatto(Eigen::MatrixXd matrix3d);
|
||||
Eigen::MatrixXd calcRodrigues(Eigen::MatrixXd hat_matrix, double angle);
|
||||
Eigen::MatrixXd convertRotToOmega(Eigen::MatrixXd rotation);
|
||||
Eigen::MatrixXd calcCross(Eigen::MatrixXd vector3d_a, Eigen::MatrixXd vector3d_b);
|
||||
double calcInner(Eigen::MatrixXd vector3d_a, Eigen::MatrixXd vector3d_b);
|
||||
|
||||
Pose3D getPose3DfromTransformMatrix(Eigen::MatrixXd transform);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif /* ROBOTIS_MATH_ROBOTIS_LINEAR_ALGEBRA_H_ */
|
@ -1,43 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2016, ROBOTIS CO., LTD.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of ROBOTIS nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*******************************************************************************/
|
||||
|
||||
/*
|
||||
* robotis_math.h
|
||||
*
|
||||
* Created on: June 7, 2016
|
||||
* Author: sch
|
||||
*/
|
||||
|
||||
#ifndef ROBOTIS_MATH_ROBOTIS_MATH_H_
|
||||
#define ROBOTIS_MATH_ROBOTIS_MATH_H_
|
||||
|
||||
#include "robotis_trajectory_calculator.h"
|
||||
|
||||
#endif /* ROBOTIS_MATH_ROBOTIS_MATH_H_ */
|
@ -1,63 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2016, ROBOTIS CO., LTD.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of ROBOTIS nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*******************************************************************************/
|
||||
|
||||
/*
|
||||
* robotis_math_base.h
|
||||
*
|
||||
* Created on: June 7, 2016
|
||||
* Author: sch
|
||||
*/
|
||||
|
||||
#ifndef ROBOTIS_MATH_ROBOTIS_MATH_BASE_H_
|
||||
#define ROBOTIS_MATH_ROBOTIS_MATH_BASE_H_
|
||||
|
||||
#include <cmath>
|
||||
|
||||
namespace robotis_framework
|
||||
{
|
||||
|
||||
#define PRINT_VAR(X) std::cout << #X << " : " << X << std::endl
|
||||
#define PRINT_MAT(X) std::cout << #X << ":\n" << X << std::endl << std::endl
|
||||
|
||||
#define DEGREE2RADIAN (M_PI / 180.0)
|
||||
#define RADIAN2DEGREE (180.0 / M_PI)
|
||||
|
||||
inline double powDI(double a, int b)
|
||||
{
|
||||
return (b == 0 ? 1 : (b > 0 ? a * powDI(a, b - 1) : 1 / powDI(a, -b)));
|
||||
}
|
||||
|
||||
double sign(double x);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif /* ROBOTIS_MATH_ROBOTIS_MATH_BASE_H_ */
|
@ -1,113 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2016, ROBOTIS CO., LTD.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of ROBOTIS nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*******************************************************************************/
|
||||
|
||||
/*
|
||||
* robotis_trajectory_calculator.h
|
||||
*
|
||||
* Created on: June 7, 2016
|
||||
* Author: sch
|
||||
*/
|
||||
|
||||
#ifndef ROBOTIS_MATH_ROBOTIS_TRAJECTORY_CALCULATOR_H_
|
||||
#define ROBOTIS_MATH_ROBOTIS_TRAJECTORY_CALCULATOR_H_
|
||||
|
||||
#include "robotis_linear_algebra.h"
|
||||
#include "robotis_math_base.h"
|
||||
|
||||
// minimum jerk trajectory
|
||||
|
||||
namespace robotis_framework
|
||||
{
|
||||
|
||||
Eigen::MatrixXd calcMinimumJerkTra(double pos_start, double vel_start, double accel_start,
|
||||
double pos_end, double vel_end, double accel_end,
|
||||
double smp_time, double mov_time);
|
||||
|
||||
Eigen::MatrixXd calcMinimumJerkTraPlus(double pos_start, double vel_start, double accel_start,
|
||||
double pos_end, double vel_end, double accel_end,
|
||||
double smp_time, double mov_time);
|
||||
|
||||
Eigen::MatrixXd calcMinimumJerkTraWithViaPoints(int via_num,
|
||||
double pos_start, double vel_start, double accel_start,
|
||||
Eigen::MatrixXd pos_via, Eigen::MatrixXd vel_via, Eigen::MatrixXd accel_via,
|
||||
double pos_end, double vel_end, double accel_end,
|
||||
double smp_time, Eigen::MatrixXd via_time, double mov_time);
|
||||
|
||||
Eigen::MatrixXd calcArc3dTra(double smp_time, double mov_time,
|
||||
Eigen::MatrixXd center_point, Eigen::MatrixXd normal_vector, Eigen::MatrixXd start_point,
|
||||
double rotation_angle, double cross_ratio);
|
||||
|
||||
|
||||
class FifthOrderPolynomialTrajectory
|
||||
{
|
||||
public:
|
||||
FifthOrderPolynomialTrajectory(double initial_time, double initial_pos, double initial_vel, double initial_acc,
|
||||
double final_time, double final_pos, double final_vel, double final_acc);
|
||||
FifthOrderPolynomialTrajectory();
|
||||
~FifthOrderPolynomialTrajectory();
|
||||
|
||||
bool changeTrajectory(double final_pos, double final_vel, double final_acc);
|
||||
bool changeTrajectory(double final_time, double final_pos, double final_vel, double final_acc);
|
||||
bool changeTrajectory(double initial_time, double initial_pos, double initial_vel, double initial_acc,
|
||||
double final_time, double final_pos, double final_vel, double final_acc);
|
||||
|
||||
double getPosition(double time);
|
||||
double getVelocity(double time);
|
||||
double getAcceleration(double time);
|
||||
|
||||
void setTime(double time);
|
||||
double getPosition();
|
||||
double getVelocity();
|
||||
double getAcceleration();
|
||||
|
||||
double initial_time_;
|
||||
double initial_pos_;
|
||||
double initial_vel_;
|
||||
double initial_acc_;
|
||||
|
||||
double current_time_;
|
||||
double current_pos_;
|
||||
double current_vel_;
|
||||
double current_acc_;
|
||||
|
||||
double final_time_;
|
||||
double final_pos_;
|
||||
double final_vel_;
|
||||
double final_acc_;
|
||||
|
||||
Eigen::MatrixXd position_coeff_;
|
||||
Eigen::MatrixXd velocity_coeff_;
|
||||
Eigen::MatrixXd acceleration_coeff_;
|
||||
Eigen::MatrixXd time_variables_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif /* ROBOTIS_MATH_ROBOTIS_TRAJECTORY_CALCULATOR_H_ */
|
@ -1,83 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2016, ROBOTIS CO., LTD.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of ROBOTIS nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*******************************************************************************/
|
||||
|
||||
/*
|
||||
* step_data_define.h
|
||||
*
|
||||
* Created on: 2016. 8. 10.
|
||||
* Author: Jay Song
|
||||
*/
|
||||
|
||||
#ifndef ROBOTIS_MATH_STEP_DATA_DEFINE_H_
|
||||
#define ROBOTIS_MATH_STEP_DATA_DEFINE_H_
|
||||
|
||||
namespace robotis_framework
|
||||
{
|
||||
|
||||
typedef struct
|
||||
{
|
||||
double x, y, z;
|
||||
} Position3D;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
double x, y, z, roll, pitch, yaw;
|
||||
} Pose3D;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int moving_foot;
|
||||
double foot_z_swap, body_z_swap;
|
||||
double shoulder_swing_gain, elbow_swing_gain;
|
||||
double waist_roll_angle, waist_pitch_angle, waist_yaw_angle;
|
||||
Pose3D left_foot_pose;
|
||||
Pose3D right_foot_pose;
|
||||
Pose3D body_pose;
|
||||
} StepPositionData;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int walking_state;
|
||||
double abs_step_time, dsp_ratio;
|
||||
double start_time_delay_ratio_x, start_time_delay_ratio_y, start_time_delay_ratio_z;
|
||||
double start_time_delay_ratio_roll, start_time_delay_ratio_pitch, start_time_delay_ratio_yaw;
|
||||
double finish_time_advance_ratio_x, finish_time_advance_ratio_y, finish_time_advance_ratio_z;
|
||||
double finish_time_advance_ratio_roll, finish_time_advance_ratio_pitch, finish_time_advance_ratio_yaw;
|
||||
} StepTimeData;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
StepPositionData position_data;
|
||||
StepTimeData time_data;
|
||||
} StepData;
|
||||
|
||||
}
|
||||
|
||||
#endif /* ROBOTIS_MATH_STEP_DATA_DEFINE_H_ */
|
@ -1,19 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<package>
|
||||
<name>robotis_math</name>
|
||||
<version>0.0.0</version>
|
||||
<description>The robotis_math package</description>
|
||||
|
||||
<maintainer email="sch@robotis.com">sch</maintainer>
|
||||
<license>BSD</license>
|
||||
|
||||
<author email="sch@robotis.com">sch</author>
|
||||
|
||||
<buildtool_depend>catkin</buildtool_depend>
|
||||
<build_depend>roscpp</build_depend>
|
||||
<build_depend>cmake_modules</build_depend>
|
||||
|
||||
<run_depend>roscpp</run_depend>
|
||||
<run_depend>cmake_modules</run_depend>
|
||||
|
||||
</package>
|
@ -1,322 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2016, ROBOTIS CO., LTD.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of ROBOTIS nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*******************************************************************************/
|
||||
|
||||
/*
|
||||
* robotis_linear_algebra.cpp
|
||||
*
|
||||
* Created on: June 7, 2016
|
||||
* Author: sch
|
||||
*/
|
||||
|
||||
#include "robotis_math/robotis_linear_algebra.h"
|
||||
|
||||
namespace robotis_framework
|
||||
{
|
||||
|
||||
Eigen::MatrixXd getTransitionXYZ(double position_x, double position_y, double position_z)
|
||||
{
|
||||
Eigen::MatrixXd position(3,1);
|
||||
|
||||
position <<
|
||||
position_x,
|
||||
position_y,
|
||||
position_z;
|
||||
|
||||
return position;
|
||||
}
|
||||
|
||||
Eigen::MatrixXd getTransformationXYZRPY(double position_x, double position_y, double position_z , double roll , double pitch , double yaw)
|
||||
{
|
||||
Eigen::MatrixXd transformation = getRotation4d(roll, pitch, yaw);
|
||||
transformation.coeffRef(0,3) = position_x;
|
||||
transformation.coeffRef(1,3) = position_y;
|
||||
transformation.coeffRef(2,3) = position_z;
|
||||
|
||||
return transformation;
|
||||
}
|
||||
|
||||
Eigen::MatrixXd getInverseTransformation(Eigen::MatrixXd transform)
|
||||
{
|
||||
// If T is Transform Matrix A from B, the BOA is translation component coordi. B to coordi. A
|
||||
|
||||
Eigen::Vector3d vec_boa;
|
||||
Eigen::Vector3d vec_x, vec_y, vec_z;
|
||||
Eigen::MatrixXd inv_t(4,4);
|
||||
|
||||
vec_boa(0) = -transform(0,3);
|
||||
vec_boa(1) = -transform(1,3);
|
||||
vec_boa(2) = -transform(2,3);
|
||||
|
||||
vec_x(0) = transform(0,0); vec_x(1) = transform(1,0); vec_x(2) = transform(2,0);
|
||||
vec_y(0) = transform(0,1); vec_y(1) = transform(1,1); vec_y(2) = transform(2,1);
|
||||
vec_z(0) = transform(0,2); vec_z(1) = transform(1,2); vec_z(2) = transform(2,2);
|
||||
|
||||
inv_t <<
|
||||
vec_x(0), vec_x(1), vec_x(2), vec_boa.dot(vec_x),
|
||||
vec_y(0), vec_y(1), vec_y(2), vec_boa.dot(vec_y),
|
||||
vec_z(0), vec_z(1), vec_z(2), vec_boa.dot(vec_z),
|
||||
0, 0, 0, 1;
|
||||
|
||||
return inv_t;
|
||||
}
|
||||
|
||||
Eigen::MatrixXd getInertiaXYZ(double ixx, double ixy, double ixz , double iyy , double iyz, double izz)
|
||||
{
|
||||
Eigen::MatrixXd inertia(3,3);
|
||||
|
||||
inertia <<
|
||||
ixx, ixy, ixz,
|
||||
ixy, iyy, iyz,
|
||||
ixz, iyz, izz;
|
||||
|
||||
return inertia;
|
||||
}
|
||||
|
||||
Eigen::MatrixXd getRotationX(double angle)
|
||||
{
|
||||
Eigen::MatrixXd rotation(3,3);
|
||||
|
||||
rotation <<
|
||||
1.0, 0.0, 0.0,
|
||||
0.0, cos(angle), -sin(angle),
|
||||
0.0, sin(angle), cos(angle);
|
||||
|
||||
return rotation;
|
||||
}
|
||||
|
||||
Eigen::MatrixXd getRotationY(double angle)
|
||||
{
|
||||
Eigen::MatrixXd rotation(3,3);
|
||||
|
||||
rotation <<
|
||||
cos(angle), 0.0, sin(angle),
|
||||
0.0, 1.0, 0.0,
|
||||
-sin(angle), 0.0, cos(angle);
|
||||
|
||||
return rotation;
|
||||
}
|
||||
|
||||
Eigen::MatrixXd getRotationZ(double angle)
|
||||
{
|
||||
Eigen::MatrixXd rotation(3,3);
|
||||
|
||||
rotation <<
|
||||
cos(angle), -sin(angle), 0.0,
|
||||
sin(angle), cos(angle), 0.0,
|
||||
0.0, 0.0, 1.0;
|
||||
|
||||
return rotation;
|
||||
}
|
||||
|
||||
Eigen::MatrixXd getRotation4d(double roll, double pitch, double yaw )
|
||||
{
|
||||
double sr = sin(roll), cr = cos(roll);
|
||||
double sp = sin(pitch), cp = cos(pitch);
|
||||
double sy = sin(yaw), cy = cos(yaw);
|
||||
|
||||
Eigen::MatrixXd mat_roll(4,4);
|
||||
Eigen::MatrixXd mat_pitch(4,4);
|
||||
Eigen::MatrixXd mat_yaw(4,4);
|
||||
|
||||
mat_roll <<
|
||||
1, 0, 0, 0,
|
||||
0, cr, -sr, 0,
|
||||
0, sr, cr, 0,
|
||||
0, 0, 0, 1;
|
||||
|
||||
mat_pitch <<
|
||||
cp, 0, sp, 0,
|
||||
0, 1, 0, 0,
|
||||
-sp, 0, cp, 0,
|
||||
0, 0, 0, 1;
|
||||
|
||||
mat_yaw <<
|
||||
cy, -sy, 0, 0,
|
||||
sy, cy, 0, 0,
|
||||
0, 0, 1, 0,
|
||||
0, 0, 0, 1;
|
||||
|
||||
Eigen::MatrixXd mat_rpy = (mat_yaw*mat_pitch)*mat_roll;
|
||||
|
||||
return mat_rpy;
|
||||
}
|
||||
|
||||
Eigen::MatrixXd getTranslation4D(double position_x, double position_y, double position_z)
|
||||
{
|
||||
Eigen::MatrixXd mat_translation(4,4);
|
||||
|
||||
mat_translation <<
|
||||
1, 0, 0, position_x,
|
||||
0, 1, 0, position_y,
|
||||
0, 0, 1, position_z,
|
||||
0, 0, 0, 1;
|
||||
|
||||
return mat_translation;
|
||||
}
|
||||
|
||||
Eigen::MatrixXd convertRotationToRPY(Eigen::MatrixXd rotation)
|
||||
{
|
||||
Eigen::MatrixXd rpy = Eigen::MatrixXd::Zero(3,1);
|
||||
|
||||
rpy.coeffRef(0,0) = atan2(rotation.coeff(2,1), rotation.coeff(2,2));
|
||||
rpy.coeffRef(1,0) = atan2(-rotation.coeff(2,0), sqrt(pow(rotation.coeff(2,1), 2) + pow(rotation.coeff(2,2),2)));
|
||||
rpy.coeffRef(2,0) = atan2 (rotation.coeff(1,0), rotation.coeff(0,0));
|
||||
|
||||
return rpy;
|
||||
}
|
||||
|
||||
Eigen::MatrixXd convertRPYToRotation(double roll, double pitch, double yaw)
|
||||
{
|
||||
Eigen::MatrixXd rotation = getRotationZ(yaw)*getRotationY(pitch)*getRotationX(roll);
|
||||
|
||||
return rotation;
|
||||
}
|
||||
|
||||
Eigen::Quaterniond convertRPYToQuaternion(double roll, double pitch, double yaw)
|
||||
{
|
||||
Eigen::MatrixXd rotation = convertRPYToRotation(roll,pitch,yaw);
|
||||
|
||||
Eigen::Matrix3d rotation3d;
|
||||
rotation3d = rotation.block<3,3>(0,0);
|
||||
|
||||
Eigen::Quaterniond quaternion;
|
||||
quaternion = rotation3d;
|
||||
|
||||
return quaternion;
|
||||
}
|
||||
|
||||
Eigen::Quaterniond convertRotationToQuaternion(Eigen::MatrixXd rotation)
|
||||
{
|
||||
Eigen::Matrix3d rotation3d;
|
||||
rotation3d = rotation.block<3,3>(0,0);
|
||||
|
||||
Eigen::Quaterniond quaternion;
|
||||
quaternion = rotation3d;
|
||||
|
||||
return quaternion;
|
||||
}
|
||||
|
||||
Eigen::MatrixXd convertQuaternionToRPY(Eigen::Quaterniond quaternion)
|
||||
{
|
||||
Eigen::MatrixXd rpy = convertRotationToRPY(quaternion.toRotationMatrix());
|
||||
|
||||
return rpy;
|
||||
}
|
||||
|
||||
Eigen::MatrixXd convertQuaternionToRotation(Eigen::Quaterniond quaternion)
|
||||
{
|
||||
Eigen::MatrixXd rotation = quaternion.toRotationMatrix();
|
||||
|
||||
return rotation;
|
||||
}
|
||||
|
||||
Eigen::MatrixXd calcHatto(Eigen::MatrixXd matrix3d)
|
||||
{
|
||||
Eigen::MatrixXd hatto(3,3);
|
||||
|
||||
hatto <<
|
||||
0.0, -matrix3d.coeff(2,0), matrix3d.coeff(1,0),
|
||||
matrix3d.coeff(2,0), 0.0, -matrix3d.coeff(0,0),
|
||||
-matrix3d.coeff(1,0), matrix3d.coeff(0,0), 0.0;
|
||||
|
||||
return hatto;
|
||||
}
|
||||
|
||||
Eigen::MatrixXd calcRodrigues(Eigen::MatrixXd hat_matrix, double angle)
|
||||
{
|
||||
Eigen::MatrixXd identity = Eigen::MatrixXd::Identity(3,3);
|
||||
Eigen::MatrixXd rodrigues = identity+hat_matrix*sin(angle)+hat_matrix*hat_matrix*(1-cos(angle));
|
||||
|
||||
return rodrigues;
|
||||
}
|
||||
|
||||
Eigen::MatrixXd convertRotToOmega(Eigen::MatrixXd rotation)
|
||||
{
|
||||
double eps = 1e-12;
|
||||
|
||||
double alpha = (rotation.coeff(0,0)+rotation.coeff(1,1)+rotation.coeff(2,2)-1.0)/2.0;
|
||||
double alpha_dash = fabs( alpha - 1.0 );
|
||||
|
||||
Eigen::MatrixXd rot_to_omega(3,1);
|
||||
|
||||
if( alpha_dash < eps )
|
||||
{
|
||||
rot_to_omega <<
|
||||
0.0,
|
||||
0.0,
|
||||
0.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
double theta = acos(alpha);
|
||||
|
||||
rot_to_omega <<
|
||||
rotation.coeff(2,1)-rotation.coeff(1,2),
|
||||
rotation.coeff(0,2)-rotation.coeff(2,0),
|
||||
rotation.coeff(1,0)-rotation.coeff(0,1);
|
||||
|
||||
rot_to_omega = 0.5*(theta/sin(theta))*rot_to_omega;
|
||||
}
|
||||
|
||||
return rot_to_omega;
|
||||
}
|
||||
|
||||
Eigen::MatrixXd calcCross(Eigen::MatrixXd vector3d_a, Eigen::MatrixXd vector3d_b)
|
||||
{
|
||||
Eigen::MatrixXd cross(3,1);
|
||||
|
||||
cross <<
|
||||
vector3d_a.coeff(1,0)*vector3d_b.coeff(2,0)-vector3d_a.coeff(2,0)*vector3d_b.coeff(1,0),
|
||||
vector3d_a.coeff(2,0)*vector3d_b.coeff(0,0)-vector3d_a.coeff(0,0)*vector3d_b.coeff(2,0),
|
||||
vector3d_a.coeff(0,0)*vector3d_b.coeff(1,0)-vector3d_a.coeff(1,0)*vector3d_b.coeff(0,0);
|
||||
|
||||
return cross;
|
||||
}
|
||||
|
||||
double calcInner(Eigen::MatrixXd vector3d_a, Eigen::MatrixXd vector3d_b)
|
||||
{
|
||||
return vector3d_a.dot(vector3d_b);
|
||||
}
|
||||
|
||||
Pose3D getPose3DfromTransformMatrix(Eigen::MatrixXd transform)
|
||||
{
|
||||
Pose3D pose_3d;
|
||||
|
||||
pose_3d.x = transform.coeff(0, 3);
|
||||
pose_3d.y = transform.coeff(1, 3);
|
||||
pose_3d.z = transform.coeff(2, 3);
|
||||
pose_3d.roll = atan2( transform.coeff(2,1), transform.coeff(2,2));
|
||||
pose_3d.pitch = atan2(-transform.coeff(2,0), sqrt(transform.coeff(2,1)*transform.coeff(2,1) + transform.coeff(2,2)*transform.coeff(2,2)) );
|
||||
pose_3d.yaw = atan2( transform.coeff(1,0), transform.coeff(0,0));
|
||||
|
||||
return pose_3d;
|
||||
}
|
||||
|
||||
}
|
@ -1,53 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2016, ROBOTIS CO., LTD.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of ROBOTIS nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*******************************************************************************/
|
||||
|
||||
/*
|
||||
* robotis_math_base.cpp
|
||||
*
|
||||
* Created on: June 7, 2016
|
||||
* Author: sch
|
||||
*/
|
||||
|
||||
#include "robotis_math/robotis_math_base.h"
|
||||
|
||||
namespace robotis_framework
|
||||
{
|
||||
|
||||
double sign(double x)
|
||||
{
|
||||
if ( x < 0.0 )
|
||||
return -1.0;
|
||||
else if ( x > 0.0)
|
||||
return 1.0;
|
||||
else
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
}
|
@ -1,689 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2016, ROBOTIS CO., LTD.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of ROBOTIS nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*******************************************************************************/
|
||||
|
||||
/*
|
||||
* robotis_trajectory_calculator.cpp
|
||||
*
|
||||
* Created on: June 7, 2016
|
||||
* Author: sch
|
||||
*/
|
||||
|
||||
#include "robotis_math/robotis_trajectory_calculator.h"
|
||||
|
||||
namespace robotis_framework
|
||||
{
|
||||
|
||||
Eigen::MatrixXd calcMinimumJerkTra(
|
||||
double pos_start, double vel_start, double accel_start,
|
||||
double pos_end, double vel_end, double accel_end,
|
||||
double smp_time, double mov_time
|
||||
)
|
||||
/*
|
||||
simple minimum jerk trajectory
|
||||
|
||||
pos_start : position at initial state
|
||||
vel_start : velocity at initial state
|
||||
accel_start : acceleration at initial state
|
||||
|
||||
pos_end : position at final state
|
||||
vel_end : velocity at final state
|
||||
accel_end : acceleration at final state
|
||||
|
||||
smp_time : sampling time
|
||||
mov_time : movement time
|
||||
*/
|
||||
|
||||
{
|
||||
Eigen::MatrixXd poly_matrix(3,3);
|
||||
Eigen::MatrixXd poly_vector(3,1);
|
||||
|
||||
poly_matrix <<
|
||||
pow(mov_time,3), pow(mov_time,4), pow(mov_time,5),
|
||||
3*pow(mov_time,2), 4*pow(mov_time,3), 5*pow(mov_time,4),
|
||||
6*mov_time, 12*pow(mov_time,2), 20*pow(mov_time,3);
|
||||
|
||||
poly_vector <<
|
||||
pos_end-pos_start-vel_start*mov_time-accel_start*pow(mov_time,2)/2,
|
||||
vel_end-vel_start-accel_start*mov_time,
|
||||
accel_end-accel_start ;
|
||||
|
||||
Eigen::Matrix<double,3,1> poly_coeff = poly_matrix.inverse() * poly_vector;
|
||||
|
||||
double time_steps = mov_time/smp_time;
|
||||
int all_time_steps = round(time_steps+1);
|
||||
|
||||
Eigen::MatrixXd time = Eigen::MatrixXd::Zero(all_time_steps,1);
|
||||
Eigen::MatrixXd minimum_jerk_tra = Eigen::MatrixXd::Zero(all_time_steps,1);
|
||||
|
||||
for (int step=0; step<all_time_steps; step++)
|
||||
time.coeffRef(step,0) = step*smp_time;
|
||||
|
||||
for (int step=0; step<all_time_steps; step++)
|
||||
{
|
||||
minimum_jerk_tra.coeffRef( step , 0 ) =
|
||||
pos_start +
|
||||
vel_start*time.coeff(step,0) +
|
||||
0.5*accel_start*pow(time.coeff(step,0),2) +
|
||||
poly_coeff.coeff(0,0)*pow(time.coeff(step,0),3) +
|
||||
poly_coeff.coeff(1,0)*pow(time.coeff(step,0),4) +
|
||||
poly_coeff.coeff(2,0)*pow(time.coeff(step,0),5);
|
||||
}
|
||||
|
||||
return minimum_jerk_tra;
|
||||
}
|
||||
|
||||
Eigen::MatrixXd calcMinimumJerkTraPlus(
|
||||
double pos_start, double vel_start, double accel_start,
|
||||
double pos_end, double vel_end, double accel_end,
|
||||
double smp_time, double mov_time
|
||||
)
|
||||
/*
|
||||
simple minimum jerk trajectory
|
||||
|
||||
pos_start : position at initial state
|
||||
vel_start : velocity at initial state
|
||||
accel_start : acceleration at initial state
|
||||
|
||||
pos_end : position at final state
|
||||
vel_end : velocity at final state
|
||||
accel_end : acceleration at final state
|
||||
|
||||
smp_time : sampling time
|
||||
mov_time : movement time
|
||||
*/
|
||||
|
||||
{
|
||||
Eigen::MatrixXd poly_matrix(3,3);
|
||||
Eigen::MatrixXd poly_vector(3,1);
|
||||
|
||||
poly_matrix <<
|
||||
pow(mov_time,3), pow(mov_time,4), pow(mov_time,5),
|
||||
3*pow(mov_time,2), 4*pow(mov_time,3), 5*pow(mov_time,4),
|
||||
6*mov_time, 12*pow(mov_time,2), 20*pow(mov_time,3);
|
||||
|
||||
poly_vector <<
|
||||
pos_end-pos_start-vel_start*mov_time-accel_start*pow(mov_time,2)/2,
|
||||
vel_end-vel_start-accel_start*mov_time,
|
||||
accel_end-accel_start ;
|
||||
|
||||
Eigen::Matrix<double,3,1> poly_coeff = poly_matrix.inverse() * poly_vector;
|
||||
|
||||
double time_steps = mov_time/smp_time;
|
||||
int all_time_steps = round(time_steps+1);
|
||||
|
||||
Eigen::MatrixXd time = Eigen::MatrixXd::Zero(all_time_steps,1);
|
||||
Eigen::MatrixXd minimum_jerk_tra = Eigen::MatrixXd::Zero(all_time_steps,3);
|
||||
|
||||
for (int step=0; step<all_time_steps; step++)
|
||||
time.coeffRef(step,0) = step*smp_time;
|
||||
|
||||
for (int step=0; step<all_time_steps; step++)
|
||||
{
|
||||
minimum_jerk_tra.coeffRef( step , 0 ) =
|
||||
pos_start +
|
||||
vel_start*time.coeff(step,0) +
|
||||
0.5*accel_start*pow(time.coeff(step,0),2) +
|
||||
poly_coeff.coeff(0,0)*pow(time.coeff(step,0),3) +
|
||||
poly_coeff.coeff(1,0)*pow(time.coeff(step,0),4) +
|
||||
poly_coeff.coeff(2,0)*pow(time.coeff(step,0),5);
|
||||
|
||||
minimum_jerk_tra.coeffRef( step , 1 ) =
|
||||
vel_start +
|
||||
accel_start*time.coeff(step,0) +
|
||||
3*poly_coeff.coeff(0,0)*pow(time.coeff(step,0),2) +
|
||||
4*poly_coeff.coeff(1,0)*pow(time.coeff(step,0),3) +
|
||||
5*poly_coeff.coeff(2,0)*pow(time.coeff(step,0),4);
|
||||
|
||||
minimum_jerk_tra.coeffRef( step , 2 ) =
|
||||
accel_start +
|
||||
6*poly_coeff.coeff(0,0)*time.coeff(step,0) +
|
||||
12*poly_coeff.coeff(1,0)*pow(time.coeff(step,0),2) +
|
||||
20*poly_coeff.coeff(2,0)*pow(time.coeff(step,0),3);
|
||||
}
|
||||
|
||||
return minimum_jerk_tra;
|
||||
}
|
||||
|
||||
Eigen::MatrixXd calcMinimumJerkTraWithViaPoints(int via_num,
|
||||
double pos_start, double vel_start, double accel_start,
|
||||
Eigen::MatrixXd pos_via, Eigen::MatrixXd vel_via, Eigen::MatrixXd accel_via,
|
||||
double pos_end, double vel_end, double accel_end,
|
||||
double smp_time, Eigen::MatrixXd via_time, double mov_time )
|
||||
/*
|
||||
minimum jerk trajectory with via-points
|
||||
(via-point constraints: position and velocity at each point)
|
||||
|
||||
via_num : the number of via-points
|
||||
|
||||
pos_start : position at initial state
|
||||
vel_start : velocity at initial state
|
||||
accel_start : acceleration at initial state
|
||||
|
||||
pos_via : position matrix at via-points state ( size : n x 1 )
|
||||
vel_via : velocity matrix at via-points state ( size : n x 1 )
|
||||
accel_via : acceleration matrix at via-points state ( size : n x 1 )
|
||||
|
||||
pos_end : position at final state
|
||||
vel_end : velocity at final state
|
||||
accel_end : acceleration at final state
|
||||
|
||||
smp_time : sampling time
|
||||
|
||||
via_time : time matrix passing through via-points state ( size : n x 1 )
|
||||
via_time : movement time
|
||||
*/
|
||||
|
||||
{
|
||||
// int i,j,k ;
|
||||
|
||||
Eigen::MatrixXd poly_vector = Eigen::MatrixXd::Zero(3*via_num+3,1);
|
||||
|
||||
for (int i=1; i<=via_num; i++)
|
||||
{
|
||||
poly_vector.coeffRef(3*i-3,0) =
|
||||
pos_via.coeff(i-1,0) -
|
||||
pos_start -
|
||||
vel_start*via_time.coeff(i-1,0) -
|
||||
(accel_start/2)*pow(via_time.coeff(i-1,0),2) ;
|
||||
|
||||
poly_vector.coeffRef(3*i-2,0) =
|
||||
vel_via.coeff(i-1,0) -
|
||||
vel_start -
|
||||
accel_start*via_time.coeff(i-1,0) ;
|
||||
|
||||
poly_vector.coeffRef(3*i-1,0) =
|
||||
accel_via.coeff(i-1,0) -
|
||||
accel_start;
|
||||
}
|
||||
|
||||
poly_vector.coeffRef(3*via_num,0) =
|
||||
pos_end -
|
||||
pos_start -
|
||||
vel_start*mov_time -
|
||||
(accel_start/2)*pow(mov_time,2) ;
|
||||
|
||||
poly_vector.coeffRef(3*via_num+1,0) =
|
||||
vel_end -
|
||||
vel_start -
|
||||
accel_start*mov_time ;
|
||||
|
||||
poly_vector.coeffRef(3*via_num+2,0) =
|
||||
accel_end -
|
||||
accel_start ;
|
||||
|
||||
Eigen::MatrixXd poly_matrix_part1 = Eigen::MatrixXd::Zero(3*via_num,3);
|
||||
|
||||
for (int i=1; i<=via_num; i++)
|
||||
{
|
||||
poly_matrix_part1.coeffRef(3*i-3,0) = pow(via_time.coeff(i-1,0),3) ;
|
||||
poly_matrix_part1.coeffRef(3*i-3,1) = pow(via_time.coeff(i-1,0),4) ;
|
||||
poly_matrix_part1.coeffRef(3*i-3,2) = pow(via_time.coeff(i-1,0),5) ;
|
||||
|
||||
poly_matrix_part1.coeffRef(3*i-2,0) = 3*pow(via_time.coeff(i-1,0),2) ;
|
||||
poly_matrix_part1.coeffRef(3*i-2,1) = 4*pow(via_time.coeff(i-1,0),3) ;
|
||||
poly_matrix_part1.coeffRef(3*i-2,2) = 5*pow(via_time.coeff(i-1,0),4) ;
|
||||
|
||||
poly_matrix_part1.coeffRef(3*i-1,0) = 6*via_time.coeff(i-1,0) ;
|
||||
poly_matrix_part1.coeffRef(3*i-1,1) = 12*pow(via_time.coeff(i-1,0),2) ;
|
||||
poly_matrix_part1.coeffRef(3*i-1,2) = 20*pow(via_time.coeff(i-1,0),3) ;
|
||||
}
|
||||
|
||||
Eigen::MatrixXd poly_matrix_part2 = Eigen::MatrixXd::Zero(3*via_num,3*via_num);
|
||||
|
||||
for (int i=1; i<=via_num; i++)
|
||||
{
|
||||
for (int j=1; j<=via_num; j++)
|
||||
{
|
||||
int k;
|
||||
|
||||
if (i > j)
|
||||
k = i ;
|
||||
else
|
||||
k = j ;
|
||||
|
||||
poly_matrix_part2.coeffRef(3*j-3,3*i-3) = pow((via_time.coeff(k-1,0)-via_time.coeff(i-1,0)),3)/6 ;
|
||||
poly_matrix_part2.coeffRef(3*j-3,3*i-2) = pow((via_time.coeff(k-1,0)-via_time.coeff(i-1,0)),4)/24 ;
|
||||
poly_matrix_part2.coeffRef(3*j-3,3*i-1) = pow((via_time.coeff(k-1,0)-via_time.coeff(i-1,0)),5)/120 ;
|
||||
|
||||
poly_matrix_part2.coeffRef(3*j-2,3*i-3) = pow((via_time.coeff(k-1,0)-via_time.coeff(i-1,0)),2)/2 ;
|
||||
poly_matrix_part2.coeffRef(3*j-2,3*i-2) = pow((via_time.coeff(k-1,0)-via_time.coeff(i-1,0)),3)/6 ;
|
||||
poly_matrix_part2.coeffRef(3*j-2,3*i-1) = pow((via_time.coeff(k-1,0)-via_time.coeff(i-1,0)),4)/24 ;
|
||||
|
||||
poly_matrix_part2.coeffRef(3*j-1,3*i-3) = via_time.coeff(k-1,0)-via_time.coeff(i-1,0) ;
|
||||
poly_matrix_part2.coeffRef(3*j-1,3*i-2) = pow((via_time.coeff(k-1,0)-via_time.coeff(i-1,0)),2)/2 ;
|
||||
poly_matrix_part2.coeffRef(3*j-1,3*i-1) = pow((via_time.coeff(k-1,0)-via_time.coeff(i-1,0)),3)/6 ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Eigen::MatrixXd poly_matrix_part3 = Eigen::MatrixXd::Zero(3,3*via_num+3);
|
||||
|
||||
poly_matrix_part3.coeffRef(0,0) = pow(mov_time,3);
|
||||
poly_matrix_part3.coeffRef(0,1) = pow(mov_time,4);
|
||||
poly_matrix_part3.coeffRef(0,2) = pow(mov_time,5);
|
||||
|
||||
poly_matrix_part3.coeffRef(1,0) = 3*pow(mov_time,2);
|
||||
poly_matrix_part3.coeffRef(1,1) = 4*pow(mov_time,3);
|
||||
poly_matrix_part3.coeffRef(1,2) = 5*pow(mov_time,4);
|
||||
|
||||
poly_matrix_part3.coeffRef(2,0) = 6*mov_time;
|
||||
poly_matrix_part3.coeffRef(2,1) = 12*pow(mov_time,2);
|
||||
poly_matrix_part3.coeffRef(2,2) = 20*pow(mov_time,3);
|
||||
|
||||
for (int i=1; i<=via_num; i++)
|
||||
{
|
||||
poly_matrix_part3.coeffRef(0,3*i) = pow(mov_time-via_time.coeff(i-1,0),3)/6 ;
|
||||
poly_matrix_part3.coeffRef(1,3*i) = pow(mov_time-via_time.coeff(i-1,0),2)/2 ;
|
||||
poly_matrix_part3.coeffRef(2,3*i) = mov_time-via_time.coeff(i-1,0) ;
|
||||
|
||||
poly_matrix_part3.coeffRef(0,3*i+1) = pow(mov_time-via_time.coeff(i-1,0),4)/24 ;
|
||||
poly_matrix_part3.coeffRef(1,3*i+1) = pow(mov_time-via_time.coeff(i-1,0),3)/6 ;
|
||||
poly_matrix_part3.coeffRef(2,3*i+1) = pow(mov_time-via_time.coeff(i-1,0),2)/2 ;
|
||||
|
||||
poly_matrix_part3.coeffRef(0,3*i+2) = pow(mov_time-via_time.coeff(i-1,0),5)/120 ;
|
||||
poly_matrix_part3.coeffRef(1,3*i+2) = pow(mov_time-via_time.coeff(i-1,0),4)/24 ;
|
||||
poly_matrix_part3.coeffRef(2,3*i+2) = pow(mov_time-via_time.coeff(i-1,0),3)/6 ;
|
||||
}
|
||||
|
||||
Eigen::MatrixXd poly_matrix = Eigen::MatrixXd::Zero(3*via_num+3,3*via_num+3);
|
||||
|
||||
poly_matrix.block(0,0,3*via_num,3) = poly_matrix_part1 ;
|
||||
poly_matrix.block(0,3,3*via_num,3*via_num) = poly_matrix_part2 ;
|
||||
poly_matrix.block(3*via_num,0,3,3*via_num+3) = poly_matrix_part3 ;
|
||||
|
||||
Eigen::MatrixXd poly_coeff(3*via_num+3,1);
|
||||
//C = A.inverse()*B;
|
||||
poly_coeff = poly_matrix.colPivHouseholderQr().solve(poly_vector);
|
||||
|
||||
int all_time_steps;
|
||||
all_time_steps = round(mov_time/smp_time) ;
|
||||
|
||||
Eigen::MatrixXd time_vector = Eigen::MatrixXd::Zero(all_time_steps+1,1);
|
||||
|
||||
for (int i=1; i<=all_time_steps+1; i++)
|
||||
time_vector.coeffRef(i-1,0) = (i-1)*smp_time;
|
||||
|
||||
Eigen::MatrixXd via_time_vector = Eigen::MatrixXd::Zero(via_num,1);
|
||||
|
||||
for (int i=1; i<=via_num; i++)
|
||||
via_time_vector.coeffRef(i-1,0) = round(via_time.coeff(i-1,0)/smp_time)+2;
|
||||
|
||||
Eigen::MatrixXd minimum_jerk_tra_with_via_points = Eigen::MatrixXd::Zero(all_time_steps+1,1);
|
||||
|
||||
for (int i=1; i<=all_time_steps+1; i++)
|
||||
{
|
||||
minimum_jerk_tra_with_via_points.coeffRef(i-1,0) =
|
||||
pos_start +
|
||||
vel_start*time_vector.coeff(i-1,0) +
|
||||
0.5*accel_start*pow(time_vector.coeff(i-1,0),2) +
|
||||
poly_coeff.coeff(0,0)*pow(time_vector.coeff(i-1,0),3) +
|
||||
poly_coeff.coeff(1,0)*pow(time_vector.coeff(i-1,0),4) +
|
||||
poly_coeff.coeff(2,0)*pow(time_vector.coeff(i-1,0),5) ;
|
||||
}
|
||||
|
||||
for (int i=1; i<=via_num; i++)
|
||||
{
|
||||
for (int j=via_time_vector.coeff(i-1,0); j<=all_time_steps+1; j++)
|
||||
{
|
||||
minimum_jerk_tra_with_via_points.coeffRef(j-1,0) =
|
||||
minimum_jerk_tra_with_via_points.coeff(j-1,0) +
|
||||
poly_coeff.coeff(3*i,0)*pow((time_vector.coeff(j-1,0)-via_time.coeff(i-1,0)),3)/6 +
|
||||
poly_coeff.coeff(3*i+1,0)*pow((time_vector.coeff(j-1,0)-via_time.coeff(i-1,0)),4)/24 +
|
||||
poly_coeff.coeff(3*i+2,0)*pow((time_vector.coeff(j-1,0)-via_time.coeff(i-1,0)),5)/120 ;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return minimum_jerk_tra_with_via_points;
|
||||
}
|
||||
|
||||
Eigen::MatrixXd calcArc3dTra(double smp_time, double mov_time,
|
||||
Eigen::MatrixXd center_point, Eigen::MatrixXd normal_vector, Eigen::MatrixXd start_point,
|
||||
double rotation_angle, double cross_ratio )
|
||||
{
|
||||
int all_time_steps = int (round(mov_time/smp_time))+1;
|
||||
|
||||
Eigen::MatrixXd angle_tra = calcMinimumJerkTra(0.0, 0.0, 0.0,
|
||||
rotation_angle, 0.0, 0.0,
|
||||
smp_time, mov_time);
|
||||
|
||||
Eigen::MatrixXd arc_tra = Eigen::MatrixXd::Zero(3,all_time_steps);
|
||||
|
||||
for (int step = 0; step < all_time_steps; step++ )
|
||||
{
|
||||
double time = ((double)step)*smp_time;
|
||||
double theta = angle_tra.coeff(step,0);
|
||||
|
||||
Eigen::MatrixXd weight_wedge(3,3);
|
||||
|
||||
weight_wedge <<
|
||||
0.0, -normal_vector.coeff(2,0), normal_vector.coeff(1,0),
|
||||
normal_vector.coeff(2,0), 0.0, -normal_vector.coeff(0,0),
|
||||
-normal_vector.coeff(1,0), normal_vector.coeff(0,0), 0.0;
|
||||
|
||||
Eigen::MatrixXd identity = Eigen::MatrixXd::Identity(3,3);
|
||||
Eigen::MatrixXd rotation = identity + weight_wedge*sin(theta) + weight_wedge*weight_wedge*(1-cos(theta));
|
||||
double cross = cross_ratio*(1.0-2.0*(abs(0.5-(time/mov_time))));
|
||||
|
||||
arc_tra.block(0,step,3,1) = (1+cross)*(rotation*(start_point-center_point))+center_point;
|
||||
}
|
||||
|
||||
Eigen::MatrixXd act_tra_trans = arc_tra.transpose();
|
||||
|
||||
return act_tra_trans;
|
||||
}
|
||||
|
||||
|
||||
|
||||
FifthOrderPolynomialTrajectory::FifthOrderPolynomialTrajectory(double initial_time, double initial_pos, double initial_vel, double initial_acc,
|
||||
double final_time, double final_pos, double final_vel, double final_acc)
|
||||
{
|
||||
position_coeff_.resize(6, 1);
|
||||
velocity_coeff_.resize(6, 1);
|
||||
acceleration_coeff_.resize(6, 1);
|
||||
time_variables_.resize(1, 6);
|
||||
|
||||
position_coeff_.fill(0);
|
||||
velocity_coeff_.fill(0);
|
||||
acceleration_coeff_.fill(0);
|
||||
time_variables_.fill(0);
|
||||
|
||||
if(final_time > initial_time)
|
||||
{
|
||||
initial_time_ = initial_time;
|
||||
initial_pos_ = initial_pos;
|
||||
initial_vel_ = initial_vel;
|
||||
initial_acc_ = initial_acc;
|
||||
|
||||
current_time_ = initial_time;
|
||||
current_pos_ = initial_pos;
|
||||
current_vel_ = initial_vel;
|
||||
current_acc_ = initial_acc;
|
||||
|
||||
final_time_ = final_time;
|
||||
final_pos_ = final_pos;
|
||||
final_vel_ = final_vel;
|
||||
final_acc_ = final_acc;
|
||||
|
||||
Eigen::MatrixXd time_mat;
|
||||
Eigen::MatrixXd conditions_mat;
|
||||
|
||||
time_mat.resize(6,6);
|
||||
time_mat << powDI(initial_time_, 5), powDI(initial_time_, 4), powDI(initial_time_, 3), powDI(initial_time_, 2), initial_time_, 1.0,
|
||||
5.0*powDI(initial_time_, 4), 4.0*powDI(initial_time_, 3), 3.0*powDI(initial_time_, 2), 2.0*initial_time_, 1.0, 0.0,
|
||||
20.0*powDI(initial_time_, 3), 12.0*powDI(initial_time_, 2), 6.0*initial_time_, 2.0, 0.0, 0.0;
|
||||
powDI(final_time_, 5), powDI(final_time_, 4), powDI(final_time_, 3), powDI(final_time_, 2), final_time_, 1.0,
|
||||
5.0*powDI(final_time_, 4), 4.0*powDI(final_time_, 3), 3.0*powDI(final_time_, 2), 2.0*final_time_, 1.0, 0.0,
|
||||
20.0*powDI(final_time_, 3), 12.0*powDI(final_time_, 2), 6.0*final_time_, 2.0, 0.0, 0.0;
|
||||
|
||||
conditions_mat.resize(6,1);
|
||||
conditions_mat << initial_pos_, initial_vel_, initial_acc_, final_pos_, final_vel_, final_acc_;
|
||||
|
||||
position_coeff_ = time_mat.inverse() * conditions_mat;
|
||||
velocity_coeff_ << 0.0,
|
||||
5.0*position_coeff_.coeff(0,0),
|
||||
4.0*position_coeff_.coeff(0,1),
|
||||
3.0*position_coeff_.coeff(0,2),
|
||||
2.0*position_coeff_.coeff(0,3),
|
||||
1.0*position_coeff_.coeff(0,4);
|
||||
acceleration_coeff_ << 0.0,
|
||||
0.0,
|
||||
20.0*position_coeff_.coeff(0,0),
|
||||
12.0*position_coeff_.coeff(0,1),
|
||||
6.0*position_coeff_.coeff(0,2),
|
||||
2.0*position_coeff_.coeff(0,3);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
FifthOrderPolynomialTrajectory::FifthOrderPolynomialTrajectory()
|
||||
{
|
||||
initial_time_ = 0;
|
||||
initial_pos_ = 0;
|
||||
initial_vel_ = 0;
|
||||
initial_acc_ = 0;
|
||||
|
||||
current_time_ = 0;
|
||||
current_pos_ = 0;
|
||||
current_vel_ = 0;
|
||||
current_acc_ = 0;
|
||||
|
||||
final_time_ = 0;
|
||||
final_pos_ = 0;
|
||||
final_vel_ = 0;
|
||||
final_acc_ = 0;
|
||||
|
||||
position_coeff_.resize(6, 1);
|
||||
velocity_coeff_.resize(6, 1);
|
||||
acceleration_coeff_.resize(6, 1);
|
||||
time_variables_.resize(1, 6);
|
||||
|
||||
position_coeff_.fill(0);
|
||||
velocity_coeff_.fill(0);
|
||||
acceleration_coeff_.fill(0);
|
||||
time_variables_.fill(0);
|
||||
}
|
||||
|
||||
FifthOrderPolynomialTrajectory::~FifthOrderPolynomialTrajectory()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool FifthOrderPolynomialTrajectory::changeTrajectory(double final_pos, double final_vel, double final_acc)
|
||||
{
|
||||
final_pos_ = final_pos;
|
||||
final_vel_ = final_vel;
|
||||
final_acc_ = final_acc;
|
||||
|
||||
Eigen::MatrixXd time_mat;
|
||||
Eigen::MatrixXd conditions_mat;
|
||||
|
||||
time_mat.resize(6,6);
|
||||
time_mat << powDI(initial_time_, 5), powDI(initial_time_, 4), powDI(initial_time_, 3), powDI(initial_time_, 2), initial_time_, 1.0,
|
||||
5.0*powDI(initial_time_, 4), 4.0*powDI(initial_time_, 3), 3.0*powDI(initial_time_, 2), 2.0*initial_time_, 1.0, 0.0,
|
||||
20.0*powDI(initial_time_, 3), 12.0*powDI(initial_time_, 2), 6.0*initial_time_, 2.0, 0.0, 0.0,
|
||||
powDI(final_time_, 5), powDI(final_time_, 4), powDI(final_time_, 3), powDI(final_time_, 2), final_time_, 1.0,
|
||||
5.0*powDI(final_time_, 4), 4.0*powDI(final_time_, 3), 3.0*powDI(final_time_, 2), 2.0*final_time_, 1.0, 0.0,
|
||||
20.0*powDI(final_time_, 3), 12.0*powDI(final_time_, 2), 6.0*final_time_, 2.0, 0.0, 0.0;
|
||||
|
||||
conditions_mat.resize(6,1);
|
||||
conditions_mat << initial_pos_, initial_vel_, initial_acc_, final_pos_, final_vel_, final_acc_;
|
||||
|
||||
position_coeff_ = time_mat.inverse() * conditions_mat;
|
||||
velocity_coeff_ << 0.0,
|
||||
5.0*position_coeff_.coeff(0,0),
|
||||
4.0*position_coeff_.coeff(0,1),
|
||||
3.0*position_coeff_.coeff(0,2),
|
||||
2.0*position_coeff_.coeff(0,3),
|
||||
1.0*position_coeff_.coeff(0,4);
|
||||
acceleration_coeff_ << 0.0,
|
||||
0.0,
|
||||
20.0*position_coeff_.coeff(0,0),
|
||||
12.0*position_coeff_.coeff(0,1),
|
||||
6.0*position_coeff_.coeff(0,2),
|
||||
2.0*position_coeff_.coeff(0,3);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool FifthOrderPolynomialTrajectory::changeTrajectory(double final_time, double final_pos, double final_vel, double final_acc)
|
||||
{
|
||||
if(final_time < initial_time_)
|
||||
return false;
|
||||
|
||||
final_time_ = final_time;
|
||||
return changeTrajectory(final_pos, final_vel, final_acc);
|
||||
}
|
||||
|
||||
bool FifthOrderPolynomialTrajectory::changeTrajectory(double initial_time, double initial_pos, double initial_vel, double initial_acc,
|
||||
double final_time, double final_pos, double final_vel, double final_acc)
|
||||
{
|
||||
if(final_time < initial_time)
|
||||
return false;
|
||||
|
||||
initial_time_ = initial_time;
|
||||
initial_pos_ = initial_pos;
|
||||
initial_vel_ = initial_vel;
|
||||
initial_acc_ = initial_acc;
|
||||
|
||||
final_time_ = final_time;
|
||||
|
||||
return changeTrajectory(final_pos, final_vel, final_acc);
|
||||
}
|
||||
|
||||
double FifthOrderPolynomialTrajectory::getPosition(double time)
|
||||
{
|
||||
if(time >= final_time_)
|
||||
{
|
||||
current_time_ = final_time_;
|
||||
current_pos_ = final_pos_;
|
||||
current_vel_ = final_vel_;
|
||||
current_acc_ = final_acc_;
|
||||
return final_pos_;
|
||||
}
|
||||
else if(time <= initial_time_ )
|
||||
{
|
||||
current_time_ = initial_time_;
|
||||
current_pos_ = initial_pos_;
|
||||
current_vel_ = initial_vel_;
|
||||
current_acc_ = initial_acc_;
|
||||
return initial_pos_;
|
||||
}
|
||||
else
|
||||
{
|
||||
current_time_ = time;
|
||||
time_variables_ << powDI(time, 5), powDI(time, 4), powDI(time, 3), powDI(time, 2), time, 1.0;
|
||||
current_pos_ = (time_variables_ * position_coeff_).coeff(0,0);
|
||||
current_vel_ = (time_variables_ * velocity_coeff_).coeff(0,0);
|
||||
current_acc_ = (time_variables_ * acceleration_coeff_).coeff(0,0);
|
||||
return current_pos_;
|
||||
}
|
||||
}
|
||||
|
||||
double FifthOrderPolynomialTrajectory::getVelocity(double time)
|
||||
{
|
||||
if(time >= final_time_)
|
||||
{
|
||||
current_time_ = final_time_;
|
||||
current_pos_ = final_pos_;
|
||||
current_vel_ = final_vel_;
|
||||
current_acc_ = final_acc_;
|
||||
return final_vel_;
|
||||
}
|
||||
else if(time <= initial_time_ )
|
||||
{
|
||||
current_time_ = initial_time_;
|
||||
current_pos_ = initial_pos_;
|
||||
current_vel_ = initial_vel_;
|
||||
current_acc_ = initial_acc_;
|
||||
return initial_vel_;
|
||||
}
|
||||
else
|
||||
{
|
||||
current_time_ = time;
|
||||
time_variables_ << powDI(time, 5), powDI(time, 4), powDI(time, 3), powDI(time, 2), time, 1.0;
|
||||
current_pos_ = (time_variables_ * position_coeff_).coeff(0,0);
|
||||
current_vel_ = (time_variables_ * velocity_coeff_).coeff(0,0);
|
||||
current_acc_ = (time_variables_ * acceleration_coeff_).coeff(0,0);
|
||||
return current_vel_;
|
||||
}
|
||||
}
|
||||
|
||||
double FifthOrderPolynomialTrajectory::getAcceleration(double time)
|
||||
{
|
||||
if(time >= final_time_)
|
||||
{
|
||||
current_time_ = final_time_;
|
||||
current_pos_ = final_pos_;
|
||||
current_vel_ = final_vel_;
|
||||
current_acc_ = final_acc_;
|
||||
return final_acc_;
|
||||
}
|
||||
else if(time <= initial_time_ )
|
||||
{
|
||||
current_time_ = initial_time_;
|
||||
current_pos_ = initial_pos_;
|
||||
current_vel_ = initial_vel_;
|
||||
current_acc_ = initial_acc_;
|
||||
return initial_acc_;
|
||||
}
|
||||
else
|
||||
{
|
||||
current_time_ = time;
|
||||
time_variables_ << powDI(time, 5), powDI(time, 4), powDI(time, 3), powDI(time, 2), time, 1.0;
|
||||
current_pos_ = (time_variables_ * position_coeff_).coeff(0,0);
|
||||
current_vel_ = (time_variables_ * velocity_coeff_).coeff(0,0);
|
||||
current_acc_ = (time_variables_ * acceleration_coeff_).coeff(0,0);
|
||||
return current_acc_;
|
||||
}
|
||||
}
|
||||
|
||||
void FifthOrderPolynomialTrajectory::setTime(double time)
|
||||
{
|
||||
if(time >= final_time_)
|
||||
{
|
||||
current_time_ = final_time_;
|
||||
current_pos_ = final_pos_;
|
||||
current_vel_ = final_vel_;
|
||||
current_acc_ = final_acc_;
|
||||
}
|
||||
else if(time <= initial_time_ )
|
||||
{
|
||||
current_time_ = initial_time_;
|
||||
current_pos_ = initial_pos_;
|
||||
current_vel_ = initial_vel_;
|
||||
current_acc_ = initial_acc_;
|
||||
}
|
||||
else
|
||||
{
|
||||
current_time_ = time;
|
||||
time_variables_ << powDI(time, 5), powDI(time, 4), powDI(time, 3), powDI(time, 2), time, 1.0;
|
||||
current_pos_ = (time_variables_ * position_coeff_).coeff(0,0);
|
||||
current_vel_ = (time_variables_ * velocity_coeff_).coeff(0,0);
|
||||
current_acc_ = (time_variables_ * acceleration_coeff_).coeff(0,0);
|
||||
}
|
||||
}
|
||||
|
||||
double FifthOrderPolynomialTrajectory::getPosition()
|
||||
{
|
||||
return current_pos_;
|
||||
}
|
||||
|
||||
double FifthOrderPolynomialTrajectory::getVelocity()
|
||||
{
|
||||
return current_vel_;
|
||||
}
|
||||
|
||||
double FifthOrderPolynomialTrajectory::getAcceleration()
|
||||
{
|
||||
return current_acc_;
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user