浅谈真实机械臂的开发(一)—— ROS之MoveIt部分(上)

写在开头:
你看到这一篇博文, 距离我开始写的时候已经有些日子了,本来可以快一点与你相见,奈何不知何时,也许是我的误操作,在我想接着写下去的时候,发现原本1w+字数的草稿不翼而飞,CSDN又无法恢复,无奈之下只好重新开始。
我写这一篇的初心是想要记录我自己在这一整个项目中的历程,包括了项目的开始,项目的技术细节,写给同仁参考,也写给我自己!

0.项目之初:

在这个项目中ROS主要做的是机械臂的轨迹规划和运动学,为了实现使用ROS操作机械臂,使用了树莓派作为上位机跑ROS,STM32作为下位机负责接收树莓派传来的信息,从而控制机械臂的运动。

0.0 关于ROS的思考:

Q: A:
我想控制一台机械臂,那我要用什么来控制呢? 树莓派或者PC上跑ROS,使用Moveit做轨迹规划和运动学,通过树莓派的串口和下位机通讯,下位机使用STM32,STM32负责与电机的通讯和与ROS的通讯
如果我要用Moveit的话,那我该怎么使用呢? 还是去看官网教程吧。。。

1.项目开始:

1.0 思路

  • ROS部分
    • Moveit
      • 轨迹规划与运动学:JointTrajectoryAction
    • controller
      • Action Server
      • robot controller

1.1 技术实现

1.1.0灵魂拷问:如何用Moveit控制真实机械臂?

1.1.0.0 首先你得要有个机械臂模型,有urdf文件夹更好

这个就是建模的锅啦,我们是程序猿,不是建模佬,这部分能甩锅就甩锅啦(可惜没人来接我的锅,我只能自己背了)。最终用SolidWorks的SW2URDF插件导出urdf文件夹。
至于为什么是文件夹,不是单独一个urdf文件,之前我刚接触的时候也踩过这个坑,我当时只用了一个urdf文件,其他什么都没有,结果配置助手生成出来的是一片空白,没有任何预览。最后还是在urdf文件中找到了答案。
在文件中有好几段类似下面这样的代码。仔细看一下你就会发现,这其实是在加载模型的STL文件,由于当时这个文件路径的缺失,导致了无法生成模型仿真图。


	  
	
 

1.1.0.1 使用Moveit配置助手生成配置文件

这部分直接看我另一篇博文就可以了:
MoveIt入门之——使用MoveIt配置助手生成MoveIt配置文件

1.1.0.2 修改配置文件

->劝退第一步:了解 launch
我在另一篇博文里介绍了launch,还没有接触过launch的小伙伴们可以去看一下了。
ROS入门之——浅谈launch
->柳暗花明第二步:修改配置文件们
因为为了控制真实的机械臂,我们需要修改的配置文件有几个,所以我说配置文件们。
(1)修改demo.launch
如果你成功生成了配置文件,那么在你的配置文件夹的launch文件夹中可以找到demo.launch文件,请义无反顾地打开它。你会看到茫茫码海中找到类似下面这段代码。


    
    
    
    

如果你了解launch的语法,那么你会知道这段代码是在启动一个叫做move_group.launch的launch文件,并且为其配置了参数。我们要做的就是修改这些参数。我们需要将中的true改成false从字面意思上看就可以知道,我们将fake_execution配置为false就是在告诉Moveit,“这不是演习!这不是演习!我们这回是真的要那你来控制真实的机器人了”
(2)修改move_group.launch
在launch文件夹中找到并且打开move_group.launch



    
    
    

(3)修改xxx_moveit_controller_manager.launch.xml文件
虽然说是修改文件,不如说是创建。因为当你打开这个文件你会发现,你会讶异,这个文件长这样:




这部分是要你来填充的


 
 
 
 
 

将最后一行的robot_moveit_config修改成你自己的配置文件名。

(4)创建你的controllers.yaml配置文件
controllers.yaml配置文件是用来配置moveit控制器的文件。
这个文件在生成配置文件的时候是默认不帮你生成的,你需要自己创建这个文件,最终创建的文件内容类似下面这样,这是从官网教程copy下来的demo:

controller_list:
 - name: panda_arm_controller
   action_ns: follow_joint_trajectory
   type: FollowJointTrajectory
   default: true
   joints:
     - panda_joint1
     - panda_joint2
     - panda_joint3
     - panda_joint4
     - panda_joint5
     - panda_joint6
     - panda_joint7
 - name: hand_controller
   action_ns: gripper_action
   type: GripperCommand
   default: true
   parallel: true
   joints:
     - panda_finger_joint1
     - panda_finger_joint2

在这里我介绍一下两种控制器的配置参数:
1)FollowJointTrajectory控制器:
name:控制器的名称
action_ns:控制器的操作命名空间
type:正在使用的action类型(此处为FollowJointTrajectory)
default:默认控制器是MoveIt选择的主控制器!用于与特定的一组关节进行通信
joints:此接口操作的所有关节的名称
2)GripperCommand控制器:
name:控制器的名称
action_ns:控制器的操作命名空间
type:正在使用的action类型(此处为GripperCommand)
default:默认控制器是MoveIt选择的主控制器!用于与特定的一组关节进行通信
joints:此接口操作的所有关节的名称
parallel:当设置此项时,关节的大小应为2(对于这一点,我自己也不太确定,有懂的前辈烦劳请给我指点一二)

其实在配置文件夹生成的时候会默认帮你生成一个叫做fake_controllers.yaml的配置文件,从文件名可以知道,这个配置文件是在控制仿真机器人的时候用上的。你需要做的就是自己创建一个controllers.yaml文件,或者直接复制fake_controllers.yaml加以修改。对照着控制器配置参数,配置成你自己的机器人moveit controller。

1.1.0.3 编写Moveit的action服务端

知己知彼,在开始写代码之前,按照惯例阅读一下官方文档,我们要使用action来进行信息的传递,那么我们最关心的就是,Moveit提供给我们的action到底长什么样,内容格式是怎样的?

这是官方文档的链接
FollowJointTrajectory Action
JointTrajectory Message
JointTrajectoryPoint Message

这时FollowJointTrajectory Action的Goal部分,Moveit提供给我们使用的action客户端就是讲这个Goal发送给我们写的服务端。
浅谈真实机械臂的开发(一)—— ROS之MoveIt部分(上)_第1张图片
其中最主要的部分就是trajectory_msgs/JointTrajectory trajectory,接着我们细看trajectory_msgs/JointTrajectory的官方文档,了解一下这个msg到底长什么样?
浅谈真实机械臂的开发(一)—— ROS之MoveIt部分(上)_第2张图片
原来是关节名称+轨迹点的形式,那么理所应当,我们还需要看看JointTrajectoryPoint的内容:
浅谈真实机械臂的开发(一)—— ROS之MoveIt部分(上)_第3张图片
这就简洁明了了,我们可以知道,轨迹点包括五部分内容:

  • 位置
  • 速度
  • 加速度
  • 力矩
  • 时间

到此前期准备工作做足了,接下来可以开始coding了。

下一篇博文中我将会介绍coding的部分,为想用Moveit来控制真实机械臂的朋友们提供参考,顺便说一说ROS control的内容。

你可能感兴趣的:(ROS应用笔记)