1 软件中间层需求
机器人系统复杂性的增加要求增加了相应控制软件的复杂性。尽管临时解决方案很容易实现,但重要的是考虑可扩展性,灵活性和可移植性开发的软件。 使用相同软件的可能性控制多个平台可能非常重要简化了测试,调整和部署不同机器人上的控制器。
我们处理控制从更一般的角度来看问题,而不是限制用户要使用基于任务的方法。 当我们考虑一个通用控制系统,我们通常确定三个主要组成部分
- 机器人本体模型
- 机器人反馈控制器数据
- 机器人驱动器
任何面向控制的软件库都必须提供上述内容功能可以使用。 鉴于机器人的复杂性系统可能很困难,耗时且容易出错直接在底层编程中编写控制器语言,例如C ++。 但是,控制库必须高效,因为通常需要快速控制回路。前述要求是推动创新的动力。这种控制库中基于模型的驱动方法。
在本文中,我们提出了一个软件抽象层,该层负责将控制软件解耦:
- 解耦用于获取状态反馈的实际接口;
- 解耦实际发送命令指令的接口;
- 解耦机器人动力学和运动学计算库;
2 系统动力学
对于一个自由漂浮机器人系统,系统的实际状态可以采用
机器人动力学方程可以统一标识如下所示
机器人控制采用PD控制+重力补偿
3 YARP 组成
YARP即 Yet Another Robot Platforms,今天的YARP是长期软件开发平台实时,计算密集型,并涉及各种变化硬件。
在YARP中,端口是一个活动对象,用于管理给定数据单元的多个连接(输入或输出)
采用一个软件抽象层来简化创建过程用于高度冗余机械的全身控制器系统。 鉴于先前介绍的要求本节将重点介绍必须存在的四个主要要素在库中,即执行器,传感器,状态和模型。 库提供的抽象使人们也可以轻松实现更高级别的接口,例如SimulinkR接口。
最主要的四部分包括了
执行器元素抽象了实际的控制机器人马达。 特别是它显示了可能的马达可控制的模式,例如 位置控制,速度控制和转矩控制。 当然也提供了底层控制器的参数设定。
传感器模块是与执行器相对应的,该模块代表着机器人系统所有的状态信息。包括了编码器、力和力矩传感器以及加速度计等。
状态元素代表所有可能的信息可以在机器人上进行测量或估算。 这意味着该状态包含传感器提供的信息元件。 此外,它还提供了其他信息,可能来自对数据的估计或过滤。 例如,
如果机器人仅提供关节位置测量值,例如来自联合编码器,一阶和二阶导数滤波器可以提供速度和加速度测量值。
具体的实现方式主要分为两个库:
wholeBodyInterface:四个要素即表示执行器,传感器,状态和模型作为抽象。 此外,该库提供了实用程序识别各种自由度。因为它代表了抽象的编码副本库,WholeBodyInterface不会影响机器人框架或数据的组织方式,仅使用本机C ++类型。
yarpWholeBodyInterface: yarpWholeBodyInterface是wholeBodyInterface实际的体现。包括链接运动学和动态学库iDynTree库以及模型参数的URDF 加载。
Program1
//Properties.
// - Fill with model URDF path
// - Yarp controlboard mapping
yarp::os::Property wbiProperties = ...;
//create an instance of wbi
wbi::wholeBodyInterface* m_robot =
new yarpWbi::yarpWholeBodyInterface(
"PD plus gravity",
10 wbiProperties);
if (!m_robot) {
return false;
}
//Create list of controllable joints
wbi::IDList controlledJoints = ...;
m_robot->addJoints(controlledJoints);
if (!m_robot->init()) {
return false;
}
program2
wbi::Frame w_H_b; //identity + zero vector
//read state
robot->getEstimates(wbi::ESTIMATE_JOINT_POS,
positions);
robot->getEstimates(wbi::ESTIMATE_JOINT_VEL,
velocities);
//use model to compute feedforward
robot->computeGravityBiasForces(
positions,
w_H_b,
grav,
gravityCompensation);
//compute feedback.
for (int i = 0; i < robot->getDoFs(); i++) {
error(i) = positions(i) - reference(i);
torques(i) = gravityCompensation(i + 6)
- kp(i) * error(i)
- kd(i) * velocities(i);
}
//send desired torques to the robot
robot->setControlReference(torques);
4 实验
下面是基于动量的iclub平衡控制实验demo,实验是在yarp 种搭建完成。程序链接。视频如下:
5 安装
YARP的安装如下所示
- On Linux:
sudo apt-get install cmake libace-dev
git clone https://github.com/robotology/yarp
cd yarp && mkdir build && cd build && cmake .. && make
sudo make install # Optional
入门指导 http://www.yarp.it/yarp_pointcloud.html