9#include <gtest/gtest.h>
11#include <kdl/chaindynparam.hpp>
12#include <kdl/chainfksolverpos_recursive.hpp>
20namespace fs = std::filesystem;
31 const std::string arm_mjcf =
ex::find_asset(
"kinova_gen3/gen3.xml");
32 const std::string grp_mjcf =
ex::find_asset(
"robotiq_2f85/2f85.xml");
33 if (!fs::exists(arm_mjcf)) GTEST_SKIP() << arm_mjcf <<
" not found";
34 if (!fs::exists(grp_mjcf)) GTEST_SKIP() << grp_mjcf <<
" not found";
55 const int jid = mj_name2id(
env_.model, mjOBJ_JOINT, r.
joint_names[i].c_str());
56 return env_.model->jnt_dofadr[jid];
65 for (
unsigned i = 0; i < 7; ++i)
66 err = std::max(err, std::abs(g(i) -
env_.data->qfrc_bias[
dof(r, i)]));
74 mj_forward(env_.model, env_.data);
75 EXPECT_LE(max_gravity_error(s_), 1e-9) <<
"measured 2e-14 Nm";
79 EXPECT_GT(max_gravity_error(bare), 1.0) <<
"without the tool the chain misses ~5 Nm";
92 for (
int i = 0; i < 500; ++i) {
98 EXPECT_LE((
ex::tcp_frame(fk, s_).p - ee_init.
p).Norm(), 1e-5) <<
"measured 7e-7 m";
104 for (
unsigned i = 0; i < 7; ++i) s_.jnt_trq_cmd[i] = 1.0 + i;
109 for (
unsigned i = 0; i < 7; ++i) {
110 const double actuator = env_.data->qfrc_actuator[dof(s_, i)];
111 EXPECT_DOUBLE_EQ(s_.jnt_trq_msr[i], actuator) <<
"joint " << i;
112 EXPECT_NEAR(actuator, 1.0 + i, 1e-9) <<
"the motor delivers the command";
113 EXPECT_NE(actuator, env_.data->qfrc_bias[dof(s_, i)]);
117int main(
int argc,
char *argv[])
119 testing::InitGoogleTest(&argc, argv);
120 return RUN_ALL_TESTS();
virtual int JntToGravity(const JntArray &q, JntArray &gravity)
virtual int JntToCart(const JntArray &q_in, Frame &p_out, int segmentNr=-1)
const KDL::JntArray q_home_
double max_gravity_error(const mj_kdl::Robot &r)
int dof(const mj_kdl::Robot &r, unsigned i) const
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)
mj_kdl::ToolFrameSpec gripper_tool(const std::string &prefix="")
KDL::Frame tcp_frame(KDL::ChainFkSolverPos_recursive &fk, const mj_kdl::Robot &robot)
std::string find_asset(const fs::path &relative)
mj_kdl::AttachmentSpec gripper_attachment(const std::string &path, const std::string &site="pinch_site")
KDL::JntArray home_q(unsigned n)
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)
std::vector< AttachmentSpec > attachments
std::vector< std::string > joint_names
std::vector< RobotSpec > robots
int main(int argc, char *argv[])
TEST_F(MjcfTrqCtrlTest, GravityIncludesTheGripperMass)