ROS探索总结(七十)—— 古月私房课 | 基于ROS设计一款机械臂控制系统

8920
30
2019年4月25日 20时51分

~欢迎关注~

微信公众号:古月居

新浪微博:古月春旭

知乎专栏:古月居

原文链接:古月私房课 | 基于ROS设计一款机械臂控制系统

 

古月居联合深蓝学院推出的“古月私房课”第一弹——《ROS机械臂开发:从入门到实战》已经上线啦,欢迎各位小伙伴前来围观,以下是第11讲《基于ROS设计一款机械臂控制系统》的内容精要。

大家好,这里是《ROS机械臂开发:从入门到实战》的第11讲——基于ROS设计一款机械臂控制系统,我是主讲人胡春旭。

幻灯片1

今天我们将从以下两个方面为大家介绍ROS机械臂控制系统的设计。

幻灯片2

首先我们来看看ROS控制系统的设计方法。

幻灯片3

回顾之前介绍的这张框架图,其中抽象出了控制系统的关键部分,虚线左边可以利用MoveIt!快速搭建运动规划层的功能,具体如何将规划得到的数据落实到机器人上的绿色部分,是我们要实现的重点。

幻灯片4

这里可以用之前讲过的ros_control来实现,ros_control主要分成两个层次,一个是硬件无关的控制算法,一个是和硬件相关的硬件抽象层,需要根据使用的硬件来实现硬件抽象层的read和write方法。

幻灯片5

ros_control是一个控制器框架,如果其中没有满足我们的控制器,也可以自己进行实现,如下是一个简单的闭环控制器结构。

幻灯片6

以上只是针对控制的部分,整个机械臂控制系统的搭建可以参考ROS-I的五层架构。

幻灯片7

PROBOT Anno的控制系统就是基于ROS-I框架实现的,我们以此为例为大家介绍一种控制系统的设计方法。

幻灯片8

PROBOT Anno的定位是桌面级科研和学习的ROS机械臂平台,充分支持ROS中的各种开发接口功能,目前已经上市,大家也可以参考wiki上的介绍。

幻灯片9

在硬件层面上,PROBOT Anno的控制系统以我们开发的ROBCELL控制器为核心,向上连接PC端运行的ROS环境,向下连接驱动器和电机,驱动机械臂运动,还可以通过IO控制外部继电器。

幻灯片10

在软件层面上,我们基于ROS-I设计了控制系统的框架。上边四个层次运行在ROS环境中,完成机械臂的运动规划和应用处理,然后用simple message发给底层控制器。控制器基于ARM+FPGA的异构SoC平台,FPGA端完成电机控制、接口扩展、算法加速等,ARM端实现轨迹控制、运动学、系统管理等,具体每个层次实现的功能如下。

幻灯片11

交互层基于Rviz设计了一系列便于使用的交互界面。

幻灯片12

规划层利用MoveIt!实现运动规划,集成Opencv和Tensorflow实现图像处理和识别,调用科大讯飞SDK实现语音识别,扩展交互能力。

幻灯片13

控制和反馈信息都需要封装成具体的数据流发送,我们将这些数据划分成了四种类型。

幻灯片14

数据封装好之后就可以利用simple message发送出去了。

幻灯片15

控制器是设计和实现的重点,我们基于ROS中的部分功能包,进行了源码级的移植和优化。在设计时需要注意部分功能对实时性要求较高,我们单独放到了一个ARM裸核里进行处理,最大程度提高实时性。

幻灯片16

硬件上除了六轴本体之外,还可选配多种终端执行器、相机和麦克风阵列。

幻灯片17

基于类似的架构,我们还做过一款工业机械臂,有兴趣的小伙伴可以参考:

功夫手:一款基于ROS的工业机器人

幻灯片18

为了最大程度提高控制器和驱动器的一体化性能,我们还设计了集成伺服驱动算法的SoC。

幻灯片19

精简的平台设计不再需要繁杂的通信和接线,在大大减小控制系统体积和成本的同时,提高了机器人的控制性能。

幻灯片20

以上就是本讲的内容精要,详细讲解过程和仿真/真机演示过程请见具体课程。

幻灯片21

更多精彩,欢迎大家关注“古月居”。

幻灯片24

 

更多内容欢迎关注:

微信公众号:古月居 (guyue_home)

新浪微博:古月春旭

知乎专栏:古月居

发表评论

后才能评论

评论列表(30条)

  • mr.guo 2019年9月29日 下午3:23

    请教个问题,使用ros controller 位置控制中 关节轨迹控制器,如何配置插补,想用3次样条插补,不知道在哪配置,上wiki上只找到支持 3 次 5次样条插补,但是没看到如何使用 如何配置

  • mr.guo 2019年9月21日 下午4:35

    我在使用ros controller 实现控制真实机械臂,机械臂是通过串口arduino控制的,硬件层的测试控制没有问题,打算使用controller 位置控制器来与硬件对接。按照官方步骤重写了 read,write函数,且controller也能正常连接上,目前主要问题是为在rviz界面拖拽机械臂,可以监控到moveit规划出来(/dorobot_ros/follow_joint_trajectory/goal)消息的数据,但是为在controller中用来 存储命令的 cmd数组中读不到数据。请问这是什么原因,读写函数数据传输是正常的,不清楚moveit输出的轨迹数据,去了哪里,在哪接受,为啥cmd命令数组里是空的,每次发到硬件上的数据都是0

  • Leo 2019年7月12日 下午5:35

    古月老师,我有一个疑问想请您解答一下,关于机器人编程中的资源问题,在一个实际的项目中,机器人的可用资源具体是指哪些方面呢?在编程中又如何体现呢?

  • gan 2019年6月25日 下午3:33

    古老师,你好!我目前可以对一个真实UR机器人进行控制,请问一下如何实现对两个真实机器人进行控制?主要修改那些文件?

    • 古月 回复 gan 2019年6月28日 上午10:23

      参考PR2机器人,两个机器人分别是两个group

    • gan 回复 古月 2019年7月7日 下午2:02

      胡老师,我参考了PR2机器人,也进行了moveit配置运行demo.launch没问题,但是不知道如何在driver文件连接2个真实UR机械臂,请问对同时连接2个真实UR机械臂有什么建议方法吗?
      另外我使用单臂UR的时候尝试更改xacro模型文件joint名称,也进行了moveit配置运行demo.launch没问题,也在controllers.yaml更改了,但获取不到关节信息,运行rostopic echo joint_states后显示的关节名称还是修改以前的,我应该还要修改哪些文件?

    • 古月 回复 gan 2019年7月9日 下午8:04

      最好的方法就是照着别人的项目代码做,这样有参考,PR2、baxter都是双臂的。可以对文件内容进行搜索,涉及的文件还是挺多的

    • gan 回复 古月 2019年7月11日 下午3:25

      嗯,谢谢胡老师。如果我想在机械臂运动的时候暂停其运动,在moveit的接口.py中有没有停止指令,让机器人停止运动?

    • 古月 回复 gan 2019年7月12日 下午10:08

      参考API手册,有stop指令

    • gan 回复 古月 2019年7月20日 下午2:28

      胡老师,我想让机械臂末端经过A、B、C几个路点,中间不停止,我该如何控制呢?我在你的书本上看是将每一个点当成终点进行规划然后运动,请问有什么语句或方法可以实现一次全部规划完成中间不停顿?

    • 古月 回复 gan 2019年7月25日 下午10:26

      可以多次规划后把轨迹拼接到一起,然后执行

    • gan 回复 古月 2019年8月5日 下午3:34

      谢谢古月老师!我还有个问题想请教,我在demo.launch 的rviz仿真中,给末端位置执行运动规划可以实现,但当连接真实UR机械臂后给当前末端位置移动x,机械臂会乱甩,不能像仿真那样很好的移动。这是什么原因呢?

    • lucas li 回复 gan 2019年8月28日 下午3:31

      [ERROR] [1566977222.251064249]: Controller is taking too long to execute trajectory (the expected upper bound for the trajectory execution was 5.692110 seconds). Stopping trajectory.
      胡老师,连接真是机器人 ABB 出现这个,求解……..

  • 小李 2019年6月18日 下午4:51

    请问下古老师,如何能够将机器人的各个关节的关节状态发布到话题/joint_states,有什么方法吗?或者可以参考的地方?使用的机器人是安川的 motoman

    • 古月 回复 小李 2019年6月19日 上午10:43

      可以自己写个驱动发布,也可以参考ROS-I里边的实现

  • 小李 2019年5月29日 上午8:45

    古月老师,请问下,在机械臂实际运行的情况下,为什么会出现
    [ERRO]Aborting Trajectory. Failed to send point (#0): Invalid message (3) : Trajectory start position doesn’t match current robot position (3011)
    这个问题应该如何解决?

    • 古月 回复 小李 2019年5月30日 上午10:29

      规划起始位置和当前位置差距比较大

    • 小李 回复 古月 2019年5月31日 下午1:52

      这个问题,有什么具体的方法可以解决吗?

  • 小李 2019年5月23日 下午1:48

    请问一下古老师,如何能够在交互层中设置IO接口的界面,并且能够和控制器的IO联通?

    • 古月 回复 小李 2019年5月23日 下午5:17

      做一个qt界面,然后发送信息,再接到IO的驱动上

    • 小李 回复 古月 2019年5月28日 下午5:00

      古月老师,这个问题我解决了,但是在实际操作过程当中,遇到如下问题:
      [ERROR] [1559033590.035806668]: Aborting Trajectory. Failed to send point (#0): Invalid message (3) : Trajectory start position doesn’t match current robot position (3011)
      [ERROR] [1559033600.554158922]: Controller is taking too long to execute trajectory (the expected upper bound for the trajectory execution was 10.799962 seconds). Stopping trajectory.
      请问一下,这个该怎么解决呢?

  • 荔枝 2019年4月29日 上午11:24

    胡老师您好,有一问题向您请教,在学习ROS机器人开发实践的Gazebo中的机械臂仿真部分时,在roslaunch marm_gazebo arm_gazebo_control.launch时,出现了如下错误:Could not load controller ‘joint1_position_controller’ because controller type ‘position_controllers/JointPositionController’ does not exist. 请问是什么原因,应如何解决?万分感谢!

    • 古月 回复 荔枝 2019年4月30日 上午10:54

      安装ros-control、ros-controllers、gazebo-ros-control

    • 荔枝 回复 古月 2019年5月6日 下午12:18

      谢谢,问题解决了。

  • 刘江 2019年4月28日 上午9:13

    古月大神,如果希望机械臂的末端一次经过曲线上所有的点,应该怎么实现。万分感谢????

    • 古月 回复 刘江 2019年4月28日 上午11:38

      可以把所有点放到一条轨迹里再执行

    • 刘江 回复 古月 2019年4月28日 下午10:22

      谢谢您的回复,您的意思是不是先通过plan每一个点的轨迹,然后把所有点规划的结果放到一个列表中依次执行?我在仿真的时候发现,如果按照每个点单独去规划,它的轨迹是随机的,如果再把它们拼在一起,合成的轨迹可能不是我希望的一条曲线。我试图把所有点放到路点(非笛卡尔路径规划ok)列表中,通过笛卡尔路径规划,没有任何一个点得到解,不知其故,烦请大神指点迷津。

    • 古月 回复 刘江 2019年4月30日 上午10:53

      就算是在工作范围内,笛卡尔路径规划也不是百分百稳定的,可以写个for循环,多规划几次,另外和使用的运动学求解器也有关系,可以换ikfast试试

  • 宋星星 2019年4月27日 下午9:21

    胡老师您好,想请教一个问题,最近学习ROS机器人开发实践时,利用moveit控制gazebo中的机械臂,出现 ABORTED: Solution found but controller failed during execution,gazebo中的机械臂不跟随moveit中的机械臂一起运动,是什么问题?应该怎么解决?谢谢老师。

    • 古月 回复 宋星星 2019年4月28日 上午11:37

      检查controller的参数配置吧,看有没有连接成功