Quick Start From Github

Get the git repo with the source

1
2
3
4
$ git clone https://github.com/Galaxy2416/galaxy2416.github.com.git
$ cd galaxy2416.github.com.git
$ git fetch -all
$ git checkout -b hexo origin/hexo

Init from source

1
2
$ npm install --save 
$ npm install hexo-server --save

Git Configration for github

Set User name and email

1
2
3
# Use your own name and email
git config --global user.name "galaxy2416"
git config --global user.email "gin@mail.dlut.edu.cn"

Check SSH key

1
2
cd ~/.ssh
ls

Generate SSH key

1
2
# Use own email
ssh-keygen -t rsa -C "gin@mail.dlut.edu.cn"

get the id_rsa和id_rsa.pub(default)

Add key to ssh-agent

1
2
3
4
# start the ssh-agent in the background
eval "$(ssh-agent -s)"
# add the key
ssh-add ~/.ssh/id_rsa

Github to set the SSH key from id_rsa.pub

1
2
3
# Test
ssh -T git@github.com
# Hi galaxy2416! You’ve successfully authenticated, but GitHub does not provide shell access.

Effective C++ 之55个小技巧

Accustoming Yourself to C++

Item 01

C++ = C + OOC + template + STL

Item 02

尽量用 const, enum, inline 替换 #define

Item 03 尽可能的使用 const

  1. 常亮
  2. 指针
  3. 函数

两个概念:

  • bitwise constness(C++使用)
  • logical constness (使用mutible来实现)

const_cast 可以作为转型解除掉const

Item 04 确认对象使用前已经被初始化

  • 为内置对象进行手工初始化,因为C++不保证他们。
  • 构造函数最好使用成员初始化列表。排列顺序应该和生命顺序一致。

技巧:使用 member initialization list

dom::function()
:member1(xxx)
:member2(xxx)
.....
  • 为免除“跨编译单元之初始化次序”问题,用local static对象替代non-local static对象。

构造/析构/赋值运算

Item 05 了解C++默默编写并调用哪些函数

  • 编译器会暗自为class创建default创建构造,copy构造,copy assignment操作符,以及析构函数。

Item 06 不想使用编译器自动生成的函数,应该明确拒绝

  • 设置为private或者使用Uncopyable这种base class也是一种做法。
  • C++ 14 提供了delete的函数。

Item 07 对多态基类声明 virtual 析构函数

  • polymorphic base class应该声明一个virtual析构函数,如果class带有任何virtual函数,他就应该拥有一个virtual函数。
  • classes的设计目的如果不是作为base classs使用, 或者不是为了具备polymorphically, 就不应该声明virtual析构函数。

Item 08 别让异常逃离析构函数

  • 析构函数绝对不要吐出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们或程序结束。
  • 如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数(非在析构函数中)执行该操作。

Item 09 绝不在构造和析构过程中调用virtual函数

  • 在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class(比起当前执行构造和析构函数的那层)

Item 11 在operator=中处理“自我赋值”

Class& Class::operator=(const Class& rhs)
{
    if (this == &rhs) return *this // 认同测试
    ……        
    return *this
}
  • 确保当对象自我赋值时 operator= 有良好行为。其中技术包括比较“来源对象”和“目标对象”的地址、精心周到的语句顺序、以及copy-and-swap。

copy-and-swap 技术和“异常安全性”有密切的联系。

  • 确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。

Item 12 复制对象时勿忘其每一个成分

  • Copying函数应该确保复制“对象内的所有成员变量”以及”所有base class成分”。
  • 不要尝试以某个copying函数实现另一个copying函数。应该将共同机能放进第三个函数中,并由两个copying函数共同调用。

资源管理

Item 13 以对象管理资源

  • 为防止资源泄露,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源。
  • 两个常被使用的RAII classes分别是tr1::shared_ptr和auto_ptr (实际上已经在C++11之后的标准库中),shared的行为通常比较直观。auto_ptr会使被复制物为null,因此在新版本中尽量不宜使用。

Item 14 在资源管理类中小心copying行为

  • 复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为。
  • 普遍而常见的RAII class copying 行为是: 抑制 copying、施行计数法(reference counting)。不过其他行为也都可能被实现。

Item 15 在资源管理类中体工队原始资源的访问

  • API往往要求访问原始资源(raw resources),所以每一个RAII class应该提供一个“取得其所管理之资源”的办法。
  • 对原始资源的访问可能经由显式转换后者隐式转换(operator()隐式转换函数)。显式转换更安全,隐式转换对客户比较方便。

Item 16 成对使用new和delete时要采取相同的形式

  • 如果你在new表达式中使用[],必须在相应的delete表达式中也使用[]。如果你在new表达式中不使用[],一定不要在相应的delete表达式中使用[]。

Item 17 以独立语句讲newed对象置入智能指针

Java和C#都是以特定的次序完成函数参数的核算。

  • 以独立语句将newed对象存储于(置于)智能指针内。如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄露。

分离语句:

shared_ptr<xx> pw(new xx);
process(pw,.....);

因为可能new后的指针还未被管理,因为其他事情(顺序不确定)而导致异常。

设计与声明

Item 18 让接口容易被正确使用,不容易被误用

  • 好的接口容易被正确使用,不容易被误用。你应该在你的所有接口中努力达成这些性质。
  • “促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容。
  • “阻止使用”的办法包括建立新类型、限制类型上的操作,束缚对象值,以及消除客户的资源管理责任。
  • shared_ptr支持定制型删除器。这可防范DLL问题,可被用来自动解除互锁问题。(把Unlock作为deleter)

Item 19 设计class有如设计type

  • 新的type对象应该如何被创建和销毁?
  • 对象的初始化和对象的赋值该有什么样的差别?
  • 新type的对象如果被passed by value,意味着什么?
  • 什么是新type的“合法值”?
  • 你的新type需要配合某个inheritance graph吗?
  • 你的新type需要什么样的转换?
  • 什么样的操作符和函数对此新type而言是合理的?
  • 什么样的标准函数应该驳回?
  • 谁该取用新type的成员?
  • 什么是新type的“未声明接口”
  • 你的新type有多么一般化?

Item 20 宁以pass-by-reference-to-const 替换 pass-by-value

  • 尽量以pass-by-reference-to-const 替换 pass-by-value。 前者通常比较高效,并且可以避免切割问题(slicing problem)
  • 以上规则并不适用于内置类型,以及STL的迭代器和函数对象。对他们而言,pass-by-value往往比较适当。

Item 21 必须返回对象时,别忘想返回其reference

  • 绝对不要返回pointer或reference指向一个local stack对象,或返回reference指向一个heap-allocated对象,或返回pointer或reference指向一个local static对象而有可能同时需要多个这样的对象。

Item 22 将成员变量声明为private

  • 切忌将成员变量声明为private。
  • protected 并不比 public更具有封装性。

Item 23 宁以non-member、non-friend替换member函数。

  • 这样做可以增加封装性、包裹弹性和技能扩充性。

Item 24 若所有参数皆需类型转换,请为此采用non-member函数

  • 如果需要为某个函数的所有参数(包括被this所指的那个隐喻参数)进行类型转换,那么这个函数必须是个non-member。

比如 result = rational * 2 和 result = 2 * rational

Item 25 考虑写出一个不抛异常的swap函数

pimpl方法, pointer to implementation

前提知识点:template的偏特化和全特化。

  • 当std::swap对你的类型效率不高时,提供一个swap函数,并确定这个函数不抛出异常。
  • 如果你提供一个member swap,也该提供一个non-member swap 用来调用前者。对于class(而非templated), 也请特化std:swap。
  • 调用swap时应针对std::swap使用using声明,然后调用swap并且不带任何“命名空间资格修饰”。
  • 为“用户定义类型”进行std templates全特化是好的,但千万不要尝试在std内加入某些对std而言全新的东西。

实现

Item 26 尽可能延后变量定义式的出现时间

  • 增加程序的清晰度并且改善程序的效率。

Item 27 尽量少做转型工作

四种转型:

  1. const_cast
  2. dynamic_cast
  3. reinterpret_cast
  4. static_cast
  • 如果可以,尽量避免转型,特别在注重效率的代码中避免dynamic_castes。如果有个设计需要转型动作,试着发展无需转型的替代设计。
  • 如果转型是必要的,试着将它影藏于某个函数背后。客户随后可以调用该函数,而不需要将转型放进他们自己的代码内。
  • 宁可使用C++-style转型,不要使用旧式转型。前者很容易辨识出来,而且也比较有着分门别类的执掌。

Item 28 避免返回handles指向对象内部成分

  • 增加封装性,帮助const成员函数的行为像是const,并将发生 dangling handles的可能性降至最低。

Item 29 为“异常安全”而努力是值得的

有异常安全性的函数有:

  1. 不泄露任何资源
  2. 不允许数据败坏

需要提供以下三个保证之一:

  1. 基本承诺:异常抛出,函数内的任何事物仍然保持在有效状态下。
  2. 强烈保证:异常抛出,程序状态不改变。成则成,不成则返回调用之前的状态。
  3. nothrow保证: 承诺绝不抛出异常。
  • 强烈保证往往能够以 copy-and-swap实现出来,但“强烈保证”并非对所有的函数都可以实现或具备现实意义。
  • 函数提供的“异常安全保证”通常最高只等于其所调用之各个函数的“异常安全保证”中的最弱者。

Item 30 透彻了解 inlining 的里里外外

前提知识:inline函数的使用(头文件)

  • inline 只是对编译器的一个申请,而不是强制命令。
  • 将大多数inlining限制在小型、被频繁调用的函数身上。这可使日后调试过程和二进制升级更容易,也可使潜在的代码膨胀问题最小化,是程序的速度提升机会最大。
  • 不要因为function templates出现在头文件,就将他们声明为inline。

Item 31 将文件间的编译依存关系降至最低

  • 支持“编译依存最小化”的一般构想是:相依与声明式,不要相依于定义式。基于此构想的两个手段是Handle classed(Impl) 和 Interface classes(Factory)。
  • 程序库头文件应该以“完全且仅有声明式”的形式存在。这种做法不论是否涉及templates都适用。

继承与面向对象设计

Item 32 确定你的public继承塑模出is-a的关系

  • 适用于base classes身上的每一件事一定也适用于derived classes身上,因为每一个derived class对象也都是一个base class对象。

Item 33 避免遮掩继承而来的名称

  • derived classes内的名称会遮掩base classes内的名称。在public继承下从来没有人希望如此。
  • 为了让被遮掩的名称再见天日,可使用using声明式或转交函数(forwarding functions)。
    using Base::func;

Item 34 区分接口继承和实现继承

  • 接口继承和实现继承不同,在public之下,derived classes总是继承base class的接口。
  • pure virtual函数只具体制定接口继承。
  • 非纯virtual函数具体指定接口继承及缺省实现继承。
  • non-virtual函数具体指定接口继承以及强制性实现继承。

Item 35 考虑virtual函数以外的其他选择

  • 使用 non-virtual interface (NVI)手法,那是Template Method设计模式的一种特殊形式。它以public non-virtual成员函数包裹较低访问性(private或protected)的virtual函数。
  • 将virtual函数替换为“函数指针成员变量”,这是Strategy设计模式的一种分解表现形式。
  • tr1::function成员变量替换virtual函数,因而允许使用任何可调用物(callable entity)搭配一个兼容于需求的签名式。同属Strategy。
  • 将继承体系内的virtual函数替换为另一个继承体系内的virtual函数。这是Strategy设计模式的传统实现手法。

Item 36 绝不重新定义继承而来的non-virtual函数

Item 37 绝不重新定义继承而来的缺省参数值

  • 因为缺省参数值都是静态绑定,而virtual函数 —— 唯一应该覆写的东西 —— 是动态绑定。

Item 38 通过符合塑模初has-a或“is-implemended-in-terms-of”

  • composition的意义和public继承完全不同
  • 在application domain, composition 意味着has-a。在implementation domain, composition意味着is-implemented-in-terms-of。

Item 39 明知而谨慎地使用private继承

  • Private继承意味着is-implemented-terms-of。他通常比(composition)的级别低。但是当derived class需要访问proteted base class的成员,或需要重新定义继承而来的virtual函数时,这么设计是合理的。
  • 和复合(composition)不同,private继承可以造成empty base最优化。这对致力于“对象尺寸最小化”的程序库开发者而言,可能很重要。

EBO(empty base optimization) 空白基类最优化

class Empty {}; // sizeof(Empty) == 1, C++会默默安插一个char到独立对象中
class HoldsAnInt: private Empty { // sizeof(HoldsAnInt) == sizeof(int)
private:
    int x;
};

EBO只在单继承的情况下可以使用。

Item 40 明知而谨慎地使用多重继承

  • 多重继承比单一继承复杂。它可能导致新的歧义性,以及对virtual继承的需要。
  • virtual继承会增加大小,速度,初始化(及赋值)复杂度等等成本。如果virtual base classes不带任何数据,将是最具使用价值的情况。
  • 多重继承的确有正当用途。其中一个情节涉及“public 继承某个 Interface class” 和 “Private 继承某个协助实现的class” 的两相组合。

模板与泛型编程

Item 41 了解隐式接口和编译器多态

  • class 和 templates都支持接口和多态
  • 对classes而言接口是显示的(explicit),以函数签名为中心。多态则是通过virtual函数发生与运行期。
  • 对template参数而言,接口是隐式的(implicit),奠基于有效表达式。多态则是通过template具现化和函数重载解析(function overloading resolution)发生于编译器。

Item 42 了解typename的双重意义

  • 声明template参数时,前缀关键字class和typename可互换。
  • 请使用关键字typename标识嵌套从属类型名称:但不得在base class lists(基类列)或member intialization list(成员初值列)以它作为base class修饰符。

ex.

template<typename T>
class Derived: public Base<T>::Nested { //base class list 中
public:
    explicit Derived(int x)
    : Base<T>::Nested(x) // 成员列表中
    {
        typename Base<T>::Nested temp; // 嵌套从属类型名称
        ...
    }
    ...
};

Item 43 学习处理模板化基类内的名称

  • 可在derived class templates 内通过“this->” 指涉base class templates内的成员名称,或藉由一个明白写出的“base class 资格修饰符”完成。

Item 44 将与参数无关得代码抽离templates

  • Templates生成多个classes和多个函数,所以任何template代码都不该与某个造成膨胀的template参数产生相依关系。
  • 因非类型模板参数(non-type template parameters)而造成的代码膨胀,往往可消除,做法是以函数参数或class成员变量替换template参数。
  • 因类型参数(type parameters)而造成的代码膨胀,往往可降低,做法是让带有完全相同二进制表述(binary representations)的具现类型(instantiation types)共享实现码。

Item 45 运用成员函数模板接受所有兼容类型

  • 请使用member function templates(成员函数模板)生成“可接受所有兼容类型”的函数。
  • 如果你声明 member templates 用于“泛化copy构造”或“泛化assignment操作”,你还是需要声明正常的copy构造函数和copy assignment操作符。

Item 46 需要类型转换时请为模板定义非成员函数

  • “与此template 相关的”函数支持“所有参数之隐式类型转换”时,将那些函数定义为“class template内部的friend函数”。

Item 47 请使用traits classes表现类型信息

  • Traits classes使得“类型相关信息”在编译期可用。它们以templates和“templates特化”完成实现。
  • 整合重载技术(overloading)后,traits classes有可能在编译期对类型执行if…else测试。

Item 48 认识template元编程

  • Template metaprogramming(TMP, 模板元编程)可将工作由运行期移往编译期,因而得以实现早期错误错误侦测和更高的执行效率。
  • TMP可被用来生成“基于政策选择组合”(based on combinations of policy choices)的客户定制代码,也可用来避免生成对某些特殊类型并不适合的代码。

定制new和delete

STL容器所使用heap内存是由容器所拥有的分配器对象(allocator objects)管理,不是被new和delete直接管理

item 49 了解new-handler的行为

namespace std {
    typedef void (*new_handler)();
    new_handler set_new_handler(new_handler p) throw();
}

使用:

void outOfMem()
{
    std::cerr << "Unable to statify request for memory\n";
    std::abort( );
}

int main()
{
    std::set_new_handler(outOfMem);
    int* pBigDataArray = new int[100000000L];
    ...
}

一个好的new-handler:

  • 让更多的内存可以使用。
  • 安装另一个new-handler。
  • 卸除new-handler。
  • 抛出bad_alloc(或派生出自bad_alloc)的异常。
  • 不返回,通常调用abort或者exit

CRTP (curiously recurring template pattern) 怪异的循环模式,Widget继承自一个模板化的base class,后者又以Widget作为类型参数。可以用来添加set_new_handler支持。

总结:

  • set_new_handler允许客户制定一个函数,在内存分配无法获得满足时被调用。
  • Nothrow new是一个颇为局限的工具,因为它只适用于内存分配;后续的构造函数调用还是可能抛出异常。

ex.

Widget* pw2 = new (std::nothrow) Widget;

Item 50 了解new和delete的合理替换时机

  • 用来检测运用上的错误
  • 为了强化效能
  • 为了收集使用上的统计数
  • 为了增加分配和归还的速度
  • 为了降低缺省内存管理器带来的额外开销
  • 为了弥补缺省分配器中的非最佳齐位
  • 为了将相关对象成簇集中
  • 为了获得非传统的行为

Item 51 编写new和delete时需要固守常规

  • operator new 应该内含一个无穷循环,并在其中尝试分配内存,如果他无法满足内存需求,就该调用new-handler。它也应该有能力处理 0 byte 申请。Class专属版本则还应该处理“比正确大小更大的(错误)申请”。
  • operator delete 应该在收到null指针时不做任何事。Class专属版本则还应该处理“比正确大小更大的(错误)申请”。

Item 52 写了placement new 也要写 placement delete

  • 请不要无意识的遮掩正常版本的new和delete

杂项讨论

Item 53 不要轻视编译器的警告

Item 54 让自己熟悉包括 TR1 在内的标准程序库 (最新的版本不太需求)

Item 55 让自己熟悉 Boost

Boost: C++标准库的候选者们

不论是好友交流还是求职,常常会有人问我 “少年,你在做什么呢”“请描述你的工作内容”。此时总感觉一两句话总是说的不够透彻,于是就打算对在北京钢铁侠科技这一年的工作做了个总结。

1. 前言

北京钢铁侠科技,鉴于我对这个中二的名字抱有深深的怨念,所以以下简称为公司。从我作为软件工程师加入的时候,原型机ART-0处于刚刚完工的状态,其是仅有下半身的双腿机器人。低速的总线,外置的驱动和控制板,无法独立供电。似乎这个原型机不能满足人们对于仿人机器人的美好构想,但是对于公司而言,它成功的行走似乎给了当时仅仅10人的团队一缕光明(没错,也给了投资者以希望),让一群从来没有在与人类相似大小的仿人机器人上有过经验的工程师对他们的目标有了更多的信心。

也许正是这份自信,在仅进行腿部稳定性的持续研发和直接实现从双腿发展为全仿人的策略上,公司选择了后者。且不去评论这份选择的正确与否。全仿人的机器人ART-1开始进入设计,其预定的开发时间定为2016年的6月到2017年的3月。而这篇总结文的正文“我与我们所做何物”也正是从此刻开始的。

1.1 我(们)的目标

我采用了我的称谓,也就是说此处不代表公司意见。就不说缥缈的愿景和使命,只简单阐述下对于产品和工作的目标。我自诩我们是一个严肃的机器人公司,制作着定义上最狭义的机器人的产品,也就是说我希望我们希望复刻来自远古偃师[1]的技艺,去描述一个真正意义上的机器人。让它在为人而设计人生存环境下,可以帮助人实现各种的事物,逐步代替人去完成他们的工作。当然,这是一个长久的目标,对于最初的目标,就是做出一款可以商业销售的仿人机器人,广泛的与学校和科研机构合作,打破互相提防的圈内壁垒,加快这个领域技术的进展。然后就有希望赚大钱,就可以买的起房子,养得起老婆,走上人生巅峰了(此处大误 T T …)。

1.2 产品演化和我的工作变化

如图1.1所示公司的开发进展大概是半年原型 (2016.3月完成)->第一代全仿人ART-1原型(2017.01月)->第二代全仿人(有双手)ART-2(2017.08月)。

  • ART-0 : 可以进行平地行走。
  • ART-1 : 可平地行走,上下台阶,跳舞,握手,挥手等动作。
  • ART-2 : 组装制作中( 星期二, 11. 七月 2017 ),预计2017.8月份下旬会进行发布。
![图1.1 公司发展历程 ](/img/arobot2/f1_1.png)

它们的参数简表见表1.1

![表1.1 ART0 vs ART1](/img/arobot2/t1_1.png)

从这三代的进展来看,我们在机器人的本体上,不断地尝试提高它的活动能力以及基本指标,一些设计的简介会在后续的内容中阐述。在设计目标上也更加向着产品化的方向去发展。我个人的工作也在此过程中产生一些变化。从最初独立的功能算法实现,到平台架构设计和项目设立跟踪以及承担一些产品的工作(实际上我还是要每天码代码的可怜孩子)。对仿人机器人的整个技术体系和行业都有有了不少新的认识(不过还远远不够)。这其中一些一闪而过的想法也最终在各位大神的努力下,成为了现实,比如如图1.2的Robot Block的最初想法的一部分演变成了ART-2中极其重要的ART-COMMUNICATION。

![图1.2 头脑风暴草稿 - 机器人积木](/img/arobot2/f1_2.png)

2. 硬件系统描述

硬件系统的描述将以ART-2为主,会解释一些从0代到1代到2代技术变化的缘由,不过不会有过于详细的技术表达(要保密哦)。
先说一下对于ART-2产品上的几个重要的方向:

  1. 模块化
  2. 系统化
  3. 产品化

硬件结构的方案和设计都是基于这些重点而设计。

我们将整机分解为以下几个系统来设计。

![图2.1 ART-2系统简图](/img/arobot2/f2_1.png)

2.1 机体机械

作为一个软件工程师,机械方面我除了把机械图纸做处理后进行仿真,机械设计是赤裸裸的小白,因此就粗略的说下我的理解。仿人机器人的设计,有很多问题需要解决,比如:

  1. 拆卸维护的简易型(模块化)
  2. 整体的轻量化和强度设计(产品化)
  3. 长期在各种不同应用场景下的耐用性。(产品化)
  4. 跟人接触时的柔性。(产品化)
    ……

我们的结构机械工程师们在初代机型中很快的设计了腿部的可行结构[2][3]以及初代的关节[4]。在几代的进展中,我们有几个重大的变化。首先在模块化上,最新的ART-2设计了五体+躯干+动力源可以简易拆卸的结构,各个关节结构以机电一体化的理念设计,可以自我独立。

  • 在轻量化上:双腿50kg->全身50kg->更高并且<50kg
  • 自由度上:12DOF -> 26DOF -> 36DOF
  • 主要执行器上:从有刷->无刷(矢量控制)->下一次可能采用的无框式的电机。
![图2.2 ART-2关节分布图](/img/arobot2/f2_2.png)

单独从技术看,无框式,无刷永磁同步电机必然是仿人机器人产品上的主线(如果没有类似超声波,回声电机等新技术走上主流)。至少在知名的机器人上都采用了这种设计方法,比如NASA的Valkyrie[5],本田的Asimo[6]等。(专业的仿生机器人公司Festo的BionicANT则用了超声波电机)。

要强调一点的是结构方面依旧有非常多需要攻克和创新的地方,比如说Valkyrie在踝关节上采用了线性驱动+弹簧的结构而非主动关节的结构[7]

2.2 通信系统

通信系统的定义为通信服务器和通信子网络的集合,对于多关节的机器人来说,要对机器人进行反馈控制,因此这个控制环路要从各种传感器(包括电机上的)上收集信息,进行处理,再反馈给各个关节和传感器进行控制。因此,即使从直觉上也易想到,这个控制的频率自然越高越好。而系统的延迟和实时性也直接决定了控制频率的上限和稳定性。
因此在通信系统中,除了必须要保证的抗干扰和稳定。其带宽,实时性,信息交互的频率是非常重要的因素。
在初代机器中,采用了CAN总线进行控制,然而CAN总线的带宽被限制在了 1Mbit/s下[8]。可以做一个简单的计算,假设:

  1. 每个关节的信息有位置,力矩,速度,每个数据用一个4Byte的32bits数据保存。
  2. 全身共有30个关节。
  3. 一个CAN总线数据帧如图2.3所示,我们假设每个数据帧有32bits的有效数据和30bits的其他数据。
![图2.3 CAN总线帧结构](/img/arobot2/f2_3.png)

那么1Mbit/s下最大的通信速率为(一个往返):

 1Mbit/(30*(32+30)bits*3*2) ≈ 90

也就是说,在不计算传感器数据以及冗余需求的情况下,一次通信的极限在100Hz,而在实际系统运行时,达到100Hz的控制环路,基本上是不可行的。

这种控制频率在仿人机器上是没有未来的。比如知名的DRC比赛中设定控制频率在200Hz的限制,名震天下的Altas的控制频率可以达到至少333Hz,数据每6ms更新一次(新的设计中可能更快)[9]

正是如此,我们在第二代的通信中,参考了ROS官方的机器人PR2[10],采用了成熟的工业以太网 EtherCAT。EtherCAT的实现就是对常规的以太网协议进行改进,网络性能上达到了一个新的高度。具有:

  1. 卓越的性能
  2. 灵活的拓扑
  3. 简单且耐用
  4. 集成安全
  5. 低成本易实现

的优点。[10]

在采用EtherCAT后,ART-1的整机控制达到稳定的200Hz的控制频率(实测以及实际使用,200Hz的限制不仅在于EtherCAT,多在于系统实时性和计算耗时) 。虽然EtherCAT具有非常多的好处,不过在这里依旧要对各位看官提醒一下,如果采用开源的EtherCAT主站比如IGH等,其长期缺乏维护很难适应新的网卡和系统,因此需要进行大量的改进和适配工作。而为了解决EtherCAT驱动非标准的问题,另一个新的标准化技术IEEE TSN (Time-Sensitive Networking)[11]很有可能会让实时以太网的使用有如以太网一般便利(因为是标准)。

![图2.4 ART-1 EtherCAT子节点(左ART-1, 右ART-2)](/img/arobot2/f2_4.png)

图2.4中 ART-1上使用的一个控制节点,这个节点包括一个EtherCAT从站以及最多承载16路电机并行控制的FPGA芯片(一个节点控制多个电机)。 由于ART-2采用了矢量控制进行无刷电机控制,以及增加了很多驱动算法,因此不擅长浮点数运算的FPGA便力不从心。 在这种情况下,ART-2的驱动放弃了ART-1的方法,改为一个节点一个驱动的方案,不过在手部上由于空间的限制,手指的五个自由度仍然是1个驱动控制5个电机(但是并非是FPGA)。

我们参考了一些如图2.5所示类似的方案[13]决定使用FPGA(一主多从)加上PCI-E通信的通信方案。这样在FPGA通信和主控系统接口的地方就可以轻松达到吉级别的通信速率(n * Gbps)。而对Valkyrie的Robonet[14]和iCub采用的CFW(CAN并行转PCI)[15]的自制总线系统方案的学习也给我们定制自己通信系统提供了不少帮助。

![图2.5 文献[13]中通信系统的设计方案](/img/arobot2/f2_5.png)

2.3 主控系统框架

主控制系统上,我们采用了两款Intel i7的CPU(都是四核八线程)分别用作实时性(表现为)系统操作和通用操作系统。系统的连接通过ROS提供的网络集群来实现。

此处在ART-2上,我们采用COM-Express的标准的核心板模块与自研的底板的结合,便于把通信系统的Server的FPGA与CPU高速总线直接相连(PCI-E)。提供更好的性能。

![图2.6 主控核心板和载板](/img/arobot2/f2_6.png)

2.4 执行机构和传感器

2.4.1执行机构 - 关节

我们将关节抽象为任何一个关节点上可以进行位置和力矩控制以及获取相关反馈的黑盒执行器。

对于关节,整个行业都在模块化和产品化。比如科尔摩根不久前发布的RGM机器人关节模组 ,适用于10Kg以内的负重机器人(臂),可以极大加快机器人成品的研发。而对于我们,独立制作关节组件,最重要的目的,是考虑到仿人机器人大量的关节数目以降低成本,以及在仿人机器人不同关节上采用不同的定制。

关节是由电机+驱动+减速器+传感器而组成。
我们在关节设计上一般关心:

  1. 转速
  2. 输出力矩(瞬间和额定)
  3. 控制功能

从这些需求综合来看,指向了电机的功率,驱动器,结构设计和控制算法。因此在设计关节的时候我们一般采用三种方法的结合。

  1. 理论计算加上一些冗余
  2. 参考其他的机器人参数
  3. 实测

对于理论计算,一般由机械结构的同事进行力矩的估算,采用一些经验公式而算得,比如:

(T堵转 - T额定)* 20% + T额定 = T输出 

而非直接采用电机的堵转力矩。

除此之外,有许多仿人机器人的制作者已经提供了丰富的实机数据可供参考,比如知名的Asimo[16](关节信息见图示2.7),ROBOTIS的THOR[17](引用为系列最新版本)改进而来的ESCHER[18]。German Aerospace Center (DLR) 设计的TORO[19]。 也有更为可爱的公司如Aldebaran Robotics的Romeo项目会开放他们的电机参数[20]

![图2.7 阿西莫机器人的关节信息](/img/arobot2/f2_7.png)

最后,我们的每一代设计都会基于实测的上一代数据进行分析,比如监控系统会生成2.7类似的记录图示。

![图2.8 来自ART-1的某动作时膝关节电流分析](/img/arobot2/f2_8.png)

除常用方法外公司也与生物力学方向的研究者有关接触,也希望能从其中获取灵感和设计数据,不过这方面现在刚刚在推进也非公司的主线,所以还未有什么明显的成果。

由于电驱动无法提供很强的功率,很多机器人采用了液压驱动或者液压电驱混合的形式。比如波士顿动力的Altlas采用了液压驱动[21],虽然控制更加艰难,但是动力明显更为强劲(Bigdog也是一般)。为了达到如此强劲的性能,Atlas需要480V,15KW的动力源[22]。除了Altas也有不少机器人采用液压驱动,比如日本的Tae-Mu[23]

2.4.2 感知单元 – 传感器

公司内部对于机器上产品传感器的理念在于提供基础与善于扩展。这是由于现阶段市场定位以及人力限制所决定的,偏向二次开发的应用场景很难确定一款固定的机型,公司内部的有限资源也无力对各种传感器进行全部接入。因此根据基本现有的算法需求,ART-2上包含了(除了关节组件):关节反馈(位置,速度,力,电流),IMU, 六维力,单目景深摄像头,扬声器,麦克风,激光雷达的预留。为了实现产品化的需求,ART-2上实现了在线固件更新的系统,可以通过最顶层的客户软件直接刷新底层嵌入式相关的固件程序,这也是在经历了ART-1艰辛的调试后所提出的重要功能。

注:ART系列现仍然使用电流做力矩估算,使用电流来算关节力矩会存在很多问题,传动也会影响力的反馈,减速器的静摩擦也很难对微小的力有反馈[24]。因此要做精确的力控制的话,主流的设计上依旧需要力矩传感器,比如图2.9所示就是其中的一种。

![图2.9 Atlas上采用的力矩传感器](/img/arobot2/f2_9.png)

2.5 动力系统

公司现阶段并没有对电源进行特别优化(如果你看到有连续工作3小时以上的宣传,请认为是PR文)。ART-1以及ART-2都是采用48V的锂电池组进行内部供电(调试的时候大多是外部供电模式)。在电源的策略上,我们在ART-1和ART-2都单独制作了电源管理模块,将控制系统,通信系统,执行单元进行电力分组。这些工作,帮助ART-1,2在开关机过程中可以逐步进行自检,保障了系统的安全。同时,可以方便的进行调试,检测,以及紧急制动等操作。

![图2.10 ART-1电源控制模块](/img/arobot2/f2_10.jpg)

3. 软件架构和算法 - 运动脑的伟大理想

这一部分主要阐述软件整体的架构设计以及双足步态的相关算法。

3.1 架构与平台

3.1.1 设计思考 - 脑洞大开

遗憾而庆幸的是现今尚没有一个被认可的成熟架构或者模型来描述仿人机器人的脑架构。因此在进行这一部分的设计之初我们虽然毫无头绪,但是确进行了很多有趣的思考。所以请容许我先进行一段无用而有趣的头脑风暴。

首先为了让机器人跟人一样,在机器人中要实现各种不同的脑功能,正如人的大脑一样。分为不同的功能区,不同的功能区承担着不同的功能。他们之间也充满着交流。那么在进行架构设计之前有一些亟待解决的问题:在现在的工程和技术前提下,如何解耦不同的系统,如何清晰的描述各个系统的输入和输出,这些系统哪些可以用现在的技术实现,哪些需要等待技术的革新和理论的创新。

21世纪,将脑科学,神经科学工程化的工作始终在不断地进行。对于这方面我们完全没有任何经验和基础,因此仅限于了解而已。鉴于专业知识的匮乏,我们将系统的思考转移到另一个更高层,概括性更强的范围,认知心理学,或者说是认知科学领域。有趣的是在对认知科学的了解后,我们发现在设计之初提出的几个问题与其中的一些理念似有相合之处。认知科学中,提出了层级分析的理念:只在单一的层级上进行研究,不可能彻底地理解精神和脑。 对一个特定现象作多层次的研究,会更好地理解脑中的过程如何上升为特定的行为[25]。 其中最令我感到振奋的正是大卫·马尔著名的三层次分析[26]

  1. “计算理论”,说明计算的目标。 – 如何解耦不同的系统
  2. “描述与算法”,给出输入和输出的描述,以及算法是如何由输入得到输出。 – 如何清晰的描述各个系统的输入和输出
  3. “硬件实现”,算法和描述如何在物理上实现。 – 这些系统哪些可以用现在的技术实现,哪些需要等待技术的革新和理论的创新

这时,似乎前面的问题找到了一些理论基础进行分析。

认知科学对心智方面功能主义的观点,意味着对心智方面的工程化具有长期可探索的意义,系统的定义也会更为清晰。那么依照功能的路线,运动脑的概念应该描述什么功能?

如图3.1所示,从生物学上来看,人脑大体分为大脑,小脑和脑干。众所周知,大脑负责类似感知和思考,脑干多负责维持个体生命,小脑用来协调运动,维持平衡。

![图3.1 脑组织结构简图](/img/arobot2/f3_1.png)

在脑组织中,小脑的功能解释如下:

脑的一部分。位于大脑的后下方,颅后窝内,延髓和脑桥的背面。可分为中间的蚓部和两侧膨大的小脑半球。小脑表面有许多大致平行的浅沟,沟间为一个叶片。表面的灰质为小脑皮层、深部为白质,也称髓质。白质内有数对核团,称中央核。小脑是运动的重要调节中枢,有大量的传入和传出联系。大脑皮质发向肌肉的运动信息和执行运动时来自肌肉和关节等的信息,都可传入小脑。小脑经常对这两种传来的神经冲动进行整合,并通过传出纤维调整和纠正各有关肌肉的运动,使随意运动保持协调。此外,小脑在维持身体平衡上也起着重要作用。它接受来自前庭器官的信息,通过传出联系,改变躯体不同部分肌肉的张力,使肌体在重力作用下,作加速或旋转运动时保持姿势平衡”[27]

看起来运动脑似乎跟小脑的功能是吻合的,但是,我们想到运动脑的概念似乎又超过了小脑的范畴。因为在机器人设计中,与其运动相关的内容已经涉及到行为本身,比如走,跳,跑。而这种行为的发生,又不局限于小脑的贡献。于是,我们将运动脑和其他功能通过以下的一条界限来区分:
运动脑负责运动的演化,记忆,经验和技巧的积累,它包括了程序性记忆[28]。而知识,推理,计算全部由其他的功能区域负责,它们包括了陈述性记忆。举一个篮球投射的例子,投射的判断和触发应该由逻辑的思考而决定。而这之后,肌肉记忆,身体协调,条件反射,平衡的处理,都由运动脑来控制。因此我们在这种思量下,设计了图3.2所示的简单的初级框图(从ART-1开始)

![图3.2 脑架构功能简图](/img/arobot2/f3_2.png)

而这个框图也演化成了ART-1双处理器的架构,ART-2在双处理器的基础上采用的异构架构(CPU+FPGA)。对于大脑方面,我们集成了类似科大讯飞提供的语音云端功能等。现在,我们把目光集中到运动脑本身上来,为了再细化运动脑的功能为了描述其工程意义,我们将运动脑的两个功能抽象出来作为最初的研究切入点:

  1. 程序性行为(比如骑车)的生成,演化,执行。目前为止,我们依旧在以行走为最基础和唯一深入的研究。(对于舞蹈,上下台阶等,仅仅描述了其实现而非对其进行深入的思考和研究)
  2. 全身的平衡性,分别是静态平衡(静止状态下的平衡)和动态平衡(运动中的平衡)。我把这种概念称为,kinematic balance以及dynamic balance.

在此之上,一个类似图3.3头脑风暴简图中所提出的行为综合器,也被逐渐的细化实现。

![图3.3 头脑风暴草稿 – 行为综合器](/img/arobot2/f3_3.png)

3.1.2 平台架构简介

让我们脱离运动脑的伟大脑洞,回归现实世界。来看一下我们实际的工作。图3.4是ART-1依照设计思考图3.2细化的的框架图。这个图纸实际上也是ART-1最后实现的功能简图。

![F3.4](/img/arobot2/f3_4.png)

图3.4 ART-1功能分布图

图3.5是我们在开发维度上做的一个简单的架构框图。而我在公司所做的工作,基本都在这个图的涵盖范围之内。如果熟悉ROS的同学,就会发觉这套老生常谈的架构跟ROS的设计基本一样,实际上我们的整个架构也是依托于ROS而做的改进。

![图3.5 ART-X 架构简图](/img/arobot2/f3_5.png)

在实现的过程中里面,有很多工程上的工作:

  1. 分离实时性系统和通用系统

由于自动化控制理论上要求的强实时性,机器人系统上需要一部分实时性处理的单元和系统。而这方面ROS系统本身毫无办法,而像Microsoft Robotics Developer Studio (MicrosoftRDS, MRDS)的系统具有更好的实时性。不过,在ROS的开源特性和丰富的社区支持的吸引下,对于实时性的优化也有很多方法。比如直接使用实时性的系统(不过移植ROS会很痛苦),采用Linux实时补丁架构的结构[29](ART-1的方案)亦或自己对手动多核CPU进行任务绑定和驱动优化(ART-2的方案), 比如北京航空航天大学就提出了基于RGMP[30]的RGMP-ROS[31](浙江大学仿人机器人 ZJUkong-I 采用此架构)。

  1. 异构的开放和封装

不论是CPU+FPGA,还是引入GPU,SOC,又或者ASIC(弄不起)。一个可以将底层暴露给算法设计者,又对上层开发者隐藏细节的设计对我们还是客户都是很重要的环节。在现在的ART的平台上,我们现在采用类似“付费开源”的方法,虽然对各个层级进行了封装,但是对客户而言所操作的是我们直接裸露的(大部分)代码。这也是由于我们在前期的多数科研高校的客户所希望的。这种方法,帮助我们的”原型平台”可以更快的获得收益,同时有更多的反馈可以帮助平台的产品化。(第一次把半成品说的如此清新脱俗)

  1. 重新造“轮子”

对于仿人机器人来说,如图3.6所示ROS提供了丰富的工具和平台,但是由于其设计和功能更适配于轮式和臂状机器人。因此,不断的重新锻造一些功能也是必经之路。比如,对ros-control中controller组件的重制,对运动学的锻造而让其更适合于仿人机器人等。

![图3.6 ROS平台下的仿真可视化工具示例](/img/arobot2/f3_6.png)

3.2 步态简介

当我们把程序性行为的生成执行固定在行走上时,就成为了步态算法的概念。也就是说步态算法指的是如何生成并且执行机器人的行走行为。对于行走我们提出了两个不同的阶段:

  1. 盲走,不依赖于视觉和雷达等感知设备(只依赖感知自身状态的传感器) ,机器人在不知道路况的情况下,去尽量保持稳定的行走。
  2. 感知环境性行走,在1的基础上,实现路径规划,精确定位,自动进行特殊步态(比如台阶等)等的行走。

虽然现阶段ART-2上依旧有摄像头以及雷达的接口。我们依旧在第一个阶段徘徊和努力。

步态生成方面有众多的研究成果和方案:

  • 基于轨迹规划的方法

轨迹规划的方法,主要应用运动学和动力学原理简历模型,进行规划,采用控制理论的方法进行控制。中较为经典的是如图3.7所示的线性倒立摆模型(小车桌子)和由Vukobratovic等人提出的ZMP稳定性判据组成的控制方案。[32]

![图3.7 ZMP和线性倒立摆模型。摘自[33]](/img/arobot2/f3_7.png)

在大多主流的设计会在控制上会增加类似图3.8所示的稳定器来保障机器人的实际运动[34]

![图3.8 稳定器的一种实现](/img/arobot2/f3_8.png)

倒立摆模型也会延伸出一些其他的模型,比如弹簧负载倒立摆 (Spring loaded inverted pendulum, SLIP) 模型,其广泛应用于分析动物和机器人跑步运动[35]。相对ZMP也演化出了很多不同的方法,比如foot-rotation indicator (FRI) point[36]等。由于经典ZMP相关方法适合于长期的动作规划,不利于动态的切换和控制,也有一些实用的技术用来实现在线步态规划和切换[37][38]。相对于单纯的ZMP规划,在线步态更适合于复杂的路面和远程控制[39]

这类方法由于是基于力学模型和控制理论的建模,因此大多可以当做白盒控制器,其表现形式非常的稳定,具有很强的可预测性。

对我们而言,采用了基于预观控制的ZMP方法作为我们的主要案例[40],图3.9为生成的ZMP点和落脚点。=

![图3.9 ZMP点和落脚点](/img/arobot2/f3_9.png)
  • 力控制

在控制上面,采用ZMP方法的描述的机器人更多的采用了控制位置的力学模型(ZMP点,质心点,时间)。而如Altas之类的机器人采用的Center of Pressure (CoP)[41]和力矩控制的方法来直接控制机器人关节的力矩[42]。这种方法从我的理解上看,更本质的描述了机器人的运动本源(力),因此有更好的效果。

  • 仿生方面
    由于步行模式的复杂性,很多人认为,步行运动不应该进行简洁的解析规划,而应该是一种通过线性系统和环境之间的反馈和动态交互作用融合而成的一种非线性震荡[33]。于是源自于神经生物学,通过工程去模拟生物系统给仿人机器人的步态研究提供了一种条诱人的路线(这也属于认知科学的一部分)。在仿人领域在这方面较为知名的是中央模式生成 - CPG(Central pattern generator)方法,这类方法,由来自生物学中,位于脊髓或者胸腹神经节中的中枢模式发生器。这种发生器是由神经元构成的振荡网络,由众多CPG单元再构成CPG网络[43]
![图3.10 中枢神经发生器 (CPG) 控制框图[35]](/img/arobot2/f3_10.png)

想来,大家在人工智能概念爆炸的时节上,对于机器学习,深度学习,神经网络这些概念和方法即使没有接触也必有耳闻。在仿人机器人的步态生成上,学习和进化算法也占有了很大的戏份。比如Geng 等提出了类似神经-肌肉系统的控制器, 生成可在线调节速度的运动步态,通过数值模拟实现了图3.12机器人的动态稳定行走[44]. 2014 年, Geng利用如图3.12所示的基于神经网络的模型预测控制方法实现了在线速度校正[35]。MIT的Tedrake等在图3.13的被动机器人(被动机器人可以认为将机器人放在斜面上,不需要动力源,机器人会依靠重力行走,这方面的研究期望机器人仅仅受到简单的驱动力看就可以实现行走)上,通过强化学习来获取运动模式,据说可以在20分钟左右学习到各种地面条件下的合适的步行模式[33]

![图3.11 RunRobot机器人](/img/arobot2/f3_11.png)
![图3.12 神经网络的模型预测控制框图[45]](/img/arobot2/f3_12.png)

MPC全称可指Model Predictive Control模型预测控制(又称RHC, Receding Horizon Control)预观控制则属于一种预测模型。MPC应用在很多领域,不光是传统控制,也有自动驾驶等新兴技术等。

![3.13 Tedrake实现的被动机器人模型[46]](/img/arobot2/f3_13.png)

对神经网络有过接触的同学,自然也能想到到无论是CPG还是神经网络会成为一个黑盒控制器,然而对于与物理世界直接接触的及机器人来说,这种不确定性是否会限制其投入市场和产品化,不得而知。并且,对于学习网络的应用(尤其是适用在不同机器人上),调参将会是一个冗长而无保障的工作。

4. 总结 - 碎碎念

这一年经历了ART-1的设计和调试以及ART-2的设计。在理论上,深刻体会到了在仿人机器人中宽广如大海的知识范畴以及深入到力学,自控方面复杂的数学模型(后悔,上学没好好学数学)。在工程上,对复杂系统的集成的探索以及架构的思考成为了日常的生活,而不成熟的行业状态和相对较为封闭的研发环境(各公司,各机构)让团队经常无从下手。对仿人机器人产品的测试也着实让我们大费头脑(大多的机器人标准都是针对于工业机器人的)。

![图4.1 测试内容思维导图](/img/arobot2/f4_1.png)

如何评估一款类人机器人的优劣只能从最终的表现行为来看,造成各个子系统很难对性能做出清晰的描述和规划,而机电软互相制约互相依存的产品特性又需要明确的接口方案。幸言之,我们现在并不需要提供一款具有产品级别稳定性的机器人,在磕磕碰碰,修修补补下,我们也达到了现在的地方 —— 一个高耸入云山峰的出发点。对我来说,此过程收获颇丰,不论是从企业运作,团队管理还是产品设计,原型研发。唯一郁闷的是,作为一个程序员,coding的技巧增幅曲线显著下降,这大概是在创业公司无力专精某一技术的悲凉(对,说的就是不好找工作)。

最后,感谢想感谢下公司各位对我的帮助,跟各种领域人才接触让我受益匪浅。

少年们,这场攀登刚刚开始,前路漫漫,祝武运昌隆。

最后针对我这一年随性而为出来浪的行为:感谢老妈努力赚钱不用我养家的勤奋,感谢傻娃在压力下对我四处浪的依旧支持,感谢泡泡同学在我在帝都居无定所的时候给我提供居住之地,感谢Synopsys的老板和同事帮我填坑,最后要感谢以Jack为代表的魔都小伙伴呕心沥血的帮我找一份行当养家糊口。

icePie

记于2017.7月

P.S. 帝都人真多,空气真差。


[1] 《列子汤问》十三篇

[2] 骆鹏, 李冰川, 苑全旺.一种仿人机器人髋关节机构及连接有该机构的机器人:, CN205652233U[P]. 2016.

[3] 骆鹏, 李冰川, 苑全旺. 一种仿人机器人腿部机构及连接有该机构的机器人:, CN205652233U[P]. 2016.

[4] 骆鹏, 李冰川, 苑全旺. 具有零点位置检测功能的仿人机器人关节机构:, CN205872233U[P]. 2016.

[5] Radford N A, Strawser P, Hambuchen K, et al. Valkyrie: NASA’s First Bipedal Humanoid Robot[J]. Journal of Field Robotics, 2015, 32(3):397-419.

[6] Asimo-technical-information.

[7] N. Paine, J. Mehling, J. Holley, N. Radford, G. Johnson, C. Fok, and L. Sentis. J. Actuator Control for the NASA-JSC Valkyrie Humanoid Robot: A Decoupled Dynamics Approach for Torque Control of Series Elastic Robots. Field Robotics 32 (3): 378-396 (2015)

[8] ISO 11898-2:2003-12 ; ISO 11898-2:2016-12

[9] Johnson M, Shrewsbury B, Bertrand S, et al. Team IHMC’s Lessons Learned from the DARPA Robotics Challenge Trials[J]. Journal of Field Robotics, 2015, 32(2):192-208.

[10] http://wiki.ros.org/Robots/PR2

[11] http://www.ethercat.org.cn/cn/why_use_ethercat.htm

[12] https://en.wikipedia.org/wiki/Time-Sensitive_Networking

[13] Pierce B, Cheng G. Versatile modular electronics for rapid design and development of humanoid robotic subsystems[C]// Ieee/asme International Conference on Advanced Intelligent Mechatronics. IEEE, 2014:735-741.

[14] https://gitlab.com/nasa-jsc-robotics/valkyrie/wikis/Robonet

[15] http://wiki.icub.org/wiki/CFW_card

[16] Semester project II: Mobile Robot modeling, Simulating and Programming. New ASIMO

[17] http://en.robotis.com/index/product.php?cate_code=111410

[18] Knabe C, Seminatore J, Webb J, et al. Design of a series elastic humanoid for the DARPA Robotics Challenge[C]// Ieee-Ras, International Conference on Humanoid Robots. IEEE, 2015:738-743.

[19] Ogawa Y, Venture G, Ott C. Dynamic parameters identification of a humanoid robot using joint torque sensors and/or contact forces[C]// Ieee-Ras International Conference on Humanoid Robots. IEEE, 2015:457-462.

[20] http://doc.aldebaran.com/2-1/family/romeo/motors_romeo.html

[21] https://www.bostondynamics.com/atlas

[22] http://archive.darpa.mil/roboticschallengetrialsarchive/files/ATLAS-Datasheet_v15_DARPA.PDF

[23] Hyon S H, Suewaka D, Torii Y, et al. Development of a fast torque-controlled hydraulic humanoid robot that can balance
compliantly[C]// Ieee-Ras, International Conference on Humanoid Robots. IEEE, 2015:576-581.

[24] https://zhuanlan.zhihu.com/p/26722384

[25] https://zh.wikipedia.org/wiki/%E8%AE%A4%E7%9F%A5%E7%A7%91%E5%AD%A6

[26] Barlow H B. Vision: A computational investigation into the human representation and processing of visual information : David Marr. San Francisco: W. H. Freeman, 1982. pp. xvi + 397[J]. Journal of Mathematical Psychology, 1983, 27(1):107-110.

[27] 许嘉璐, 彭奕欣. 中国中学教学百科全书,生物卷[M]. 沈阳出版社, 1990.

[28] M·W·艾森克, M·T·基恩, 艾森克,等. 认知心理学[M]. 华东师范大学出版社, 2009.

[29] https://xenomai.org/

[30] http://rgmp.sourceforge.net/

[31] Wei H, Huang Z, Yu Q, et al. RGMP-ROS: A real-time ROS architecture of hybrid RTOS and GPOS on multi-core processor[C]// IEEE International Conference on Robotics and Automation. IEEE, 2014:2482-2487.

[32] Vukobratovic M, Sepaneko Y. On the stability of anthropomorphic systems[J]. Mathematical Biosciences, 2004, 15(1):1-37.

[33] 梶田秀司. 仿人机器人[M]. 清华大学出版社, 2007.

[34] (H)D. Kaynov, P. Souères, C. Balaguer, “A practical decoupled stabilizer for joint position controlled humanoid robots”, IEEE/RSJ Int. Conference on intelligent Robots and Systems, St Louis MO, USA, Oct. 2009.

[35]田彦涛, 孙中波, 李宏扬,等. 动态双足机器人的控制与优化研究进展[J]. 自动化学报, 2016, 42(8):1142-1157.

[36] Goswami A. Postural Stability of Biped Robots and the Foot-Rotation Indicator (FRI) Point[J]. International Journal of Robotics Research, 1999, 18(18):523-533.

[37] McGill, Stephen G., et al. ”Team THOR’s Entry in the DARPA Robotics Challenge Finals 2015.” Journal of Field Robotics (2016).

[38] Yi, Seung-Joon, Dennis Hong, and Daniel D. Lee. ”A hybrid walk controller for resource-constrained humanoid robots.” Humanoid Robots (Humanoids), 2013 13th IEEE-RAS International Conference on. IEEE, 2013.

[39] Yi, Seung-Joon, et al. ”Online learning of a full body push recovery controller for omnidirectional walking.” Humanoid Robots (Humanoids), 2011 11th IEEE-RAS International Conference on. IEEE, 2011.

[40] Park J, Youm Y. General ZMP Preview Control for Bipedal Walking[C]// IEEE International Conference on Robotics and Automation. IEEE, 2007:2682-2687.

[41] Wiedebach G, Bertrand S, Wu T, et al. Walking on Partial Footholds Including Line Contacts with the Humanoid Robot Atlas[J]. 2016.

[42] Koolen T, Bertrand S, Thomas G, et al. Design of a Momentum-Based Control Framework and Application to the Humanoid Robot Atlas[J]. International Journal of Humanoid Robotics, 2016, 13(01):1650007-1650001.

[43]陈启军, 刘成菊. 双足机器人行走控制与优化[M]. 清华大学出版社, 2016.

[44] Geng T, Porr B, Wörgötter F. Fast Biped Walking with a Sensor-driven Neuronal Controller and Real-time Online Learning[J]. International Journal of Robotics Research, 2006, 25(25):243-259.

[45] Tao G. Online Regulation of the Walking Speed of a Planar Limit Cycle Walker via Model Predictive Control[J]. IEEE Transactions on Industrial Electronics, 2013, 61(5):2326-2333.

[46] Tedrake R, Zhang T W, Seung H S. Stochastic policy gradient reinforcement learning on a simple 3D biped[C]// Ieee/rsj International Conference on Intelligent Robots and Systems. IEEE, 2004:2849-2854 vol.3.

仿人机器人 之 Atlas

感谢徐浩益同学的整理和资料

  • 设计公司:美国波士顿动力(Boston Dynamics)(现被软银收购……)
  • 官方网站:Atlas Project
  • 原型:Petman

公司简介

波士顿动力公司(英语:)是一家美国的工程与机器人设计公司,美国军方通过 DARPA (美国国防部先进研究项目局)资金支持了波士顿动力的许多项目。
Marc Raibert是该公司的总裁兼专案经理,他在1992年令此公司从麻省理工学院底下独立出来。
在2013年12月13日,波士顿动力公司被Google收购。有消息称2016年3月被Google出售给丰田研究所,实际上在2017年的6月,软银截胡丰田,收购了波士顿动力。

其开发的机器人包括LittleDog,RiSe,RHex,SandFlea ,LS3(Legged Squad Support Systems),Cheetah,BigDg,Petman,Atlas。其中Petman和Atlas为人型的机器人。

大家庭

机器人简介

Atlas机器人是基于波士顿动力公司早期的Petman人型机器人。Atlas机器人由航空级铝和钛建造,它共有28个自由度,全部由液压驱动,可以实现位置闭环和力矩控制。自它发布至今有三个版本,第一版,身高约1.88m,质量150kg,肩宽0.76m。

altas

基本参数

  • Degrees of Freedom: 28
  • Weight: 150 kg
  • Height: 1.88 m
  • Shoulder Width: 0.76 m

dof

头部

在头部集成了MultiSense SL ,此设备包含一个双目摄像头,一个北阳的激光雷达,可以满足仿人机器人的基本需求,且完美支持ROS,并且由于头部没有偏航的自由度,还在头部增加了2个广角的摄像头。

腰部

在腰部安装了一个IMU。

手部

在手臂有一个可换的末端执行器,官方提供3种末端执行器,并且支持第三方的手部安装。

hand

它的手具有精细动作技能的能力。

在这一版的机器人还需要外部供电,Atlas机器人可以在崎岖的地形行走,它能在传送带上大步前进,而且在平地的行走速度可以达到5.1km/h以上,而且可以躲开传送带上突然出现的木板,从高处跳下稳稳落地,两腿分开从陷阱两边走过,然后跑上楼梯;单腿站立,被从侧面而来的球重撞而不倒,等等。

其他改进

为了参加DARPA机器人挑战赛,在2015年1月12日,Atlas的机器人团队发布了新的改进版本。在这次改进中Atlas全身的百分之七十五都被重新设计了,只有小腿和脚沿用了上一版的设计。这次改进使用了新的更轻的材料和新的液压系统并加入了电池,总体的重量只增加到156.5kg。机器人最重要的变化是电源和液压系统,Atlas 携带一个3.7kwh的锂粒子电池组,可以保证一个小时的各种任务操作,包括步行,站立使用工具和其他动作。Atlas的这次升级在于提高了灵活性和效率,并包括:

  • 在手腕增加了额外的自由度,可以使机器人旋转手腕来转动门把手。
  • 增加了三个机载计算机用于感知和任务规划,而且在头部新加了无线路由器可以实现无阻塞通信。
  • 在臀部,膝部和背部增加了强度。
  • 无线紧急停止的安全操作。
  • 使用了新的液压系统,噪声更少。

在2016年波士顿动力推出了新的Atlas机器人,和第二版的动力一样,Atlas采用电源供电和液压驱动。这版的Atlas高1.75米,重82kg,于上一代相比重量有了很大的减轻
在搬箱子、出门推门等过程中还需要标记点完成物体识别任务,对物体的识别等机器视觉能力有所提升。在这版中机器人摔倒以后可以快速地自主起身。在官方视频中,Atlas还演示了野外行走的效果。在自行打开门之后,可以在雪地中行走,虽然遇到了脚滑的现象,但自主的平衡控制力让机器人可以在雪地中爬起,继续保持行走的状态。

小结

Atlas可以说是液压控制人型机器人的巅峰,而且对比电机控制的机器人来说,各有优势。Atlas使用了液压控制可以输出更大的力矩,而且会有更优的效率。不过对于液压系统,每一个关节的执行反馈机构都需要专门设计,控制方面有了更大的难度。但是Atlas的团队克服了种种困难用液压实现了人型机器人的液压控制,并且做到了顶尖水平。

git ssh Errors

error: RPC failed; HTTP 500 curl 22 The requested URL returned error: 500 Internal Server Error

1
2
3
error: RPC failed; HTTP 500 curl 22 The requested URL returned error: 500 Internal Server Error
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly

原因: 在用git上传大文件时会出现的问题。
解决:编辑*.git/gitclone*将其中的http改写成git的路径。

ssh出错 sign_and_send_pubkey: signing failed: agent refused operation

在服务器添加完公钥之后,ssh服务器然后报了这个错误

sign_and_send_pubkey: signing failed: agent refused operation

原因:ssh在ubuntu下使用ssh-agent来管理,需要将新key加入到其中。
解决:

eval "$(ssh-agent -s)"
ssh-add

仿人机器人 之 Romeo - 1

软银三剑客之Romeo,分成两个系列,第一篇章用作机器人简介,由于与众多研究机构合作,其中产生了大量论文和成果,第二篇章将针对论文的技术做简介。

  • 设计公司:Aldebaran Robotics (现被SoftBank收购)
  • 官方网站:Romeo Project

Romeo is a humanoid robot from Aldebaran Robotics which is intended to be a genuine personal assistant and companion.

Romeo主要是帮助缺乏自理能力的人。如依靠视觉帮老人记住杯子或遥控器落在哪里了,甚至帮老人拿过去;可以监护老人,老人生病时机器人会通知老人的家人;帮老人或残疾人下楼梯倒垃圾;帮老人站起来或者行走等。

罗密欧全身无齿轮,电能产生机械能,机械能还可以产生电能,能量浪费减到最小,开放SDK。行走依靠视觉实时重做路径规划 sohu

如果说NAO是主打教育和娱乐(医疗大概是创始人布鲁诺-梅索尼Bruno Maisonnier的一个期望),Pepper的江山在商用服务市场。那么Romeo更像是技术积累和预研(虽然Romeo中处处为了用户着想,但是在成本上并未作出更多的努力)。

公司简介

Aldebaran Robotics,于2005年成立于法国。 2012年,日本软银集团收购了位于巴黎的 Aldebaran Robotics,其产品有 NAO、Pepper 和 Romeo robots。 2016年初,Aldebaran 更名为软银机器人公司。
收购

https://www.ald.softbankrobotics.com/

机器人简介

Romeo是Aldebaran在NAO的基础上开发出来的一款机器人。旨在制造一款大型的仿人机器人以及测试一些新技术的继承和应用。(做技术积累,较为成功的是本田的Asimo将其发现的技术应用于汽车和其他产品)。最初项目的成立在2009年,由DGCIS赞助,联合众多研究机构。(The research on Romeo was initiated within the scope of an interministerial fund (FUI) project in January 2009. Accredited by the Cap Digital competitiveness cluster, the project was funded by DGCIS, the Ile de France Region and the Municipality of Paris. As a structural project for the French robotics sector, Romeo has brought together a dozen industrial and academic partners.)在花费了4年的研究时间后,成功研制出了第一代140cm的机器人(Romeo-1已经完成并且给了4所欧洲高校)。最后Romeo-2在2012年11月开始立项,由Bpifrance支持。同样是4年的项目,与16家机构共同合作

Romeo第二代在第一代上做了很多改进,包括改变脊柱,把电子元器件放到头部,并且融入了摸头杀功能(每次看到pepper都想去摸头,是同样的功能和原理)
head
提升腿部控制,加入电池。

针对眼睛,LPPA为其实现了可移动的双眼,植入了前庭系统(vestibular system)用来稳定机器人的视觉图像。这样就可以实现更为稳定的动态步态算法。在这方面,国内亦有不错的成果,比如张晓林博士为新松做的一款动态眼(如图),不过依旧还未见到把动态视觉和动态步态结合起来并且公开的产品或者原型。
vestibular
张晓林博士团队的动态眼

对于语音,Remeo在Telecom Paris Tech的帮助下可谓是“大费周章”(对于大多仿人机器人的研究者来说,在语音上下了这么多功夫,有点夸张),使用16路的语音天线实现。
audio

运动控制方面 LAAS致力于实现全身的平衡控制,在基于LPPA所制作的控制图表功能(NAO也使用同样的工具,可以参考它的软件以及视频)上,提出了中心(这是个医学名词,眼中心)控制(oculocentric control framework)这个架构,可以获得高质量的被动步态模式。除此之外,在复杂行为上也有不俗的斩获,比如开门,握手,寻找座椅并成功落座,视觉引导行走等一系列研究。 LPPA同期也在进行神经网络对双足行走的研究。

最后Romeo在行为,对话,感情研究上也投入了不少的精力。这方面在AI层面,较为独立。

基本参数

  • Weight: 36.66 kg
  • Height: 1.467 m
  • Degrees of Freedom: 33 + 4(眼睛)

设计信息

Romeo的设计信息多为机械信息,从官方文档可得。其中包含了电机参数(型号,力矩),机械参数(各肢体细节,质心转动惯量),关节参数(转动范围)。
info

这些参数对于使用者和其他设计者来说都是不小的财富,有助于参照其进行自己的初始设计。其电机则全部采用了Maxon的电机。

功能以及其他信息

从视频,图片和新闻所得到的信息,Romeo可以进行行走,执行起坐等行为。 丰富的交互功能可以和人进行交互。

事件

  1. 2012年末, 第一代完成
  2. 2016年, 第二代完成
    design

硬件配置

并未找到细节参数,待补。

传感器

  • Camera*2 左右眼各一个
  • 其他:并未找到细节参数,待补。

电机

motor

参考文档

电池

并未找到细节参数,待补。

亮点 ###

  1. Romeo由于广泛的合作方式,在机器人上验证了仿人机器人相关非常丰富的功能。又因为是由公司产品,定位于家庭,医疗等场景,因此人机交互,安全性,稳定性,类人方面做了非常多的工作。 在这方面,只有同为日本(收购也算)的Asmio有一拼之力。
  2. 实现远程操作的功能,虽然设计距离很远,但是只能在实验室实用。
  3. 从NAO继承了丰富的软件功能,比如NAO-QI,这一点基本可以傲视群雄,唯一遗憾的是不与较为主流的ROS相兼容,自成一派。

小结

Romeo由定位于民用,每4年为一个项目周期,不光在运动控制(行走,抓起等),也在AI方面,协作互动方面投了不少资源。 与科研机构的广泛合作,为仿人机器人的发展提供了大量的科研成果,实为可敬。

simple robots 系列之小笨车

心血来潮,双休时制作了小笨车一部,就权当 simple robots 系列的开端吧。这个系列主要是做一些简单(也许)有趣的小机器人,自娱自乐。也希望能帮到有兴趣的人。

car

硬件准备

以下硬件都是可以在淘宝上可以买到的:

  • Arduino nano

  • 小车底板一份。(这个图只是从买底板的淘宝店截取的)
    carboard

  • 双自由度舵机云台(注:小车底板和舵机要确定能否安装到一起)。
    steer

  • 直流电机驱动。
    driver

  • 稳压器,ASM1117系列即可。
    ams

  • 无线通信模块 : 使用了成都亿佰特的串口模块,E30-TTL-100。
    e30

  • 电池采用了狮子牌7.4V, 1300mah锂电池组,这个只要是5V+的电池(要看稳压)都是可以的只不过我手头刚好有一个这个电池组。

  • 充电可以采用TP405X系列的小充电板,1-2元钱。
    charge

  • 对于想使用WiFi的同学来说,推荐一款NodeMcu ,非常廉价,并且支持lua脚本。

  • 摄像头,自选即可,我采用懒人模式,直接贴了IPHONE的硅胶壳上去,权当把手机当做摄像头来用。至于视频软件,推荐QQ或者Spyke。

软件以及使用方式

软件已上传到github上,链接为https://github.com/Galaxy2416/SimpleWirelessCar

代码非常简单,操作也很简单。

Arduino 主程序

如代码所示,会根据从串口收到的指令来做动作。指令的前四个位用来决定舵机云台的移动,后四个位来决定小车前进后退转弯的操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include "car.h"

Car theCar;
bool pitch_p;
bool pitch_n;
bool roll_p;
bool roll_n;

void setup()
{
theCar.setupDefault();
theCar.setRollPosition(90);
theCar.setPitchPosition(90);
pitch_p = false;
pitch_n = false;
roll_p = false;
roll_n = false;
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
}

void loop()
{
if (pitch_p)
theCar.setPitchPosition((theCar.readPitchPosition() + 1));
else if (pitch_n)
{
if(!((theCar.readRollPosition()<50 || theCar.readRollPosition()>122) && theCar.readPitchPosition()< 105) && theCar.readPitchPosition()> 90)
theCar.setPitchPosition((theCar.readPitchPosition() - 1));
}

if (roll_p)
{
if(!(theCar.readPitchPosition() < 105 && theCar.readRollPosition() >= 122))
theCar.setRollPosition(theCar.readRollPosition() + 1);
}
else if (roll_n)
{
if(!(theCar.readPitchPosition() < 105 && theCar.readRollPosition() <= 50 ))
theCar.setRollPosition(theCar.readRollPosition() - 1);
}

delay(15); // waits 15ms for the servo to reach the position
}

void serialEvent() {
byte cmd = Serial.read();
switch (cmd & 0x0f)
{
case 0x00:
theCar.stop();
break;
case 0x01:
theCar.forward();
break;
case 0x02:
theCar.backward();
break;
case 0x04:
theCar.leftTurn(0);
break;
case 0x08:
theCar.rightTurn(0);
break;
case (0x04 | 0x01):
theCar.leftTurn(1);
break;
case (0x04 | 0x02):
theCar.leftTurn(-1);
break;
case (0x08 | 0x01):
theCar.rightTurn(1);
break;
case (0x08 | 0x02):
theCar.rightTurn(-1);
break;
default:
theCar.stop();
}

switch (cmd & 0xf0)
{
case 0x10:
pitch_p = true;
break;
case 0x20:
pitch_n = true;
break;
case 0x40:
roll_p = true;
break;
case 0x80:
roll_n = true;
break;
default:
pitch_p = false;
pitch_n = false;
roll_p = false;
roll_n = false;
}
}

PC机主程序

PC程序使用Python + pyhooks 实现。

pyhook是一个基于Python的“钩子”库,主要用于监听当前电脑上鼠标和键盘的事件。这个库依赖于另一个Python库PyWin32,如同名字所显示的,PyWin32只能运行在Windows平台,所以PyHook也只能运行在Windows平台。因此如果要在其他系统平台需要使用其他的键盘监听功能。

操作很简单,键盘的上下左右可以控制小车的移动WSAD用来控制云台的转向。就跟电脑的赛车游戏一般操控即可。(但是没那么好玩 =。=)

1
2
3
4
5
6
7
8
9
10
11
if __name__ == '__main__':
# sender
ss = serialSender()
ss.connect_to_serial()
# create a hook manager
hm = pyHook.HookManager()
# watch for all mouse events
# hm.KeyAll = OnKeyboardEvent
hm.SubscribeKeyDown(ss.OnKeyboardEventDown)
hm.SubscribeKeyUp(ss.OnKeyboardEventUp)

其中为了解决连接E30无线模块的问题,也加入一些判断机制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    def connect_to_serial(self):
vid_pid = '10C4:EA60'
# connect to com auto
port_list = list(serial.tools.list_ports.comports())
if len(port_list) <= 0:
print ("The Serial port can't find!")
else:
for i in port_list:
if str(list(i)[2]).find(vid_pid) != -1 : # VID:PID = XXXX:XXXX
port_list_use =list(i)
port_serial = port_list_use[0]
self.ser = serial.Serial(port_serial,9600,timeout = 60)
print ("Find the port >",self.ser)
break
if self.ser == 0:
print("Cannot find the port of wireless serial.")

def close_the_serial(self):
if self.ser != 0:
self.ser.close();

使用的时候请把vid_pid改写成自己USB设备的ID,此功能仅能针对串口转USB设备。

小结

适合跟小朋友一起制作!培养感情~

仿人机器人 之 Valkyrie

公司简介

NASA

https://en.wikipedia.org/wiki/NASA

1958年7月29日,美国总统艾森豪威尔签署了《美国公共法案85-568》,创立了国家航空和太空管理局。

组织简介

Johnson Space Center 约翰逊航天中心
约翰逊航天中心建于1962年,是训练美宇航员、开发、设计太空梭和太空站的基地。

机器人简介

The Valkyrie robotic platform was originally designed and built in 2013 to carry out search and rescue missions inline with the DARPA Robotics Challenge. After a series of electro-mechanical upgrades and a software partnership with IHMC, the Valkyrie platform is now a core robotic platform in the NASA Space Robotics Challenge.

The Valkyrie robot measures about 6 feet in height and weighs 290 pounds. Valkyrie is a 32 degree (实际44,算上小臂和手) of freedom (DOF) walking robot featuring two 6 DOF legs, two 7 DOF arms, a 3 DOF neck, and a 3 DOF waist. Valkyrie utilizes the MultiSense SL in its head, anterior hazard cameras, multiple LORD MicroStrain IMU sensors, and ATI Multi-Axis Force/Torque sensors.

简介
详细

基本参数

  • Weight: 300 pounds
  • Computers: 2 x Intel Core i7
  • Height: 6 feet 2 inches
  • Degrees of Freedom: 44
  • Battery Energy: 1.8kWh

功能以及其他信息

  • 开发周期 : 15个月(基于R2)

从视频,图片和新闻所得到的信息,Valkyrie可以进行较为缓慢的行走,跨越简单的障碍,上下台阶,手部可以抓握并且开关阀门。

Video1

事件

  1. NASA 赠送了3台分别送给爱丁堡大学,MIT和东北大学(美)

硬件配置

板载CPU

  • i7-3615QE @2.3GHz
  • 16GB DDR3 1600
  • 240GB SSD
  • Congatec BS77 Type2 COM Express Module
  • EFK XV1 Carrier Board
  • Ubuntu 14.04 Server

通信总线

由 NASA自研发的Robonet通信总线。其Master是一块PCMCIA设计,猜测其采用了FPGA板卡的设计方案,直接接入主机电脑,由其上可以分出8路Robonet总线,为并行-串行设计。 JSC并没有公布总线的带宽,吞吐量和实时性。其中一路带宽应在50Mbps以下(比如CAN是1Mbps。
而PCMCIA总线分为两类,一类为16位的PCMCIA,另一类为32位的CardBus。
PCMCIA的频率为33MHz,位宽16bit,带宽为66MB/S
CardBus的频率为33MHz,位宽32bit,带宽133MB/S
可见总线带宽理应在 8Mbps(如果单路是CAN,位1*8) - 133Mbps(PC总线速率)范围,既然采用了PCMCIA应在100Mbps左右。

头部

集成了MultiSense SL 。波士顿动力的Altlas也采用了同款设备。此设备包含仿人机器人的基本需求,且完美支持ROS。

传感器

  • ATI 传感器 * 2 放置在脚底板
  • IMU 传感器 两个于腰部 3DM-GX4-15 by LORD MicroStrain
  • MultiSense SL

电机,减速器以及驱动(关节)

JSC并没有透露过于详细的信息。
简介
详细

  • 根据参考文档,与常规机器人不同的是,在踝关节和小臂上采用了线性驱动 + 弹性结构的特点。

  • 采用了弹簧变位作为力矩传感器,噪声依旧很大(The loadcells are placed closer to the joint output giving them better dynamic sensing performance but suffer from a higher noise floor than the spring deflection sensor due to their analog signal properties.)

因此对关节运动进行了建模,并且引入了Disturbance Observer (DOB)等方法。(The goal of our torque control approach is to make each SEA appear to the multi-joint controller as an
ideal torque source, or at least a low-pass filtered torque source. That is, we want to avoid modeling internal
actuator dynamics at the multi-joint level, and instead only model the effects of the rigid body system. Prior
work in this area has demonstrated that effective decoupling of the fast actuator-level dynamics from the
slower multi-body dynamics is indeed possible (Ott et al., 2003). However, in this work torque errors remain
large (around 50Nm) and thus do not adequately abstract an actuator as an ideal torque source.)

  • 将关节力矩控制分离到各个关节,多关节控制可以直接控制其力矩,算法层面应采用的是力矩相关控制。
    力矩分散控制
    力控制模型

电池

电池可以从背板直接抽取放置。非常方便。

其他

自制的灯板很帅

亮点的功能 ###

  1. A removable battery in its backpack is good for about an hour of activity, and a human can swap in a fresh battery for a spent one in a matter of minutes. Also removable are Valkyrie’s limbs: in just a few more minutes, a damaged arm can be swapped out for a new one, and the left arm can even be swapped with the right arm, since they’re identical in construction.
    Valkyrie的电池和四肢可以非常容易的拆卸和安装。这种设计意味着快速的维修和方便的调试(需要设计),从产品进化来讲,将会是机器人在前中期的趋势(比如移动电话的前中期也是依赖于各组件的组合)。

  2. Our robot is soft. If you brush against it while you’re working, you don’t want to feel this cold, hard metal. You want it to feel natural, like you’re working next to another human being.
    Valkyrie采用了柔性的保护措施,并且专门成了相关的实验室。这将是机器人与人接触必然要解决的问题。

小结

Valkyrie由于定位于空间站,且计划应用于2030年,所以并未进入市场。 所研究的方向并没有全力集中在行走等腿部行为,抓取,操作设备方面更具有特点。 其设计成本极其高昂, 机械选材很高端和设计非常精细,电子电器设计大量采购集成商品,软件应用层面现在(3/23/2017)所见并非其主要工作投入,控制层面主要集中在硬件建模上,当然行为方面也有不俗的成果,预计以后会与大学深入合作来扩展这方面。

Valkyrie