31.Isaac教程--规划器代价

news2024/11/16 22:32:00

规划器代价

在这里插入图片描述
ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html

文章目录

  • 规划器代价
    • 组件
    • 入门
    • 通过应用程序图自定义成本

导航本地规划器基于线性二次调节器 (LQR) 规划器。 它通过生成最小化成本函数的轨迹来工作。 不幸的是,没有适用于所有应用程序的单一成本函数; 因此,为您自己的应用定制成本函数非常重要。 这是 PlannerCost 和 PlannerCostBuilder 发挥作用的地方:

PlannerCost 提供了一个接口来生成成本函数:

class PlannerCost {
 public:
  // Returns true if the current state is valid.
  virtual bool isValid(double time, const VectorXd& state);

  // Returns the evaluation at a given state and time.
  virtual double evaluate(double time, const VectorXd& state) = 0;

  // Adds the gradient of this cost function for the given state to the given vector `gradient`.
  // `gradient` uses a Ref<VectorXd> to allow block operation to passed to this function.
  virtual void addGradient(double time, const VectorXd& state,
                           Eigen::Ref<Eigen::VectorXd> gradient) = 0;

  // Adds the hessian of this cost function for the given state to the given matrix `hessian`.
  // `hessian` uses a Ref<VectorXd> to allow block operation to passed to this function.
  virtual void addHessian(double time, const VectorXd& state,
                          Eigen::Ref<Eigen::MatrixXd> hessian) = 0;
};

PlannerCostBuilder 提供了一个组件接口来将 Planner 成本添加到您的应用程序中:

class PlannerCostBuilder : public alice::Component {
 public:
  // Creates the cost function initially. Makes sure all necessary memory required for subsequent
  // calls to `update` is allocated.
  virtual PlannerCost* build() = 0;

  // Prepares the cost function for the given time interval.
  // Does not do any dynamic memory allocations.
  virtual void update(double start_time, double end_time) {}

  // Destroys the cost function and all memory which was allocated during `build`.
  virtual void destroy() = 0;

  // Returns a pointer to the maintained cost function
  virtual PlannerCost* get() = 0;
};

组件

主要组件是isaac.planner_cost.PlannerCostBuilder,是新增PlannerCost的接口。

以下是已在 Isaac SDK 中实现并可供使用的成本函数:

  • isaac.planner_cost.AdditionBuilder:用来把几个成本加在一起。

  • isaac.planner_cost.SmoothMinimumBuilder:用于计算成本列表的最小值。 它不是确切的最小值,而是可微分的近似值。

  • isaac.planner_cost.RangeConstraintsCostBuilder:帮助您创建基于状态的二次成本。 您可以定义最小值和最大值,如果状态超出此范围,将创建二次成本。

  • isaac.planner_cost.DistanceQuadraticCostBuilder:期望 PlannerCost 返回距离。 它将根据目标距离和实际距离创建二次成本。

  • isaac.planner_cost.ObstacleDistanceBuilder:返回障碍物的有符号距离。 它本身不是成本函数,但可以与 isaac.planner_cost.DistanceQuadraticCostBuilder 一起使用来创建二次成本函数。

  • isaac.planner_cost.CirclesUnionSmoothDistanceBuilder:这是一个辅助函数,用于为 RobotShape 的所有圆调用另一个 PlannerCost 函数。

入门

您可以运行 Flatsim 以查看 Navigation local planner 的执行情况:

bazel run //packages/flatsim/apps:flatsim -- --demo demo_1

如果您想创建自己的成本函数,您应该首先确定 packages/planner_cost/gems 中的现有成本是否满足您的需要。 如果这些成本都不够,您将需要首先创建一个实现 PlannerCost 接口的类。

例如,让我们看一下 ScalarMultiplication,它将 PlannerCost 作为输入并将其乘以一个常数:

// This is an implementation of PlannerCost.
// It takes another PlannerCost and simply multiplies by a constant value.
class ScalarMultiplication : public PlannerCost {
 public:
  ScalarMultiplication(PlannerCost* cost, double constant) : cost_(cost), constant_(constant) {}

  // Returns true if the current state is valid. Here we will just rely on the other PlannerCost
  bool isValid(double time, const VectorXd& state) override {
    return cost_->isValid(time, state);
  }

  // Returns the evaluation at a given state and time.
  // We can multiply the result of cost_->evaluate() by our constant.
  double evaluate(double time, const VectorXd& state) override {
    return constant_ * cost_->evaluate(time, state);
  }

  // Adds the gradient of this cost function for the given state to the given vector `gradient`.
  // `gradient` uses a Ref<VectorXd> to allow block operation to passed to this function.
  // We need to scale the gradient by our constant.
  void addGradient(double time, const VectorXd& state, Eigen::Ref<VectorXd> gradient) override {
    VectorXd tmp_gradient = VectorXd::Zero(gradient.size());
    cost_->addGradient(time, state, tmp_gradient);
    gradient += tmp_gradient * constant_;
  }

  // Adds the hessian of this cost function for the given state to the given matrix `hessian`.
  // `hessian` uses a Ref<VectorXd> to allow block operation to passed to this function.
  // We need to scale the hessian by our constant.
  void addHessian(double time, const VectorXd& state, Eigen::Ref<MatrixXd> hessian) override {
    MatrixXd tmp_hessian = MatrixXd::Zero(hessian.rows(), hessian.cols());
    cost_->addHessian(time, state, tmp_hessian);
    hessian += tmp_hessian * constant_;
  }

 private:
  // Hold another cost_
  PlannerCost* cost_ = nullptr;
  double constant_ = 1.0;
};

获得新的 PlannerCost 后,您可以使用自定义构建器,如下所示。 请注意,它必须实现接口 PlannerCostBuilder:

class ScalarMultiplicationBuilder : public PlannerCostBuilder {
 public:
  // Creates the cost function initially. Makes sure all necessary memory required for subsequent
  // calls to `update` is allocated.
  PlannerCost* build() override {
    builder_ = node()->app()->findComponentByName<PlannerCostBuilder>(get_component_name());
    ASSERT(builder_ != nullptr,
           "Failed to load the component: %s", get_component_name().c_str());
    cost_.reset(new ScalarMultiplication(builder_->build(), get_constant()));
    return static_cast<PlannerCost*>(cost_.get());
  }

  // Prepares the cost function for the given time interval.
  // Does not do any dynamic memory allocations.
  void update(double start_time, double end_time) override {
    builder_->update(start_time, end_time);
  }

  // Destroys the cost function and all memory which was allocated during `build`.
  void destroy() override {
    cost_.reset();
    builder_->destroy();
  }

  // Returns a pointer to the maintained cost function
  PlannerCost* get() override {
    return static_cast<PlannerCost*>(cost_.get());
  }

  // Name of the component implementating a PlannerCostBuilder to be used as distance function
  ISAAC_PARAM(std::string, component_name);

  // Constant multiplication factor
  ISAAC_PARAM(double, constant, 20.0);

 private:
  std::unique_ptr<ScalarMultiplication> cost_;
  PlannerCostBuilder* builder_;
};

我们现在有一个新的 PlannerCost,我们可以使用它来扩展任何现有的 PlannerCost。 我们也有一个建造者。 在下一节中,我们将研究如何扩展现有导航图以扩展现有成本。

通过应用程序图自定义成本

要自定义图形,请编辑 packages/navigation/apps/differential_base_control.subgraph.json 文件。

首先,您应该找到包含所有构建器的节点:

{
  "name": "lqr_state_cost",
  "components": [
    {
      "name": "TotalSum",
      "type": "isaac::planner_cost::AdditionBuilder"
    },
    {
      "name": "LimitRange",
      "type": "isaac::planner_cost::RangeConstraintsCostBuilder"
    },
    {
      "name": "TargetRange",
      "type": "isaac::planner_cost::RangeConstraintsCostBuilder"
    },
    {
      "name": "SmoothMinimumBuilder",
      "type": "isaac::planner_cost::SmoothMinimumBuilder"
    },
    {
      "name": "CirclesUnionSmoothDistanceBuilder",
      "type": "isaac::planner_cost::CirclesUnionSmoothDistanceBuilder"
    },
    {
      "name": "ObstacleLocalMap",
      "type": "isaac::planner_cost::ObstacleDistanceBuilder"
    },
    {
      "name": "ObstacleRestrictedArea",
      "type": "isaac::planner_cost::ObstacleDistanceBuilder"
    },
    {
      "name": "DistanceQuadraticCostBuilder",
      "type": "isaac::planner_cost::DistanceQuadraticCostBuilder"
    }
  ]
},
{
  "name": "lqr_control_cost",
  "components": [
    {
      "name": "RangeConstraintsCostBuilder",
      "type": "isaac::planner_cost::RangeConstraintsCostBuilder"
    }
  ]
},

lqr_state_cost 包含用于计算与沿轨迹状态相关的成本的构建器列表,而 lqr_control_cost包含与控制相关的成本。

再往下,您可以找到与这些成本关联的配置参数:

"lqr": {
  "isaac.lqr.DifferentialBaseLqrPlanner": {
    ...
    "state_planner_cost_name": "$(fullname lqr_state_cost/TotalSum)",
    "control_planner_cost_name": "$(fullname lqr_control_cost/RangeConstraintsCostBuilder)"
    ...
  }
},

这里我们定义了与控制相关的成本的根和与状态相关的根:

  • 对于控件,我们有一个类型为 isaac.planner_cost.RangeConstraintsCostBuilder 的成本

  • 对于状态,根是 isaac.planner_cost.AdditionBuilder 类型,这意味着我们将添加成本列表。 查看 TotalSum 的配置,我们可以找到添加了哪些成本:

"TotalSum": {
  "component_names": [
    "$(fullname lqr_state_cost/DistanceQuadraticCostBuilder)",
    "$(fullname lqr_state_cost/LimitRange)",
    "$(fullname lqr_state_cost/TargetRange)"
  ]
},

添加了三个成本来计算最终成本:

  • 其中两个是 isaac.planner_cost.RangeConstraintsCostBuilder 类型。

  • 最后一个是 isaac.planner_cost.DistanceQuadraticCostBuilder 类型。 这是另一个递归调用,它依赖于另一个 isaac.planner_cost.CirclesUnionSmoothDistanceBuilder 类型的 Builder,它本身依赖于 isaac.planner_cost.SmoothMinimumBuilder 类型的 Builder,它计算 isaac.planner_cost.ObstacleDistanceBuilder 列表的最小值:

"DistanceQuadraticCostBuilder": {
  "component_name": "$(fullname lqr_state_cost/CirclesUnionSmoothDistanceBuilder)"
},

"CirclesUnionSmoothDistanceBuilder": {
  "component_name": "$(fullname lqr_state_cost/SmoothMinimumBuilder)"
},

"SmoothMinimumBuilder": {
  "component_names": [
    "$(fullname lqr_state_cost/ObstacleLocalMap)",
    "$(fullname lqr_state_cost/ObstacleRestrictedArea)"
  ]
},

"ObstacleLocalMap": {
  "obstacle_name": "local_map"
},
"ObstacleRestrictedArea": {
  "obstacle_name": "map/restricted_area"
},

这乍一看可能很复杂——让我们从头开始分析:

  • ObstacleLocalMap 和 ObstacleRestrictedArea 都从 Atlas 加载障碍物并返回从 2d 到障碍物的有符号距离。

  • SmoothMinimumBuilder 有助于估算最小距离——最终,我们想知道机器人离最近的障碍物有多近。 如果你需要处理更多的障碍,这将是一个添加的好地方。

  • CirclesUnionSmoothDistanceBuilder 是一个帮助计算距离的辅助函数,不仅适用于单个 2d 点,还适用于 SphericalRobotShape 中的所有圆。 它将从障碍物列表中返回机器人的距离。

  • 最后 isaac.planner_cost.DistanceQuadraticCostBuilder 需要一个距离函数并计算成本: 0.5 ∗ g a i n ∗ m i n ( 0 , d i s t a n c e ( s t a t e ) − t a r g e t d i s t a n c e − a l p h a ∗ s p e e d ) 2 0.5*gain*min(0,distance(state)−targetdistance−alpha*speed)^2 0.5gainmin(0,distance(state)targetdistancealphaspeed)2。 我们只需传递由 CirclesUnionSmoothDistanceBuilder 计算的距离函数。

让我们探讨如何修改上面的示例以添加自定义成本函数。 假设您有以下内容:

  • 一个新的 CustomDistanceBuilder,它返回到某些障碍物的距离,但以厘米为单位。

  • 我们在上面定义的 ScalarMultiplicationBuilder

现在我们需要结合两者来计算以米为单位的距离,我们需要将它添加到障碍物列表中。 首先,我们需要将这两个组件添加到我们的节点:


{
  "name": "lqr_state_cost",
  "components": [
    {
      "name": "TotalSum",
      "type": "isaac::planner_cost::AdditionBuilder"
    },
    ...
    {
      "name": "DistanceQuadraticCostBuilder",
      "type": "isaac::planner_cost::DistanceQuadraticCostBuilder"
    },
    {
      "name": "ScalarMultiplicationBuilder",
      "type": "isaac::planner_cost::ScalarMultiplicationBuilder"
    },
    {
      "name": "CustomDistanceBuilder",
      "type": "isaac::planner_cost::CustomDistanceBuilder"
    }
  ]
},

之后,我们需要为他们创建配置:

"lqr_state_cost": {
  ...
  "ScalarMultiplicationBuilder": {
    "component_name": "$(fullname lqr_state_cost/CustomDistanceBuilder)",
    "constant": 100.0
  },
  "CustomDistanceBuilder": {
    ...
  }
}

最后,我们需要将新距离添加到现有障碍列表中:

"SmoothMinimumBuilder": {
  "component_names": [
    "$(fullname lqr_state_cost/ObstacleLocalMap)",
    "$(fullname lqr_state_cost/ObstacleRestrictedArea)",
    "$(fullname lqr_state_cost/ScalarMultiplicationBuilder)"
  ]
},

我们已经使用自定义构建器成功添加了一个新障碍。

更多精彩内容:
https://www.nvidia.cn/gtc-global/?ncid=ref-dev-876561

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/174789.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Allegro如何输出第三方网表操作指导

Allegro如何输出第三方网表操作指导 在做PCB设计的时候,会需要输第三方网表,Allegro支持快速输出第三方网表,如下图 具体操作如下 选择File选择Export

Leetcode:39. 组合总和、40. 组合总和 II(C++)

目录 39. 组合总和&#xff1a; 问题描述&#xff1a; 实现代码与解析&#xff1a; 回溯&#xff1a; 原理思路&#xff1a; 剪枝版&#xff1a; 40. 组合总和 II&#xff1a; 问题描述&#xff1a; 实现代码与解析&#xff1a; 回溯&#xff1a; 原理思路&#xff…

函数——“C”

各位CSDN的uu们新年快乐呀&#xff0c;祝大家越来越开心&#xff0c;越来越优秀。那行&#xff0c;让我们进入今天的正题&#xff0c;来了解了解函数&#xff0c;函数是什么&#xff0c;C语言中函数是如何分类的&#xff0c;函数参数&#xff0c;函数调用等一系列小知识点&…

文件操作详解-IO

目录 1.认识文件 2.文件的类型 3.java对文件的操作 针对文件系统操作 针对文件内容操作 字节流 字符流 字节流的使用 字符流的使用 4.文件IO小程序练习 示例1 示例2 1.认识文件 狭义的文件指的是硬盘上的文件和目录 广义的文件泛指计算机中的很多的软硬件资源,操…

3小时精通opencv(二)图片的常用操作

3小时精通opencv(二)图片的常用操作 参考视频资源:3h精通Opencv-Python 文章目录3小时精通opencv(二)图片的常用操作灰度图像高斯滤波边缘检测膨胀函数腐蚀函数整体代码灰度图像 img cv2.imread(Resources/lena.png) imgGray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.im…

【C++】位图 | 布隆过滤器

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;哈希函数…

添加选课模块分析

1 模块需求分析 1.1 模块介绍 本模块实现了学生选课、下单支付、学习的整体流程。 网站的课程有免费和收费两种&#xff0c;对于免费课程学生选课后可直接学习&#xff0c;对于收费课程学生需要下单且支付成功方可选课、学习。 选课&#xff1a;是将课程加入我的课程表的过…

论文投稿指南——中文核心期刊推荐(水利工程)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

大展宏图、首创基于.NET 7强大内核-Zoomla!逐浪CMS v8.7.0发布

2022年底&#xff0c;微软 .NET Conf 在线活动正式开幕。作为微软开源、跨平台开发平台&#xff0c;.NET 7 现已推出首个正式版&#xff0c;这也代表微软的“统一工作”终于完成。 使用 .NET 7 可以轻松地将 .NET 7 项目容器化&#xff0c;在 GitHub 操作中设置 CI / CD 工作流…

拔高法三视图

拔高法最主要的就是俯视图&#xff0c;是三视图的根基&#xff0c;看主视图和侧视图&#xff0c;顶点位置在底面(俯视图)范围内&#xff0c;不在则不能拔高&#xff1b;俯视图有虚线不能拔高 首先标出俯视图所有结点&#xff0c;并且画出俯视图所对应的直观图。用斜二测画法 …

Spring Cloud 中的OpenFeign+Ribbon详解

1 spring cloud 远程调用没有看过的小伙伴可以点击传送门先去了解Nacos。有了Nacos做注册中心后&#xff0c;我们就可以获取其他服务的地址进行调用了。远程调用就需要用到我们今天的主角OpenFeign&#xff0c;如果被调用服务存在多个实例就需要进行负载均衡&#xff0c;负载均…

给定两个数组x和hp,长度都是N。 x数组一定是有序的,x[i]表示i号怪兽在x轴上的位置 hp数组不要求有序,hp[i]表示i号怪兽的血量

题目描述 给定两个数组x和hp&#xff0c;长度都是N。 x数组一定是有序的&#xff0c;x[i]表示i号怪兽在x轴上的位置 hp数组不要求有序&#xff0c;hp[i]表示i号怪兽的血量 为了方便起见&#xff0c;可以认为x数组和hp数组中没有负数。 再给定一个正数range&#xff0c;表示如果…

Vue 快速入门(二)

1、Vue浏览器插件安装 安装地址 https://devtools.vuejs.org/guide/installation.html下载完后&#xff0c;直接将vuejs-devtools.crx文件拖到Chrome浏览器扩展程序中去即可。如图&#xff1a; 2.安装完成后&#xff0c;试试效果&#xff0c;我们打开之前写的hello.html页面看…

32.Isaac教程--操纵运动规划

操纵运动规划 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html Isaac SDK 为机械臂的运动规划提供了以下组件&#xff1a; EndEffectorGlobalPlanner&#xff1a;使用逆运动学将末端执行器的笛卡尔目标转换为关节角度目标。 此小码可以接收笛卡尔…

云原生技能树-容器镜像制作、发布、拉取和运行

创建仓库 请在你自己的 gitcode.net 上创建一个仓库&#xff0c;命名为cloud_native_hello_py&#xff0c;目录结构如下&#xff1a; . ├── .dockerignore ├── .gitignore ├── Dockerfile ├── README.md └── src├── main.py└── requirements.txt其中 ma…

avb校验相关与块校验原理

一、启动校验流程 edk2/QcomModulePkg/Library/avb/VerifiedBoot.c DEBUG ((EFI_D_ERROR, "LoadImageAndAuth failed %r\n", Status)); in LoadImageAndAuth()edk2/QcomModulePkg/Application/LinuxLoader/LinuxLoader.c DEBUG ((EFI_D_ERROR, "LoadImageAndAu…

docker部署redis后,修改配置文件的requirepass后无效

解决方案 执行docker run命令时不要使用参数–requirepass docker部署redis流程&#xff08;问题复现&#xff09; 1. 启动redis容器 在服务器docker运行时&#xff0c;执行下列命令。&#xff08;会自动在远程仓库下载镜像&#xff09; redis: docker run \ --restartalw…

高等数学【合集】

文章目录极限计算求导计算极限计算 第一步:先看x→value确定类型第一步:先看x \rightarrow value确定类型第一步:先看x→value确定类型 7种未定型:∞∞,00,1∞,0∞,∞0,00,∞−∞7种未定型: \frac{\infty}{\infty},\frac{0}{0},1^{\infty},0^{\infty},\infty^0,0^0,\infty-\inf…

win10开机后桌面无图标问题解决办法

本篇文章主要讲解win10下桌面无图标的问题解决办法。 日期&#xff1a;2023年1月21日 作者&#xff1a;任聪聪 主要原因&#xff1a; 这个问题的原因是资源管理器或者注册表中有垃圾注册数据导致&#xff0c;实际上和显卡没有任何关系&#xff0c;但有些情况是由于驱动问题导致…

OSPF 特殊区域介绍、Stub、Totally Stub、NSSA、Totally NSSA

1.1.0 路由 OSPF 特殊区域介绍、Stub、Totally Stub、NSSA、Totally NSSA 特殊区域的产生和注意事项 产生&#xff1a;OSPF通过划分区域减小网络内路由器的LSDB的规模。对于那些位于AS边界的非骨干区域如果该设备是较为低端的路由器&#xff0c;则无法承受过多的路由条目。为此…