栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

ROS-Control专题:PR2的六个概念【4】

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ROS-Control专题:PR2的六个概念【4】

一、 提要


        ROS-control是ROS的重要概念,而  ROS-control是通过PR2开发而产生的,因此,实质上,吃透PR2实质就是吃透了ROS-control;

        ROS-control的基础是pr2,PR2(Personal Robot 2,个人机器人2代)是Willow Garage公司设计的机器人平台,其中数字2代表第二代机器人。本文将介绍在ROS中的pr2机制,以及对应的接口开发原理。

二、pr2的六个关键
2.1 Pr2的六个关键知识点如下
  • pr2_controller_interface: The C++ interface for a realtime controller
  • pr2_controller_manager: The infrastructure that allows you to run and manage multiple controllers in a realtime loop
  • pr2_hardware_interface: The C++ interface for the PR2 hardware, containing actuators, pressure sensors, accelerometers, digital out and projector interface.
  • pr2_mechanism_model: The model of an effort controlled robot, based on the urdf robot description format.
  • pr2_mechanism_msgs: Messages used to communicate with the realtime control loop, and messages that contain the state of the realtime controllers, the joints and the actuators.
  • realtime_tools: A tool to publish to a ROS topic from realtime.

        本篇主要探讨pr2_mechanism_model

三、 pr2_mechanism_model

        该软件包包含一系列机器人模型(mechanism_model),这些模型是提供给实时控制器(controller_interface)使用,这些实时控制器被管理器(controller manager)所管理。这种机器人模型侧重于在实时控制回路中控制机器人机构,因此它仅包含与实时相关的机器人组件:机器人关节(带有编码器、传动装置和执行器) 和机器人的运动学/动力学模型(kinematic/dynamic model )。

3.1 概要

        pr2_mechanism_model 包包含 pr2_mechanism_model::RobotState C++ 类,它是机器人关节的接口和机器人模型的描述。 RobotState 为关节访问提供轻松方法。要使用包含多个关节的运动链,pr2_mechanism_model 包含一个 pr2_mechanism_model::Chain 工具,该工具表示完整的运动链并与 RobotState 接口。

        下图显示了如何在机器人和仿真中设置机构模型。

 3.2 组件pr2_mechanism_model::RobotState


        pr2_mechanism_model::RobotState 是这个包中的主类。当控制器被初始化时,控制器管理器向控制器传递一个指向 RobotState 的指针(参见控制器接口)。机器人状态描述了机器人的运动学/动力学模型和机器人的当前状态。机器人的状态由机器人中关节的位置/速度/作用力定义。

        机器人的模型(mechanism_model)是一个 urdf 对象,在 urdf 包中定义。此外,RobotState 提供对“控制器时间”的访问,即控制器周期开始的时间。要查看有关如何使用 RobotState 的示例,请查看控制器教程。

3.3 pr2_mechanism_model::JointState


pr2_mechanism_model::RobotState 通过名称提供对其包含的所有 pr2_mechanism_model::JointStates 的访问。要访问 JointState,请使用以下方法:

JointState* js = robot_state_->getJointState(name);

        从 JointState 中,您可以提取关节位置、力量、速度,并命令所需的联合力量:例如,获取从 JointState 测量的关节位置,使用:

double position = js->position_;

或者,要在 JointState 上设置命令努力,请使用:

js->commanded_effort_ = my_command;

        这些教程提供了更多关于如何使用 JointState 的示例。

        JointState 还提供对关节模型的访问权限,其中包含关节类型、轴、参考位置等内容。获取关节类型,使用:

if (js->joint_->type == urdf::Joint::Continuous)
ROS_INFO("这是一个连续的关节");

urdf API 文档提供了所有详细信息。

有关参考文档,请查看代码 api。从 JointState 中,您可以读取测量的位置、测量的速度和测量的努力,并写下命令的努力。

URDF 安全控制器限制
类成员 urdf::Joint::safety

js->joint_->safety

        包含用于配置联合安全控制器位置和速度限制的各种参数。请参阅代码 api 了解更多详细信息。

3.4 (transmission)传输

1】  URDF Transmissions

        传动元件是对 URDF 机器人描述模型的扩展,用于描述执行器和关节之间的关系。这允许对诸如齿轮比和平行连杆之类的概念进行建模。传输转换努力/流量变量,使其产品 - 功率 - 保持不变。多个执行器可以通过复杂的传输连接到多个关节。

下面是一个传输元件的例子:


  transmission_interface/SimpleTransmission
  
    EffortJointInterface
  
  
    50
    EffortJointInterface
  

属性

transmission 对象存在一个属性:

  • name (required)

    • 标定一个 transmission的唯一标志

元素

transmission有下列元素:

  •  (one occurrence一次出现)

    • 标定transmission类型.
  •  (one or more occurrences多次出现)

    • 连接变速器的接头。关节由其名称属性和以下子元素指定:

    •  (one or more occurrences多次出现)

      • 指定受支持的关节空间硬件接口。请注意,在 Gazebo 中加载此传输时,此标签的值应为 EffortJointInterface,在 RobotHW 中加载此传输时,此标签的值应为hardware_interface/EffortJointInterface。

  •  (one or more occurrences)

    • 传动装置所连接的致动器。执行器由其名称属性和以下子元素指定:

    •  (optional可选的'机械减速')

      • 指定关节/执行器传动装置处的机械减速。并非所有传输都需要此标签。

    •  (optional) (one or more occurrences)

      • 指定受支持的关节空间硬件接口。请注意, 标签只能在此处为 Indigo 之前的 ROS 版本指定。指定此标记的正确位置是在 标记中。可以找到有关此的更多详细信息


         pr2_mechanism_model::RobotState 还提供对电机和关节之间传输的访问。通常您不需要变速器,除非您使用一些高级动态模型,或者您正在校准关节。要访问 JointState,请使用以下方法:

Transmission* tr = robot_state_->getTransmission(name);

有关详细信息,请参阅代码 api。有关传输描述格式的详细信息,请查看传输元素页面。

3.5 (Controller time)控制器时间


        每次启动控制器循环时,控制器管理器都会记录时间。所有控制器都可以通过 pr2_mechanism_model::RobotState 访问这个时间。当控制器例如需要计算两个连续更新循环之间的持续时间,它应该使用控制器时间,而不是系统时间。与系统时间相比,控制器时间不受其他控制器在其更新循环中消耗的时间的影响。此外,控制器时间是与硬件通信实际发生时间的最佳度量。要访问控制器时间,请使用:

ros::Time time = robot_state_->getTime();
3.6 机器人模型

        pr2_mechanism_model::RobotState 包含一个 urdf 机器人描述对象。有很多关于 urdf 模型的文档,甚至还有很多教程可供您查看。要访问 urdf 模型,请使用:

urdf::Model m = robot_state_->robot_->robot_model_;
3.7 链(chain)

        pr2_mechanism_model::Chain 类提供了一种使用由多个关节组成的运动链的简单方法。不是通过遍历 RobotState 来找到所有关节,Chain 将拉出给定根和尖端链接之间的所有关节:

pr2_mechanism_model::Chain chain;
chain.init(robot_state, root_name, tip_name);

从链中,您可以获得所有关节的位置/速度/努力,并设置所有关节的努力:

KDL::JointArray jnt_pos;
chain.getPositions(jnt_pos);

KDL::JointArrayVel jnt_pos_vel;
chain.getVelocities(jnt_pos_vel);

KDL::JointArray jnt_eff;
chain.getEfforts(jnt_eff);

KDL::JointArray jnt_eff;
chain.setEfforts(jnt_eff);

您还可以从链中提取 KDL::Chain:

KDL::Chain kdl_chain;
chain.toKDK(kdl_chain);

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1012288.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号