使用 autoDiffToGradientMatrix 时出了点问题

如何解决使用 autoDiffToGradientMatrix 时出了点问题

我使用以下代码生成离散动态梯度矩阵。多次运行相同的 get_dynamics_gradient2() 时,似乎在某些矩阵元素中生成不同的值。从许多测试中我找不到任何明显的错误。你能告诉我怎么改正吗?

#include "drake/common/find_resource.h"
#include "drake/multibody/parsing/parser.h"
#include "drake/multibody/plant/multibody_plant.h"
#include "drake/systems/framework/diagram_builder.h"
#include <Eigen/Dense>
#include "drake/math/autodiff.h"
#include "drake/math/autodiff_gradient.h"
#include "iostream"


using namespace std;
using drake::FindResourceOrThrow;
using drake::multibody::MultibodyPlant;
using drake::multibody::Parser;
using drake::systems::Context;
using drake::systems::InputPort;
using drake::systems::DiagramBuilder;
using Eigen::VectorXd;
using drake::AutoDiffVecXd;
using Eigen::MatrixXd;
using drake::AutoDiffXd;
using drake::math::initializeAutoDiff;
using drake::math::autoDiffToGradientMatrix;
using drake::math::autoDiffToValueMatrix;

MatrixXd get_dynamics_gradient2(std::unique_ptr<MultibodyPlant<AutoDiffXd>>& plant_ad,std::unique_ptr<Context<AutoDiffXd>>& context_ad,const VectorXd& x_val,const VectorXd& u_val) {
  
  AutoDiffVecXd x_ad = initializeAutoDiff(x_val);
  context_ad -> SetContinuousState(x_ad);
  AutoDiffVecXd u_ad = initializeAutoDiff(u_val);
  const InputPort<Eigen::AutoDiffScalar<Eigen::VectorXd>>& actuation_port = plant_ad -> get_actuation_input_port();
  actuation_port.FixValue(context_ad.get(),u_ad);
  auto derivatives = plant_ad -> AllocateTimeDerivatives();
  plant_ad -> CalcTimeDerivatives(*context_ad,derivatives.get());
    
  AutoDiffVecXd xdot_ad = derivatives -> get_vector().CopyToVector();
  AutoDiffVecXd x_next_ad = xdot_ad * 0.1 + x_ad;
    
  MatrixXd x_next = autoDiffToValueMatrix(x_next_ad);
    
  AutoDiffVecXd  x_next_ad_t = x_next_ad.transpose();
  AutoDiffVecXd  u_ad_t = u_ad.transpose();
    
  AutoDiffVecXd xu_next_ad_t(x_next_ad_t.rows()+u_ad_t.rows(),x_next_ad_t.cols());
  
  xu_next_ad_t << x_next_ad_t,u_ad_t;
 
  MatrixXd AB = autoDiffToGradientMatrix(xu_next_ad_t.transpose());
    
  return AB;
}



int main(int argc,char* argv[]) {

    const double time_step = 0;
    DiagramBuilder<double> builder;
    const std::string relative_name = "drake/wc/ll0/acrobot.sdf";
    const std::string full_name = FindResourceOrThrow(relative_name);
    MultibodyPlant<double>& acrobot = *builder.AddSystem<MultibodyPlant>(time_step);
   
    Parser parser(&acrobot);
    parser.AddModelFromFile(full_name);

    acrobot.Finalize();
    
    std::unique_ptr<MultibodyPlant<AutoDiffXd>> plant_ad = MultibodyPlant<double>::ToAutoDiffXd(acrobot);
    std::unique_ptr<Context<AutoDiffXd>> context_ad = plant_ad -> CreateDefaultContext();

    VectorXd x_valp = VectorXd(4);
    x_valp << 1.3,5.8,1.5,0.02;

    VectorXd u_valp= VectorXd(1);
    u_valp << 0.01;


    MatrixXd AB1 = get_dynamics_gradient2(plant_ad,context_ad,x_valp,u_valp);
    MatrixXd AB2 = get_dynamics_gradient2(plant_ad,u_valp);
    MatrixXd AB3 = get_dynamics_gradient2(plant_ad,u_valp);
    MatrixXd AB4 = get_dynamics_gradient2(plant_ad,u_valp);

    cout <<"AB2-AB1" << endl << AB2-AB1 <<endl;
    cout <<"AB3-AB1" << endl << AB3-AB1 <<endl;
    cout <<"AB4-AB1" << endl << AB4-AB1 <<endl;

  return 0;
}

结果如下:

AB2-AB1
          0           0           0           0
          0           0           0           0
          0           0    0.735961    0.377986
          0           0    -1.47292   -0.756483
          0 1.73059e-77     1.96356           0
AB3-AB1
          0           0           0           0
          0           0           0           0
          0           0    -0.35439    -0.35439
          0           0     0.70926     0.70926
          0 1.73059e-77    0.963558           0
AB4-AB1
           0            0            0            0
           0            0            0            0
           0            0      1.28067      1.50475
           0            0     -2.56308     -3.01153
           0 2.90227e-157     0.963558            0

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res