~欢迎关注~

微信公众号:古月居

新浪微博:古月春旭

知乎专栏:古月居

原文链接:古月私房课 | MoveIt!编程驾驭机械臂运动控制

 

古月居联合深蓝学院推出的“古月私房课”第一弹——《ROS机械臂开发:从入门到实战》已经上线啦,欢迎各位小伙伴前来围观,以下是第六讲《MoveIt!编程驾驭机械臂运动控制》的内容精要。

大家好,这里是《ROS机械臂开发:从入门到实战》的第六讲——MoveIt!编程驾驭机械臂运动控制,我是主讲人胡春旭。

幻灯片1

本讲我们将从以下四个部分进行讲解。

幻灯片2

首先来回顾下MoveIt!编程接口的框架。

幻灯片3

MoveIt!提供三种主要的交互方式:C++接口、Python接口以及上位机Rivz插件接口,无论哪种形式,底层都是和move_group核心节点交互,完成功能算法的调用。

幻灯片4

对比C++和Python两种编程方式,在流程上完全一致,API接口的名字也基本相同。

幻灯片5

完整的MoveIt!程序流程如下,不可或缺的步骤是:确定控制对象的规划组、设置目标位姿、进行运动规划、执行规划轨迹。

幻灯片6

API接口众多,而且有多态性,所以在开发过程中大家一定离不开官方的API文档,这里有最完整的接口介绍。

幻灯片7

接下来我们就来了解一下MoveIt!中的关键编程方法,第一种是关节空间运动。

幻灯片8

在关节空间运动中,机械臂各轴独立完成轨迹插补,终端轨迹是自由曲线,常用于码垛、搬运、分拣等对运动轨迹没有强制约束的场景,其中的关键就是对目标姿态的描述。

幻灯片9

可以在关节空间下直接通过各轴的位置描述目标姿态,这里需要调用MoveIt!提供的set_joint_value_target函数实现。

幻灯片10

也可以在工作空间下通过终端的位姿+姿态进行描述,需要调用set_pose_target函数进行设置。

幻灯片12

还有很多场景下对机械臂的终端轨迹有要求,那就需要用到笛卡尔空间下的运动规划功能了。

幻灯片14

比如让机械臂的终端走出一条直线。

幻灯片15

我们可以对比笛卡尔运动和关节空间下经过同样路径点的轨迹区别,如下图所示,一个是自由曲线,一个是直线轨迹。

幻灯片16

这里笛卡尔运动规划使用的关键函数是MoveIt!中的compute_cartesian_path,它可以将多个路点waypoints之间通过直线轨迹连接到一起,返回值fraction表示可规划轨迹的覆盖率。

幻灯片17

在机械臂运动过程中,如果有障碍物的话,还需要考虑避障的问题。

幻灯片19

比如下图中机械臂在运动规划时,就需要考虑到绿色障碍物的避障问题。

幻灯片20

MoveIt!中有一个场景监听器模块,就是用来检测外部场景信息的,障碍物可以通过三种方式加入场景中:rviz可视化添加、程序添加、传感器检测。本讲我们主要介绍前两种方式。

幻灯片21

在rviz的MoveIt!插件中有一个Scene Object标签页,可以将障碍物模型添加到场景当中来,此后机械臂在运动规划时就会考虑躲避该障碍物了。

幻灯片22

另外一种方式是通过程序操作,不仅可以添加外界障碍物,还可以添加机械臂上的附着物体,模拟抓取到的物体,将作为机械臂的一部分,考虑与外界物体的碰撞。

幻灯片23

这里涉及的主要函数是add_box和attach_box,前者是将添加的物体作为障碍物,后者是将添加的物体作为机械臂的一部分。

幻灯片24

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

幻灯片25

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

幻灯片28

 

更多内容欢迎关注:

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

新浪微博:古月春旭

知乎专栏:古月居