Skip to content
Snippets Groups Projects
Commit 09512cec authored by Fabian Reister's avatar Fabian Reister
Browse files

update

parent 63e52fee
No related branches found
No related tags found
No related merge requests found
...@@ -17,6 +17,7 @@ armarx_add_library( ...@@ -17,6 +17,7 @@ armarx_add_library(
SOURCES SOURCES
StaticScene.cpp StaticScene.cpp
Trajectory.cpp Trajectory.cpp
types.cpp
HEADERS HEADERS
types.h types.h
MemoryReferencedElement.h MemoryReferencedElement.h
......
#include "types.h"
namespace armarx::nav::core
{
core::Pose Twist::poseDiff(const float dt) const
{
return core::Pose(Eigen::Translation3f(linear * dt)) *
core::Pose(Eigen::AngleAxisf(angular.norm() * dt, angular.normalized()));
}
} // namespace armarx::nav::core
...@@ -53,6 +53,8 @@ namespace armarx::nav::core ...@@ -53,6 +53,8 @@ namespace armarx::nav::core
{ {
Eigen::Vector3f linear; Eigen::Vector3f linear;
Eigen::Vector3f angular; Eigen::Vector3f angular;
core::Pose poseDiff(float dt) const;
}; };
struct Waypoint struct Waypoint
...@@ -60,8 +62,6 @@ namespace armarx::nav::core ...@@ -60,8 +62,6 @@ namespace armarx::nav::core
Pose pose; Pose pose;
}; };
struct Scene struct Scene
{ {
std::optional<core::StaticScene> staticScene = std::nullopt; std::optional<core::StaticScene> staticScene = std::nullopt;
......
...@@ -48,7 +48,7 @@ namespace armarx::nav::glob_plan ...@@ -48,7 +48,7 @@ namespace armarx::nav::glob_plan
{ {
trajectory.push_back(core::TrajectoryPoint trajectory.push_back(core::TrajectoryPoint
{ {
.waypoint = core::Waypoint{.pose = Eigen::Affine3f(context.robot->getGlobalPose())}, .waypoint = core::Waypoint{.pose = core::Pose(context.robot->getGlobalPose())},
.twist = {.linear = Eigen::Vector3f::Zero(), .angular = Eigen::Vector3f::Zero()}}); .twist = {.linear = Eigen::Vector3f::Zero(), .angular = Eigen::Vector3f::Zero()}});
} }
......
...@@ -71,7 +71,7 @@ namespace armarx::nav::server ...@@ -71,7 +71,7 @@ namespace armarx::nav::server
ARMARX_CHECK_NOT_NULL(stack.globalPlanner); ARMARX_CHECK_NOT_NULL(stack.globalPlanner);
StackResult res; StackResult res;
res.globalTrajectory = stack.globalPlanner->plan(Eigen::Affine3f(waypoints.at(0))); res.globalTrajectory = stack.globalPlanner->plan(core::Pose(waypoints.at(0)));
if (stack.localPlanner) if (stack.localPlanner)
{ {
......
...@@ -42,7 +42,7 @@ namespace armarx::nav::server ...@@ -42,7 +42,7 @@ namespace armarx::nav::server
//lastUpdated = now; //lastUpdated = now;
const Eigen::Affine3f diff; // = Eigen::Affine3f(Eigen::Translation3f(twist.linear * dt)) * Eigen::Affine3f(Eigen::AngleAxisf(dt, twist.angular))); const core::Pose diff; // TODO
robot->setGlobalPose(robot->getGlobalPose() * diff.matrix()); robot->setGlobalPose(robot->getGlobalPose() * diff.matrix());
} }
......
...@@ -23,9 +23,11 @@ ...@@ -23,9 +23,11 @@
#include <limits> #include <limits>
#include <Eigen/Geometry> #include <Eigen/Geometry>
#include <Eigen/src/Geometry/AngleAxis.h>
#include <Eigen/src/Geometry/Transform.h> #include <Eigen/src/Geometry/Transform.h>
#include <Eigen/src/Geometry/Translation.h> #include <Eigen/src/Geometry/Translation.h>
#include <SimoxUtility/math/convert/deg_to_rad.h>
#include <VirtualRobot/Robot.h> #include <VirtualRobot/Robot.h>
#include "Navigation/libraries/core/Trajectory.h" #include "Navigation/libraries/core/Trajectory.h"
...@@ -59,7 +61,7 @@ BOOST_AUTO_TEST_CASE(testTrajectoryFollowingControllerOnTrajectory) ...@@ -59,7 +61,7 @@ BOOST_AUTO_TEST_CASE(testTrajectoryFollowingControllerOnTrajectory)
traj_ctrl::TrajectoryFollowingController controller(params, scene); traj_ctrl::TrajectoryFollowingController controller(params, scene);
core::TrajectoryPoint wpBefore; core::TrajectoryPoint wpBefore;
wpBefore.waypoint.pose = Eigen::Affine3f::Identity(); wpBefore.waypoint.pose = core::Pose::Identity();
wpBefore.waypoint.pose.translation().x() -= 100.F; wpBefore.waypoint.pose.translation().x() -= 100.F;
wpBefore.twist.linear = Eigen::Vector3f::UnitX(); wpBefore.twist.linear = Eigen::Vector3f::UnitX();
wpBefore.twist.angular = Eigen::Vector3f::Zero(); wpBefore.twist.angular = Eigen::Vector3f::Zero();
...@@ -79,16 +81,17 @@ BOOST_AUTO_TEST_CASE(testTrajectoryFollowingControllerOnTrajectory) ...@@ -79,16 +81,17 @@ BOOST_AUTO_TEST_CASE(testTrajectoryFollowingControllerOnTrajectory)
BOOST_CHECK_EQUAL(true, true); BOOST_CHECK_EQUAL(true, true);
} }
/** /**
* @brief Tests the control * @brief Tests the control
* *
*/ */
BOOST_AUTO_TEST_CASE(testTrajectoryFollowingControllerNextToTrajectory) BOOST_AUTO_TEST_CASE(testTrajectoryFollowingControllerNextToTrajectory)
{ {
core::Scene scene; core::Scene scene;
scene.robot = std::make_shared<VirtualRobot::LocalRobot>("foo", "bar"); scene.robot = std::make_shared<VirtualRobot::LocalRobot>("foo", "bar");
scene.robot->setGlobalPose(Eigen::Matrix4f::Identity() * Eigen::Affine3f(Eigen::Translation3f(0, 100, 0)).matrix(), false); scene.robot->setGlobalPose(Eigen::Matrix4f::Identity() *
core::Pose(Eigen::Translation3f(0, 100, 0)).matrix(),
false);
traj_ctrl::TrajectoryFollowingControllerParams params; traj_ctrl::TrajectoryFollowingControllerParams params;
params.pidPos = {1, 0, 0}; params.pidPos = {1, 0, 0};
...@@ -99,7 +102,7 @@ BOOST_AUTO_TEST_CASE(testTrajectoryFollowingControllerNextToTrajectory) ...@@ -99,7 +102,7 @@ BOOST_AUTO_TEST_CASE(testTrajectoryFollowingControllerNextToTrajectory)
traj_ctrl::TrajectoryFollowingController controller(params, scene); traj_ctrl::TrajectoryFollowingController controller(params, scene);
core::TrajectoryPoint wpBefore; core::TrajectoryPoint wpBefore;
wpBefore.waypoint.pose = Eigen::Affine3f::Identity(); wpBefore.waypoint.pose = core::Pose::Identity();
wpBefore.waypoint.pose.translation().x() -= 100.F; wpBefore.waypoint.pose.translation().x() -= 100.F;
wpBefore.twist.linear = Eigen::Vector3f::UnitX(); wpBefore.twist.linear = Eigen::Vector3f::UnitX();
wpBefore.twist.angular = Eigen::Vector3f::Zero(); wpBefore.twist.angular = Eigen::Vector3f::Zero();
...@@ -118,3 +121,96 @@ BOOST_AUTO_TEST_CASE(testTrajectoryFollowingControllerNextToTrajectory) ...@@ -118,3 +121,96 @@ BOOST_AUTO_TEST_CASE(testTrajectoryFollowingControllerNextToTrajectory)
BOOST_CHECK_EQUAL(true, true); BOOST_CHECK_EQUAL(true, true);
} }
class TargetReachedCondition
{
public:
struct Params
{
struct
{
float linear;
float angular;
} distance;
};
TargetReachedCondition(const core::TrajectoryPoint& point, const Params& params) :
point(point), params(params)
{
}
bool check(const core::Pose& pose) const
{
const float dp = (pose.translation() - point.waypoint.pose.translation()).norm();
const float dr =
Eigen::AngleAxisf(pose.linear().inverse() * point.waypoint.pose.linear()).angle();
return (dp <= params.distance.linear) and (dr <= params.distance.angular);
}
private:
core::TrajectoryPoint point;
const Params params;
};
/**
* @brief Tests the control
*
*/
BOOST_AUTO_TEST_CASE(testTrajectoryFollowingControllerReachGoal)
{
core::Scene scene;
scene.robot = std::make_shared<VirtualRobot::LocalRobot>("foo", "bar");
scene.robot->setGlobalPose(Eigen::Matrix4f::Identity() *
core::Pose(Eigen::Translation3f(0, 100, 0)).matrix(),
false);
traj_ctrl::TrajectoryFollowingControllerParams params;
params.pidPos = {1, 0, 0};
params.pidOri = {1, 0, 0};
params.limits.linearVelocity = std::numeric_limits<float>::max();
params.limits.angularVelocity = std::numeric_limits<float>::max();
traj_ctrl::TrajectoryFollowingController controller(params, scene);
core::TrajectoryPoint wpBefore;
wpBefore.waypoint.pose = core::Pose::Identity();
wpBefore.waypoint.pose.translation().x() -= 100.F;
wpBefore.twist.linear = Eigen::Vector3f::UnitX();
wpBefore.twist.angular = Eigen::Vector3f::Zero();
core::TrajectoryPoint wpAfter = wpBefore;
wpAfter.waypoint.pose.translation().x() += 2000.F;
core::TrajectoryPtr traj(new core::Trajectory({wpBefore, wpAfter}));
auto timestamp = std::chrono::steady_clock::now();
TargetReachedCondition condition(wpAfter,
TargetReachedCondition::Params{.distance{
.linear = 50.F, .angular = simox::math::deg_to_rad(10.F)}});
for (int i = 0; i < 50; i++)
{
core::Twist controlVal = controller.control(traj);
ARMARX_DEBUG << "Control val " << controlVal.linear;
auto now = std::chrono::steady_clock::now();
const float dt = std::chrono::duration<float>(now - timestamp).count();
core::Pose dp = controlVal.poseDiff(dt);
const core::Pose newPose = core::Pose(scene.robot->getGlobalPose()) * dp;
scene.robot->setGlobalPose(newPose.matrix());
if (condition.check(newPose))
{
break;
}
}
BOOST_CHECK(condition.check(core::Pose(scene.robot->getGlobalPose())));
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment