9#include <gtest/gtest.h>
11#include <kdl/chaindynparam.hpp>
12#include <kdl/chainfksolverpos_recursive.hpp>
21namespace fs = std::filesystem;
32 const std::string arm_mjcf =
ex::find_asset(
"kinova_gen3/gen3.xml");
33 const std::string grp_mjcf =
ex::find_asset(
"robotiq_2f85/2f85.xml");
34 if (!fs::exists(arm_mjcf)) GTEST_SKIP() << arm_mjcf <<
" not found";
35 if (!fs::exists(grp_mjcf)) GTEST_SKIP() << grp_mjcf <<
" not found";
67 ASSERT_GE(wrist_fk.JntToCart(wp_.home, wrist_frame), 0);
68 ASSERT_GE(tcp_fk.
JntToCart(wp_.home, tcp_frame), 0);
70 EXPECT_NEAR((tcp_frame.p - wrist_frame.
p).Norm(), 0.217325, 1e-6);
76 const std::vector<std::pair<const KDL::JntArray *, const KDL::JntArray *>> steps = {
77 { &wp_.pick_above, &wp_.pick }, { &wp_.pick, &wp_.lift }
79 for (
const auto &[from, to] : steps) {
81 for (
unsigned i = 0; i < from->rows(); ++i)
82 delta = std::max(delta, std::abs((*to)(i) - (*from)(i)));
83 EXPECT_LT(delta, 1.5) <<
"IK jumped to a distant branch (measured 0.61, 0.92 rad)";
93 ASSERT_NE(fingers,
nullptr);
94 ASSERT_NE(cube,
nullptr);
105 bool restart =
false;
108 { { &s_, fingers } },
114 EXPECT_GT(cube->
pose.
p.
z(), 0.28) <<
"cube was not lifted (measured 0.312 m)";
117int main(
int argc,
char *argv[])
119 testing::InitGoogleTest(&argc, argv);
120 return RUN_ALL_TESTS();
virtual int JntToCart(const JntArray &q_in, Frame &p_out, int segmentNr=-1)
unsigned int getNrOfJoints() const
ex::PickPlaceWaypoints wp_
ResetInfo reset(Env *env, const ResetOptions *options=nullptr)
Status init_env(Env *env, const SceneSpec *spec)
Status set_control_mode(Robot *r, CtrlMode mode)
Status init_robot_from_mjcf(Robot *r, Env *env, const char *base_body, const char *tip_body, const char *prefix="", const ToolFrameSpec *tool=nullptr)
void set_joint_pos(Robot *r, const KDL::JntArray &q)
SceneActuatorSlot * bind_scene_actuator(SceneState *s, const char *name)
SceneFreeBodySlot * bind_scene_free_body(SceneState *s, const char *body_name)
bool solve_pick_place(const mj_kdl::Robot &robot, PickPlaceWaypoints &w)
constexpr double kGripperClosed
mj_kdl::ToolFrameSpec gripper_tool(const std::string &prefix="")
std::vector< Phase > pick_place_phases(const PickPlaceWaypoints &w)
constexpr double kPickXY[2]
std::string find_asset(const fs::path &relative)
mj_kdl::AttachmentSpec gripper_attachment(const std::string &path, const std::string &site="pinch_site")
void pd_gravity(mj_kdl::Robot &robot, KDL::ChainDynParam &dyn, const KDL::JntArray &q_des, const double *kp=nullptr, const double *kd=nullptr)
void prime_gravity(mj_kdl::Robot &robot, KDL::ChainDynParam &dyn, const KDL::JntArray &q)
bool run_phases(mj_kdl::Env &env, const std::vector< PhaseArm > &arms, const std::vector< Phase > &phases, bool &restart, const std::function< void(std::size_t, const KDL::JntArray &)> &control, const std::function< void(const Phase &, double t_rel)> &after_step={})
mj_kdl::SceneObject cube_object(double x, double y, double surface_z)
std::vector< AttachmentSpec > attachments
std::vector< RobotSpec > robots
std::vector< SceneObject > objects
int main(int argc, char *argv[])
TEST_F(MjcfPickTest, TcpLiesBeyondTheWrist)