工业机器人是机器人中非常重要的一个部分,在工业领域应用广泛而且成熟,ROS迅猛发展的过程中,也不断渗入到工业领域,从而产生了一个新的分支——ROS-Industrial(ROS-I)。
ROS-I的官网: http://rosindustrial.org/
一、ROS-I的目标
- 将ROS强大的功能应用到工业生产的过程中;
- 为工业机器人的研究与应用提供快捷有效的开发途径;
- 为工业机器人创建一个强大的社区支持;
- 为工业机器人提供一站式的工业级ROS应用开发支持。
ROS向工业领域的渗透,可以将ROS中丰富的功能、特性带给工业机器人,比如运动规划,运动学算法,视觉感知,还有rviz,gazebo等工具,不仅降低了原本复杂严格的工业机器人研发门槛,而且在研发成本发面也具有极大的优势。
二、ROS-I的安装
在完整安装ROS之后,通过以下的命令就可以安装ROS-I了:
$ sudo apt-get install ros-indigo-industrial-core ros-indigo-open-industrial-ros-controllers
三、ROS-I的架构
- GUI:上层UI分为两个部分:一个部分是ROS中现在已有的UI工具;另外一个部分是专门针对工业机器人通用的UI工具,不过是将来才会实现。
- ROS Layer:ROS基础框架,提供核心通讯机制
- MoveIt! Layer:为工业机器人提供规划、运动学等核心功能的解决方案
- ROS-I Application Layer:处理工业生产的具体应用,也是针对将来的规划
- ROS-I Interface Layer:接口层,包括工业机器人的客户端,可以通过 simple message协议与机器人的控制器通信
- ROS-I Simple Message Layer:通信层,定义了通信的协议,打包和解析通信数据
- ROS-I Controller Layer:机器人厂商开发的工业机器人控制器。
从上边的架构我们可以看到,ROS-I在复用已有ROS框架、功能的基础上,针对工业领域进行了针对性的拓展,而且可以通用于不同厂家的机器人控制器。
四、ROS-I控制UR机械臂
Universal Robots是丹麦的一家工业机器人制作商,主要的机器人产品有:UR3、UR5和UR10,分别针对不同的负载:
我们以该机器人作为示例,看一下ROS-I的应用。
4.1 安装
首先我们需要安装UR机器人的ROS功能包集。
$ sudo apt-get install ros-indigo-universal-robot
该功能包集包含了UR仿真、运行需要的主要功能包:ur_description, ur_driver, ur_bringup, ur_gazebo, ur_msgs, ur10_moveit_config/ur5_moveit_config, ur_kinematics。
4.2 运行
安装完成后,使用下边的命令,我们就可以看到UR10的机器人模型了(第一次运行需要等待较长时间完成模型加载):
$ roslaunch ur_gazebo ur10.launch
然后我们让机械臂动起来,需要运行MoveIt运动规划的节点:
$ roslaunch ur10_moveit_config ur10_moveit_planning_execution.launch sim:=true
然后运行rviz:
$ roslaunch ur10_moveit_config moveit_rviz.launch config:=true
启动之后,我们可以看到rivz中的机器人模型和gazebo中的机器人模型应该是一样的姿态。在rviz中,我们可以用鼠标拖动机器人的终端,然后点击planning标签页中的plan nad execute就可以让机器人规划路径并且到达目标位置了,gazebo中的模型也会跟随变化。
4.3 分析
看到这里,也许我们会有一个疑问:这不就是MoveIt那一套东西么, 感觉和ROS-I并没有什么关系?再回头看ROS-I的架构,这种架构的上层控制本身就是复用的已有的软件包,ROS-I目前主要关注的是如何使用这些软件包来控制工业机械臂,也就是最下边的三层结构。我们把这三层从上到下分析一下:
首先是ROS-I Interface Layer层,这一层需要我们设计一个机器人的客户端节点,主要功能是完成数据从ROS到机械臂的转发,ROS-I为我们提供了许多编程接口,可以帮助我们快速开发,下图就是几个比较常用的API,具体API的使用说明可以查看官方文档。
对于机械臂来讲,这里最重要的是 robot_state和 joint_trajectory。 robot_state包括很多状态信息,ROS-I都已经帮我们定义好了,可以去industrial_msgs包里看到消息的定义文件。joint_trajectory订阅了MoveIt规划出来的路径消息,然后打包发送给最下层的机器人服务器端。通常会把这一层的功能封装成robot_name_driver功能包,可以看ROS-I中ABB和UR的机械臂都是这样的,可以参考他们的源码进行设计。
然后是ROS-I Simple Message Layer层,这一层主要是上下两层的通信协议。Simple Message这个协议是基于TCP的,上下层客户端和服务器端的消息交互,全部通过这一层提供的API进行打包和解析。具体使用方法可以参考http://wiki.ros.org/simple_message,也可以直接看ROS-I的源码:https://github.com/ros-industrial/industrial_core,主要实现SimpleSerialize和TypedMessage两个类的功能即可。
最下层的ROS-I Controller Layer是厂家自己的控制器,考虑到实时性的要求,一般不会使用ROS,只要留出TCP的接口即可,接收到trajectory消息解析之后,就按照厂家自己的算法完成动作了。
可见,如果我们想要通过ROS-I来控制自己的机械臂,最下边的三层使我们需要实现的重点,上层运动规划部分可以交给ROS来完成。
评论列表(86条)
古月老师,我想在gazebo中加载多个UR机器人,我该如何操作
同样的方式加载即可,不要放到同一个位置,如果用moveit控制的话,注意模型中的tf名称不能冲突
古月大大,我仿真ur3加robotiq爪子的时候遇到了个问题,规划在rviz上机械臂实体不动,在gazebo里面会动,这是什么情况
[ WARN] [1572512221.642363535, 174.782000000]: Controller ur3/manipulator_controller failed with error code PATH_TOLERANCE_VIOLATED
[ WARN] [1572512221.642494963, 174.782000000]: Controller handle ur3/manipulator_controller reports status ABORTED
胡老师:我安装的是UBUNTU 18.04的版本,怎么执行
sudo apt-get install ros-kinetic-industrial-core ros-kinetic-open-industrial-ros-controllers 的时候,提示如下信息:
E: 无法定位软件包 ros-kinetic-industrial-core
E: 无法定位软件包 ros-kinetic-open-industrial-ros-controllers
请问如何解决呢?
M版本里目前还没集成,需要源码编译安装
胡老师,我是kinetic版的,也是无法定位ros-kinetic-open-industrial-ros-controllers
把open-industrial去掉
古月老师您好,请问在gazebo内可以跟rviz一样显示机器人末端的运行轨迹吗? 谢谢.
好象不行
老师您好,我在rviz中做的轨迹比较长,然后前面的轨迹就会一点点的消失.请问有什么解决办法吗?
这个不清楚
您好,我刚刚开始学习ROS,买的参考书就是您的《ROS机器人开发实践》,受益良多,在此表示感谢!现在我遇到了一个问题,rviz打开后,我看到MotionPlanning→Context→OMPL这里显示了很多种算法,但是我发现我这边不管选择什么算法,终端输出都显示是默认的RRTConnect算法。请问一下这是为什么呢?(盼复!感谢!
也可以修改ompl.yaml配置文件
问题已解决,感谢您~
您好,我下载UR功能包后 启动moveIT的launch文件 报错
[ERROR] [1554716095.267451870]: Robot model parameter not found! Did you remap ‘robot_description’?
[ERROR] [1554716095.435311147]: Robot model not loaded
[ERROR] [1554716095.575964152]: Planning scene not configured
机器人模型没有加载?
胡老师,我也遇到这个问题了,请问一下怎么解决?
胡老师,现在可以通过ROS运行Python下的轨迹程序使ur3实体机器人动起来。但是我可以用在ROS下运行python写的轨迹然后在通过gazebo来模拟我python程序下的路径吗,我想现在gazebo中模拟之后再去实体上操作。这个要怎么才能实现。谢谢
可以的,请参考《ROS机器人开发实践》或gazebo仿真教程
胡老师好,想请教您两个问题,
第一个:请问用ROS moveit驱动UR或者其他机器人,echo joint_state节点可以在终端实时得到机器人的每个关节的位置信息,但是有没有哪个节点可以实时得输出关节电机的扭矩信息日志呢?
第二个:请问用echo命令实时输出的日志信息,比如以一定频率采样的机器人各个关节的数据,可否转换成类似记事本的文件输出?
谢谢胡老师
1. 应该没有,具体要看驱动是否支持
2. 命令行重定向可保存到文件
古月老师,我关于这个ros-EtherCAT系统流程还有一些疑惑,SpHwInterface硬件接口里面有一些关节状态接口、关节位置接口等。这个硬件接口和controller manager有什么关系,和controller manager里面的controller有什么关系呢?
这些相当于是controller的接口
controller manager 和moveit!是什么关系呢,并列的还是包含的?
controller manager是控制器的管理器,用来启动、停止位置、速度等控制器
moveit是运动规划平台,包括运动规划、避障、运动学等算法和ui界面
一个是上层规划,一个是下层控制
感谢古月老师的耐心解答,现在虽然功能实现了但是概念原理还是没有怎么搞清楚,所以向您请教。
class spHwInterface : public hardware_interface::RobotHW
SpHwInterface robot;
controller_manager::ControllerManager cm(&robot, nh);
ros::Rate rate(1.0 / robot.getPeriod().toSec());
ros::AsyncSpinner spinner(1);
spinner.start();
while (ros::ok())
{
robot.update();
cm.update(robot.getTime(), robot.getPeriod());
rate.sleep();
}
1.这里面的这个robot是不是算controller manager 里面的其中一个controller?
2.如果这个robot不算controller的话,那是不是一个接口对应一个ros默认自带控制器?如关节状态接口对应关节状态控制器,关节位置接口对应关节位置控制器。
3.如果这个robot算controller的话,那我这个下层控制与moveit上层规划中间是通过ros话题订阅发布或者action来实现通信的吗?这两者中间是否也有一个类似接口的存在?
1. 是的
3. 是的
您好,现在我有一个.rviz文件,要求用rviz显示出来,怎么做呢?
打开rviz之后,在菜单栏中选择打开配置文件,选择自己的.rviz就行了
CMake Error at /opt/ros/kinetic/share/catkin/cmake/catkinConfig.cmake:84 (find_package):
Could not find a package configuration file provided by “pcl_ros” with any
of the following names:
pcl_rosConfig.cmake
pcl_ros-config.cmake
Add the installation prefix of “pcl_ros” to CMAKE_PREFIX_PATH or set
“pcl_ros_DIR” to a directory containing one of the above files. If
“pcl_ros” provides a separate development package or SDK, be sure it has
been installed.
我尝试sudo apt-get install pcl_ros
提示无法定位软件包,请问有什么别的办法吗?
安装:sudo apt-get install ros-kinetic-pcl-ros
[ WARN] [1541512998.531560505, 13.284000000]: Dropping first 1 trajectory point(s) out of 10, as they occur before the current time.
First valid point will be reached in 0.517s.
[ WARN] [1541512999.103229605, 13.789000000]: Controller arm_controller failed with error code PATH_TOLERANCE_VIOLATED
老师您好在运行moveit 与 gazebo控制时发生如下问题导致无法规划出路径,请问什么问题
请参考:
https://answers.ros.org/question/275087/robot-in-rviz-cannot-move-and-dropping-the-first-1-trajectory-point/
https://github.com/ros-controls/ros_controllers/issues/68
https://github.com/ros-industrial/universal_robot/issues/231
您好,您这个问题解决了吗?我遇到了同样的问题,想向您请教一下
大神,请问我用qt5做了一个工业机器人操作界面,包括示教点动这些功能。我现在的ros做到了用rviz控制机械臂动这一步,然后有用一些Python写一些基本功能节点。现在我想把qt做的界面和ros连接一起,请问通过什么方式或者有什么接口吗?十分感谢
请参考:http://www.guyuehome.com/945
古月老师,那ros上面有没有工业机器人点动、示教等等功能的功能包呢,自己写写的不好又花时间
这个没有,要自己实现
为什么安装上面步骤会出现这样的,在运行gazebo中,之后gazebo就
死机。
nouveau: 0x0000214a
nouveau: 0x0000214b
nouveau: 0x0000214c
nouveau: 0x0000214d
nouveau: 0x0000214e
nouveau: 0x0000214f
nouveau: 0x00002150
nouveau: 0x00002151
gazebo对硬件有一定要求,使用的是虚拟机么?可以重装gazebo试下
不是虚拟机,就是电脑里只有ubuntu这个系统
那就不清楚了,重新安装下gazebo试试
古月大神你好,我现在有两台UR的机械臂,我想在ros中同时驱动两个机械臂,但是只有一个驱动包,可以实现吗,相同的机械臂他们的控制器,描述文件等都是相同的,有办法解决吗?
是可以实现的,但是重复的参数应该要重映射一下,可以参考PR2这样的双臂机器人看看
使用这个能不能连接真实的机器人啊?我们这里有一台ABB1200,想要做一些轨迹规划的东西,刚刚接触还无从下手。。。
是可以连接真实机器人的,可以参考http://wiki.ros.org/abb_irb1200_support
你好,老师。你说的这个irb200_support文件中没有机器人模型的碰撞参数。为了将机器人加载到gazebo中需要惯性参数,但是怎么计算惯性参数呀?谢谢!这是真是机器人,所以不知道还有没有比较完整的irb1200的机器人模型
一般都是通过solidworks导出urdf的时候自动计算的
你好,为了将机器人irb1200加载到gazebo中需要惯性参数,但是怎么计算惯性参数呀?谢谢!这是真是机器人,所以不知道还有没有比较完整的irb1200的机器人模型
您好,当我设置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 []
IP地址可以ping通么?可以在hosts里边设置一个IP和电脑名的映射
古月君,你好!我按照你4.2的步骤运行了我的一个仿真,结果rviz中规划,机械臂动作了,但是gazebo中机械臂没有任何动作,请问这是什么原因?
那应该是控制器没连接上,你有修改过这个包么?默认应该是配置好的,检查一下controller都启动没有
谢谢胡老师,确实是controller的问题。
您好,当我运行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?
kinetic版本的,ubuntu16.04,没有QT
你用命令行重新装一次rviz试试
重装一次还是会提示段错误的提示
古月大神,我在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
请问下这是否就是你说的插补功能相关代码?如果不是麻烦给说明下具体目录,我找了很久了。
这个只是配置,看不到源码的实现,源码在这里:
https://github.com/ros-controls/ros_controllers
里边有joint_trajectory_controller的源码,可以看到具体的插补实现原理。
古月大神,再请教下。我现在就拿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个左右。
按照你说的操作得到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都是时间参数,代表这个路径点的时间点,插补算法是需要的,周期插补输入的就是时间参数,输出是关节位置。运动控制卡我不了解,你要参考运动控制卡的需求。
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的这部分功能。我们没有用运动控制卡,底层的关节插补都是自己实现的。
我这卡没有插补功能,我先不考虑实时性,因为这也不是做产品,我现在想用ROS自带的插补,就是你说的在joint_trajectory_controller包,这个该如何调用啊?还是以UR10为例,把得到的这10组轨迹点数据传给插补的插件么?这方面有没资料,我搜索了ROS自带插补相关信息,没找到方法,还望指点,非常感谢你!
JointTrajectoryController内部的实现使用的是五次样条或者三次样条,这个可以看源码的,具体插补的输出我也只是在仿真里用过。这部分的资料确实很少,只能看源码,源码包里会有单元测试,从这些单元测试中可以找到使用方法。
另外插补算法本身不复杂,自己写一个也时可以的。
古月大神,请教下如何接收到trajectory来的路径消息?我想查看MoveIt规划出来的路径,是否能看到规划路径每个点的目标角度制?在RViz里context下有个warehouse,Host地址是做什么用的呢?谢谢
1. MoveIt的接口是FollowJointTrajectory,需要在moveit端配置一下controller,可以参考:
http://docs.ros.org/kinetic/api/moveit_tutorials/html/doc/pr2_tutorials/planning/src/doc/controller_configuration.html
2. warehouse是一个分布式的数据库,Host是数据库的IP地址,数据库放到哪台电脑,就设置那台电脑的IP,如果你用不到数据库,这个就没什么用了。
非常感谢您!
大神 您好 请问下 我运行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应该都装了 是什么问题 跪求
这个错误提示是说模型文件有问题,无法解析,一般是因为xacro模型文件中的元素有问题
您说的是 ur10_robot.urdf.xacro 中元素有问题?这些我是直接用sudo apt-get install 直接下载的,会有问题吗?另外用这个指令下载完package以后还需要操作什么步骤?需要编译吗?
直接下载的应该不会有问题,我在我的电脑上试过是可以运行的,下载之后也不需要编译。ur10_robot.urdf.xacro这个文件是确定存在的吧?
试一下这个帖子的方法:https://groups.google.com/a/rethinkrobotics.com/forum/#!topic/brr-users/JS-Kb5NbYEE
把ur10_upload.launch中的–inorder删掉试试
请问下 显示和调整机械臂每个轴位置的界面 joint state 是怎么调出来的 是在RVIZ中还是gazbo中?
在rviz中,启动joint_state_publisher,并且启动gui
请问胡老师,如何在rviz界面启动joint_state_publisher呢?是直接add吗?
在launch里启动是添加use_gui=true的配置
你好, 我运行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].
ros-I和ros_control是什么关系
ROS-I是ROS应用于工业机器人的一套框架,ros_control是针对机器人底层控制的功能包集,不限于工业机器人
古月 看下邮件 ,我给您发了邮件了 谢谢!盼复
谢谢,已回复