当前位置: 首页 > article >正文

mujoco传感器数据读取的正确姿势

之前一直以为mujoco的仿真环境下六维力传感器的数据读取方式C++版本如下

void printForceTorqueData(const mjModel *m, const mjData *d)
{
    int force_id = mj_name2id(m, mjOBJ_SENSOR, "fts_sensor_force");
    int torque_id = mj_name2id(m, mjOBJ_SENSOR, "fts_sensor_torque");
    if (force_id != -1 && torque_id != -1)
    {
        Eigen::Map<Eigen::Vector3d> force(&d->sensordata[force_id], 3);
        Eigen::Map<Eigen::Vector3d> torque(&d->sensordata[torque_id], 3);
        std::cerr << "Force: " << force.transpose() << std::endl;
        std::cerr << "Torque: " << torque.transpose() << std::endl;
    }
}

而经过与mujoco的Python接口对比,发现上述方式读取的力矩信息是错的,需要改成如下的读取方式

void printForceTorqueData(const mjModel *m, const mjData *d)
{
    int force_id = mj_name2id(m, mjOBJ_SENSOR, "fts_sensor_force");
    int torque_id = mj_name2id(m, mjOBJ_SENSOR, "fts_sensor_torque");
    if (force_id != -1 && torque_id != -1)
    {
        // 获取传感器数据起始索引
        int force_adr = m->sensor_adr[force_id];
        int torque_adr = m->sensor_adr[torque_id];
        Eigen::Vector3d force_local(d->sensordata[force_adr], d->sensordata[force_adr+1], d->sensordata[force_adr+2]);
        Eigen::Vector3d torque_local(d->sensordata[torque_adr], d->sensordata[torque_adr+1], d->sensordata[torque_adr+2]);
        std::cerr << "force_local: " << force_local.transpose() << std::endl;
        std::cerr << "torque_local: " << torque_local.transpose() << std::endl;
    }
}

http://www.kler.cn/a/597886.html

相关文章:

  • 基于深度学习的图片识别系统(上)
  • DFS深搜
  • AI开源项目
  • 优选算法的睿智之林:前缀和专题(一)
  • 2.2.盈亏平衡分析
  • MySQL 索引下推
  • React 18 如何定义变量,及赋值 与渲染
  • Linux常用的命令
  • [AI速读]混合验证方案:如何高效解决RISC-V向量扩展的验证难题
  • Nginx如何处理请求
  • Modbus协议编程读写流程图大全
  • DeepSeek对KVM环境下创建共享iSCSI存储的指导
  • 使用单调栈在O(n)时间复杂度内计算直方图中的最大矩形面积
  • 数据可视化在商业智能中的应用:从数据到洞察的桥梁
  • 信息安全基础
  • 2059-Authentication plugin ‘caching_sha2_password‘ cannot be loaded
  • 六十天前端强化训练之第二十八天之Composition 函数完全指南
  • 学习c++多线程前,回顾一下Linux的多线程
  • 圆弧插补相关算法汇总(C++和ST源代码)
  • CUDA 学习(4)——CUDA 编程模型