转摘ROS-Control专题:PR2的六个概念【6】

度绍元阅读量 43

一、 摘要

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

PR2(人形机器人2代)有两条手臂,每条手臂七个关节,手臂末端是一个可以张合的夹爪;PR2依靠底部的四个轮子移动,在头部、胸部、肘部、夹爪上分别安装有高分辨率摄像头、激光测距仪、惯性测量单元、触觉传感器等丰富的传感设备。在PR2的底部有两台八核电脑作为机器人各硬件的控制和通信中枢,并且都安装了Ubuntu和ROS系统。

PR2和ROS有千丝万缕的关系,可以说ROS产生于PR2,也促成了PR2。ROS原本是Willow Garage为复杂的PR2机器人平台设计的软件框架,依靠强大的ROS,PR2可以独立完成多种复杂的任务,例如PR2可以自己开门、找到插头给自己充电、打开冰箱取出啤酒、打简单的台球等等。只不过PR2价格高昂,而且能力还达不到商业应用的要求,如今主要用于学术研究。

可见,PR2是ROS中元老级的机器人平台,所有软件代码依托于ROS,并且全部在ROS社区中开放源代码,为我们学习、应用ROS提供了丰富的资源。

二、Pr2的几个关键机制

pr2_mechanism 堆栈包含在硬实时控制循环中控制 PR2 机器人的基础设施。

如果您想编写一个实时控制器与 PR2(或类似)机器人交互,pr2_mechanism 堆栈包含有用的库。这些库包含在以下 ROS 包中:

  • [pr2_controller_interface](https://wiki.ros.org/pr2_controller_interface "pr2_controller_interface"): The C++实时控制接口。interface for a realtime controller

  • [pr2_controller_manager](https://wiki.ros.org/pr2_controller_manager "pr2_controller_manager"): 允许您在实时循环中运行和管理多个控制器的基础架构

  • [pr2_hardware_interface](https://wiki.ros.org/pr2_hardware_interface "pr2_hardware_interface"): The C++ PR2 硬件接口,包含执行器、压力传感器、加速度计、数字输出和投影仪接口。

  • [pr2_mechanism_model](https://wiki.ros.org/pr2_mechanism_model "pr2_mechanism_model"): 努力控制机器人的模型,基于 urdf 机器人描述格式。

  • [pr2_mechanism_msgs](https://wiki.ros.org/pr2_mechanism_msgs "pr2_mechanism_msgs"): 用于与实时控制回路通信的消息,以及包含实时控制器、关节和执行器状态的消息。

  • [realtime_tools](https://wiki.ros.org/realtime_tools "realtime_tools"): 一种实时发布到 ROS 主题的工具。

三、realtime_tools

包含一组可以从硬实时线程使用的工具,而不会破坏实时行为。

3.1 实时发布者

realtime_tools::RealtimePublisher 允许编写 C++ 实时控制器的用户通过硬实时循环在 ROS 主题上发布消息。普通的 ROS 发布者不是实时安全的,不应该在实时控制器的更新循环中使用。实时发布者是 ROS 发布者的包装器;包装器创建了一个额外的非实时线程,用于在 ROS 主题上发布消息。下面的示例显示了实时控制器的 init() 和 update() 方法中实时发布者的典型用法:

复制代码
#include <realtime_tools/realtime_publisher.h>

bool MyController::init(pr2_mechanism_model::RobotState *robot,
                        ros::NodeHandle &n)
{
  ...

  realtime_pub = new 
    realtime_tools::RealtimePublisher<mgs_type>(n, "topic", 4);
  return true;
}


void MyController::update()
{
  if (realtime_pub->trylock()){
    realtime_pub->msg_.a_field = "hallo";
    realtime_pub->msg_.header.stamp = ros::Time::now();
    realtime_pub->unlockAndPublish();
  }
  ...
}

参考文:

[GitHub - PR2/pr2_mechanism: Infrastructure to control the PR2 robot in a hard realtime control loop.](https://github.com/pr2/pr2_mechanism "GitHub - PR2/pr2_mechanism: Infrastructure to control the PR2 robot in a hard realtime control loop.")

复制代码
    ===========================
    【来源: CSDN】
    【作者: 无水先生】
    【原文链接】 https://yamagota.blog.csdn.net/article/details/125745150
    声明:转载此文是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系,我们将及时更正、删除,谢谢。
标签: PRROSpr实时
0/300
全部评论0
0/300