10#include <gtest/gtest.h>
12#include <kdl/chaindynparam.hpp>
13#include <kdl/chainfksolverpos_recursive.hpp>
21namespace fs = std::filesystem;
28 std::unique_ptr<KDL::ChainDynParam>
dyn1,
dyn2;
34 if (!fs::exists(mjcf)) GTEST_SKIP() << mjcf <<
" not found";
49 scene.
robots = { left, right };
60 return env.model->jnt_dofadr[mj_name2id(
env.model, mjOBJ_JOINT, r.
joint_names[j].c_str())];
69 EXPECT_EQ(arm2.joint_names.front(),
"r2_joint_1");
78 mj_forward(env.model, env.data);
82 dyn1->JntToGravity(q_home, g1);
83 dyn2->JntToGravity(q_home, g2);
84 for (
int j = 0; j < 7; ++j) {
85 EXPECT_NEAR(g1(j), env.data->qfrc_bias[dof(arm1, j)], 1e-9) <<
"arm1 joint " << j;
86 EXPECT_NEAR(g2(j), env.
data->qfrc_bias[dof(arm2, j)], 1e-9) <<
"arm2 joint " << j;
101 fk1.JntToCart(q_home, ee_init);
103 for (
int i = 0; i < 500; ++i) {
116int main(
int argc,
char *argv[])
118 testing::InitGoogleTest(&argc, argv);
119 return RUN_ALL_TESTS();
std::unique_ptr< KDL::ChainDynParam > dyn2
std::unique_ptr< KDL::ChainDynParam > dyn1
int dof(const mj_kdl::Robot &r, int j) const
const KDL::JntArray q_home
unsigned int getNrOfSegments() 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)
KDL::Frame tcp_frame(KDL::ChainFkSolverPos_recursive &fk, const mj_kdl::Robot &robot)
std::string find_asset(const fs::path &relative)
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< std::string > joint_names
std::vector< RobotSpec > robots
int main(int argc, char *argv[])
TEST_F(DualArmTest, PrefixNamesTheWholeChain)