ROS探索总结(二十七)——ROS Industrial

  • 内容
  • 评论
  • 相关

工业机器人是机器人中非常重要的一个部分,在工业领域应用广泛而且成熟,ROS迅猛发展的过程中,也不断渗入到工业领域,从而产生了一个新的分支——ROS-IndustrialROS-I)。

      ROS-I的官网: http://rosindustrial.org/

Capture

一、ROS-I的目标

  1. ROS强大的功能应用到工业生产的过程中;
  2. 为工业机器人的研究与应用提供快捷有效的开发途径;
  3. 为工业机器人创建一个强大的社区支持;
  4. 为工业机器人提供一站式的工业级ROS应用开发支持。

      ROS向工业领域的渗透,可以将ROS中丰富的功能、特性带给工业机器人,比如运动规划,运动学算法,视觉感知,还有rvizgazebo等工具,不仅降低了原本复杂严格的工业机器人研发门槛,而且在研发成本发面也具有极大的优势。

二、ROS-I的安装

在完整安装ROS之后,通过以下的命令就可以安装ROS-I了:

  1. $ sudo apt-get install ros-indigo-industrial-core ros-indigo-open-industrial-ros-controllers

三、ROS-I的架构

clip_image004[4]

  1. GUI:上层UI分为两个部分:一个部分是ROS中现在已有的UI工具;另外一个部分是专门针对工业机器人通用的UI工具,不过是将来才会实现。
  2. ROS LayerROS基础框架,提供核心通讯机制
  3. MoveIt! Layer:为工业机器人提供规划、运动学等核心功能的解决方案
  4. ROS-I Application Layer:处理工业生产的具体应用,也是针对将来的规划
  5. ROS-I Interface Layer:接口层,包括工业机器人的客户端,可以通过 simple message协议与机器人的控制器通信
  6. ROS-I Simple Message Layer:通信层,定义了通信的协议,打包和解析通信数据
  7. ROS-I Controller Layer:机器人厂商开发的工业机器人控制器。

从上边的架构我们可以看到,ROS-I在复用已有ROS框架、功能的基础上,针对工业领域进行了针对性的拓展,而且可以通用于不同厂家的机器人控制器。

   

四、ROS-I控制UR机械臂

Universal Robots是丹麦的一家工业机器人制作商,主要的机器人产品有:UR3UR5UR10,分别针对不同的负载:

clip_image006[4]

我们以该机器人作为示例,看一下ROS-I的应用。

4.1 安装

   首先我们需要安装UR机器人的ROS功能包集。

  1. $ sudo apt-get install ros-indigo-universal-robot

   该功能包集包含了UR仿真、运行需要的主要功能包:ur_description ur_driver ur_bringup ur_gazebo ur_msgsur10_moveit_config/ur5_moveit_config ur_kinematics

 

4.2 运行

安装完成后,使用下边的命令,我们就可以看到UR10的机器人模型了(第一次运行需要等待较长时间完成模型加载):

  1. $ roslaunch ur_gazebo ur10.launch

    clip_image008[4]

然后我们让机械臂动起来,需要运行MoveIt运动规划的节点:

  1. $ roslaunch ur10_moveit_config ur10_moveit_planning_execution.launch sim:=true

然后运行rviz

  1. $ roslaunch ur10_moveit_config moveit_rviz.launch config:=true

clip_image010[4]

启动之后,我们可以看到rivz中的机器人模型和gazebo中的机器人模型应该是一样的姿态。在rviz中,我们可以用鼠标拖动机器人的终端,然后点击planning标签页中的plan nad execute就可以让机器人规划路径并且到达目标位置了,gazebo中的模型也会跟随变化。

clip_image012[4]

 4.3 分析

看到这里,也许我们会有一个疑问:这不就是MoveIt那一套东西么, 感觉和ROS-I并没有什么关系?再回头看ROS-I的架构,这种架构的上层控制本身就是复用的已有的软件包,ROS-I目前主要关注的是如何使用这些软件包来控制工业机械臂,也就是最下边的三层结构。我们把这三层从上到下分析一下:

首先是ROS-I Interface Layer层,这一层需要我们设计一个机器人的客户端节点,主要功能是完成数据从ROS到机械臂的转发,ROS-I为我们提供了许多编程接口,可以帮助我们快速开发,下图就是几个比较常用的API,具体API的使用说明可以查看官方文档。

clip_image014[5]

对于机械臂来讲,这里最重要的是 robot_state joint_trajectory robot_state包括很多状态信息,ROS-I都已经帮我们定义好了,可以去industrial_msgs包里看到消息的定义文件。joint_trajectory订阅了MoveIt规划出来的路径消息,然后打包发送给最下层的机器人服务器端。通常会把这一层的功能封装成robot_name_driver功能包,可以看ROS-IABBUR的机械臂都是这样的,可以参考他们的源码进行设计。

然后是ROS-I Simple Message Layer层,这一层主要是上下两层的通信协议。Simple Message这个协议是基于TCP的,上下层客户端和服务器端的消息交互,全部通过这一层提供的API进行打包和解析。具体使用方法可以参考http://wiki.ros.org/simple_message,也可以直接看ROS-I的源码:https://github.com/ros-industrial/industrial_core,主要实现SimpleSerializeTypedMessage两个类的功能即可。

最下层的ROS-I Controller Layer是厂家自己的控制器,考虑到实时性的要求,一般不会使用ROS,只要留出TCP的接口即可,接收到trajectory消息解析之后,就按照厂家自己的算法完成动作了。

可见,如果我们想要通过ROS-I来控制自己的机械臂,最下边的三层使我们需要实现的重点,上层运动规划部分可以交给ROS来完成。


原创文章,转载请注明: 转载自古月居

本文链接地址: ROS探索总结(二十七)——ROS Industrial

微信 OR 支付宝 扫描二维码
为本文作者 打个赏
pay_weixinpay_weixin

评论

44条评论
  1. Gravatar 头像

    云隐 回复

    大神,请问我用qt5做了一个工业机器人操作界面,包括示教点动这些功能。我现在的ros做到了用rviz控制机械臂动这一步,然后有用一些Python写一些基本功能节点。现在我想把qt做的界面和ros连接一起,请问通过什么方式或者有什么接口吗?十分感谢

  2. Gravatar 头像

    样样洋洋 回复

    为什么安装上面步骤会出现这样的,在运行gazebo中,之后gazebo就
    死机。
    nouveau: 0x0000214a
    nouveau: 0x0000214b
    nouveau: 0x0000214c
    nouveau: 0x0000214d
    nouveau: 0x0000214e
    nouveau: 0x0000214f
    nouveau: 0x00002150
    nouveau: 0x00002151

    • 古月

      古月 回复

      @样样洋洋 gazebo对硬件有一定要求,使用的是虚拟机么?可以重装gazebo试下

      • Gravatar 头像

        样样洋洋 回复

        @古月 不是虚拟机,就是电脑里只有ubuntu这个系统

  3. Gravatar 头像

    赵申申 回复

    古月大神你好,我现在有两台UR的机械臂,我想在ros中同时驱动两个机械臂,但是只有一个驱动包,可以实现吗,相同的机械臂他们的控制器,描述文件等都是相同的,有办法解决吗?

    • 古月

      古月 回复

      @赵申申 是可以实现的,但是重复的参数应该要重映射一下,可以参考PR2这样的双臂机器人看看

  4. Gravatar 头像

    韩鑫磊 回复

    使用这个能不能连接真实的机器人啊?我们这里有一台ABB1200,想要做一些轨迹规划的东西,刚刚接触还无从下手。。。

    • 古月

      古月 回复

      @韩鑫磊 是可以连接真实机器人的,可以参考http://wiki.ros.org/abb_irb1200_support

  5. Gravatar 头像

    luo 回复

    您好,当我设置PC-数莓派主从机时出现以下错误,您知道是哪里出问题了吗?
    [FATAL] [1523445862.640188209]: Couldn't parse the master URI [https://10.139.51.53:11311] into a host:port pair.
    Couldn't find an AF_INET address for []
    Couldn't find an AF_INET address for []
    [ERROR] [1523445862.677728048]: [registerPublisher] Failed to contact master at [:0]. Retrying...
    Couldn't find an AF_INET address for []
    Couldn't find an AF_INET address for []
    Couldn't find an AF_INET address for []
    Couldn't find an AF_INET address for []
    Couldn't find an AF_INET address for []
    Couldn't find an AF_INET address for []
    Couldn't find an AF_INET address for []
    Couldn't find an AF_INET address for []

    • 古月

      古月 回复

      @luo IP地址可以ping通么?可以在hosts里边设置一个IP和电脑名的映射

  6. Gravatar 头像

    李胜飞 回复

    古月君,你好!我按照你4.2的步骤运行了我的一个仿真,结果rviz中规划,机械臂动作了,但是gazebo中机械臂没有任何动作,请问这是什么原因?

    • 古月

      古月 回复

      @李胜飞 那应该是控制器没连接上,你有修改过这个包么?默认应该是配置好的,检查一下controller都启动没有

      • Gravatar 头像

        李胜飞 回复

        @古月 谢谢胡老师,确实是controller的问题。

  7. Gravatar 头像

    - 回复

    您好,当我运行ros rviz rviz时,出现断错误,是什么原因造成的。
    QT : XKEYBOARD extension not present on the X server
    xlib: extension "RANDR" missing on display ":10.0"
    [INFO] [1522739508.125884770]: rviz version 1.12.11
    [INFO] [[1522739508.126225846]: compiled against QTversion 5.5.1
    [INFO] [[1522739508.126351360]: compiled against OGRE version 1.9.0 (Ghadamon)
    段错误

    • 古月

      古月 回复

      @- 看上去是依赖的QT版本有问题了,你用的是什么版本的ROS和ubuntu,有没有自己装过Qt?

    • Gravatar 头像

      - 回复

      @- kinetic版本的,ubuntu16.04,没有QT

      • 古月

        古月 回复

        @- 你用命令行重新装一次rviz试试

        • Gravatar 头像

          - 回复

          @古月 重装一次还是会提示段错误的提示

  8. Gravatar 头像

    灰太狼 回复

    古月大神,我在ur_grzebo/controller目录下找到了arm_controller_ur10.yaml,里面这样的:
    arm_controller:
    type: position_controllers/JointTrajectoryController
    joints:
    - shoulder_pan_joint
    - shoulder_lift_joint
    - elbow_joint
    - wrist_1_joint
    - wrist_2_joint
    - wrist_3_joint
    constraints:
    goal_time: 0.6
    stopped_velocity_tolerance: 0.05
    shoulder_pan_joint: {trajectory: 0.1, goal: 0.1}
    shoulder_lift_joint: {trajectory: 0.1, goal: 0.1}
    elbow_joint: {trajectory: 0.1, goal: 0.1}
    wrist_1_joint: {trajectory: 0.1, goal: 0.1}
    wrist_2_joint: {trajectory: 0.1, goal: 0.1}
    wrist_3_joint: {trajectory: 0.1, goal: 0.1}
    stop_trajectory_duration: 0.5
    state_publish_rate: 25
    action_monitor_rate: 10
    请问下这是否就是你说的插补功能相关代码?如果不是麻烦给说明下具体目录,我找了很久了。

  9. Gravatar 头像

    灰太狼 回复

    古月大神,再请教下。我现在就拿UR10来举例,我在ur10_moveit_config文件夹下找到了controllers.yaml.里面是这样的
    controller_list:
    - name: ""
    action_ns: follow_joint_trajectory
    type: FollowJointTrajectory
    joints:
    - shoulder_pan_joint
    - shoulder_lift_joint
    - elbow_joint
    - wrist_1_joint
    - wrist_2_joint
    - wrist_3_joint
    你说需要配置下controller,这个该如何配置啊?我要如何操作才能获取到moveIT规划出来的路径数据?你给我的参考链接我看了下,也没找到具体配置的方法,麻烦赐教!谢谢

    • 古月

      古月 回复

      @灰太狼 这个就是UR机器人的controller配置,它这里已经配置好了,不需要修改。如果是自己创建的包,这个文件默认是空的,可以仿照他这里的配置做。
      以UR机器人为例,运行仿真器和moveit:
      roslaunch ur_gazebo ur5.launch
      roslaunch ur5_moveit_config ur5_moveit_planning_execution.launch sim:=true
      roslaunch ur5_moveit_config moveit_rviz.launch config:=true
      上边三个启动完成后,就会打开gazebo和moveit的界面,然后再开一个终端,订阅以下话题:
      rostopic echo /arm_controller/follow_joint_trajectory/goal
      然后在moveit界面中做目标规划执行,就可以看到订阅到的轨迹点了,由一系列路径点组成,大概10个左右。

      • Gravatar 头像

        灰太狼 回复

        @古月 按照你说的操作得到10组这样的轨迹数据:
        positions: [6.310422092893633e-05, -0.1744431725310756, -0.000815697548054767, -0.17445541412962917, -3.656963720477127e-05, 8.441200831647394e-05]
        velocities: [-5.4005555435684414e-05, -0.7343696991862021, 0.00039190707159373066, -0.734325456659709, 4.962654035698225e-05, -4.807676412504832e-05]
        accelerations: [-0.0001546103299687222, -2.1023974403045798, 0.001121974974006939, -2.1022707801570344, 0.00014207382403346805, -0.00013763703206523564]
        effort: []
        time_from_start:
        secs: 0
        nsecs: 401618713
        以下问题:
        1.按照你的其他文章说的方法,就是根据这10组数据来做插补吧?(两种方法:一种是用ROS自带的joint_trajectory_controller包的插补,第二种方法就是你采用的在非ROS环境中实时计算插补的,自己写插补算法,这种方法需要把这10组轨迹点实时传输到非ROS环境的Linux下吧?)
        2.我现在先不管插补,我想先把这10组数据的轨迹点传给运动控制卡(运动控制卡那边是接收6个轴的目标角度即可),那么我想知道positions这个参数后面的6个数是否就是6个关节的角度?如果是,那是不是把positions的数据传给运动控制卡,就可驱动相应电机运动到特定的位置(这里不考虑我的机械臂结构参数是否和UR10一致,因为我目前只是想驱动6轴的电机,还没有成型的机械臂),如果不是这样,那需要如何做才能转换成运动控制卡需要的目标角度值?
        3.velocities,accelerations,effort,time_from_start,secs,nsecs这六个参数是做插补算法是必须要用到的么?分别有何作用?它们与我想把目标角度传递给运动控制卡有没什么关联?谢谢

        • 古月

          古月 回复

          @灰太狼 1. 是的,根据这里的数据插补
          2. positions、velocities、accelerations对应六个轴的位置、速度、加速度。数据是这样的,需要看你用的运动控制卡的接口需求了。
          3. effort用不到,time_from_start、secs、nsecs都是时间参数,代表这个路径点的时间点,插补算法是需要的,周期插补输入的就是时间参数,输出是关节位置。运动控制卡我不了解,你要参考运动控制卡的需求。

          • Gravatar 头像

            灰太狼 回复

            @古月 1.我和运动控制卡厂家沟通了,就是需要插补后输出的关节角度即可,那么我想先采用ROS里面的插补算法来实现(先不考虑实时性),你说插补算法在joint_trajectory_controller包,这个我需要如何调用相关接口?有没有资料可参考?我想看到插补后输出的数据(还是以UR10为例子,就像你上面用rostopic echo /arm_controller/follow_joint_trajectory/goal查看moveIT规划的10组轨迹一样。)
            2.我看资料说ROS自带的插补输出周期500ms,这是真的么?还是我误解了?如果的确是500ms,那是否就是这个原因导致自带的插补实时性太差?所以你们才选择非ROS环境自己写插补?

            • 古月

              古月 回复

              @灰太狼 1. 按照我的理解,你输入运动控制卡的应该是这10组轨迹点,运动控制卡没有插补功能?如果是轨迹点的话,可以用moveit的编程接口获取,具体可以看moveit的API和编程方法。如果确实需要插补值,那就需要考虑插补的实时性了。
              2. ROS本身的通讯机制决定了它不具备实时性,所以我并没有测试ROS的插补周期,也没有用ROS的这部分功能。我们没有用运动控制卡,底层的关节插补都是自己实现的。

              • Gravatar 头像

                灰太狼 回复

                @古月 我这卡没有插补功能,我先不考虑实时性,因为这也不是做产品,我现在想用ROS自带的插补,就是你说的在joint_trajectory_controller包,这个该如何调用啊?还是以UR10为例,把得到的这10组轨迹点数据传给插补的插件么?这方面有没资料,我搜索了ROS自带插补相关信息,没找到方法,还望指点,非常感谢你!

                • 古月

                  古月 回复

                  @灰太狼 JointTrajectoryController内部的实现使用的是五次样条或者三次样条,这个可以看源码的,具体插补的输出我也只是在仿真里用过。这部分的资料确实很少,只能看源码,源码包里会有单元测试,从这些单元测试中可以找到使用方法。
                  另外插补算法本身不复杂,自己写一个也时可以的。

  10. Gravatar 头像

    灰太狼 回复

    古月大神,请教下如何接收到trajectory来的路径消息?我想查看MoveIt规划出来的路径,是否能看到规划路径每个点的目标角度制?在RViz里context下有个warehouse,Host地址是做什么用的呢?谢谢

  11. Gravatar 头像

    pdmike 回复

    大神 您好 请问下 我运行roslaunch ur_gazebo ur10.launch时 发生以下错误
    while processing /opt/ros/indigo/share/ur_description/launch/ur10_upload.launch:
    Invalid tag: Cannot load command parameter [robot_description]: command [/opt/ros/indigo/lib/xacro/xacro --inorder '/opt/ros/indigo/share/ur_description/urdf/ur10_robot.urdf.xacro'] returned with code [2].

    Param xml is
    The traceback for the exception was written to the log file
    我UR的所有package应该都装了 是什么问题 跪求

    • 古月

      古月 回复

      @pdmike 这个错误提示是说模型文件有问题,无法解析,一般是因为xacro模型文件中的元素有问题

      • Gravatar 头像

        pdmike 回复

        @古月 您说的是 ur10_robot.urdf.xacro 中元素有问题?这些我是直接用sudo apt-get install 直接下载的,会有问题吗?另外用这个指令下载完package以后还需要操作什么步骤?需要编译吗?

        • 古月

          古月 回复

          @pdmike 直接下载的应该不会有问题,我在我的电脑上试过是可以运行的,下载之后也不需要编译。ur10_robot.urdf.xacro这个文件是确定存在的吧?

        • 古月

          古月 回复

          @pdmike 试一下这个帖子的方法:https://groups.google.com/a/rethinkrobotics.com/forum/#!topic/brr-users/JS-Kb5NbYEE
          把ur10_upload.launch中的--inorder删掉试试

          • Gravatar 头像

            sslss 回复

            @古月 请问下 显示和调整机械臂每个轴位置的界面 joint state 是怎么调出来的 是在RVIZ中还是gazbo中?

            • 古月

              古月 回复

              @sslss 在rviz中,启动joint_state_publisher,并且启动gui

    • Gravatar 头像

      erice 回复

      @pdmike 你好, 我运行roslaunch ur_gazebo ur10.launch时 也发生一样的错误,请问你这个问题是如何解决的。
      while processing /opt/ros/indigo/share/ur_description/launch/ur10_upload.launch:
      Invalid tag: Cannot load command parameter [robot_description]: command [/opt/ros/indigo/lib/xacro/xacro --inorder '/opt/ros/indigo/share/ur_description/urdf/ur10_robot.urdf.xacro'] returned with code [2].

  12. Gravatar 头像

    豆豆 回复

    ros-I和ros_control是什么关系

    • 古月

      古月 回复

      @豆豆 ROS-I是ROS应用于工业机器人的一套框架,ros_control是针对机器人底层控制的功能包集,不限于工业机器人

  13. Gravatar 头像

    章金锋 回复

    古月 看下邮件 ,我给您发了邮件了 谢谢!盼复

发表评论

电子邮件地址不会被公开。 必填项已用*标注