浅谈真实机械臂的开发(一)—— 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文件,由于当时这个文件路径的缺失,导致了无法生成模型仿真图。

<geometry>
	<mesh filename="package://rr4/meshes/base_link.STL">  
	</mesh>
</geometry> 
1.1.0.1 使用Moveit配置助手生成配置文件

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

1.1.0.2 修改配置文件

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

<include file="$(find unitbot_moveit_config)/launch/move_group.launch">
    <arg name="allow_trajectory_execution" value="true"/>
    <arg name="fake_execution" value="true"/>
    <arg name="info" value="true"/>
    <arg name="debug" value="$(arg debug)"/>
</include>

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

<!-- Trajectory Execution Functionality -->
<include ns="move_group" file="$(find unitbot_moveit_config)/launch/trajectory_execution.launch.xml" if="$(arg allow_trajectory_execution)">
    <arg name="moveit_manage_controllers" value="true" />
    <arg name="moveit_controller_manager" value="rr4" unless="$(arg fake_execution)"/>
    <arg name="moveit_controller_manager" value="fake" if="$(arg fake_execution)"/>
</include>

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

<launch>

</launch>

这部分是要你来填充的

<launch>
 <!-- Set the param that trajectory_execution_manager needs to find the controller plugin -->
 <arg name="moveit_controller_manager" default="moveit_simple_controller_manager/MoveItSimpleControllerManager" />
 <param name="moveit_controller_manager" value="$(arg moveit_controller_manager)"/>
 <!-- load controller_list -->
 <rosparam file="$(find robot_moveit_config)/config/controllers.yaml"/>
</launch>

将最后一行的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发送给我们写的服务端。
在这里插入图片描述
其中最主要的部分就是trajectory_msgs/JointTrajectory trajectory,接着我们细看trajectory_msgs/JointTrajectory的官方文档,了解一下这个msg到底长什么样?
在这里插入图片描述
原来是关节名称+轨迹点的形式,那么理所应当,我们还需要看看JointTrajectoryPoint的内容:
在这里插入图片描述
这就简洁明了了,我们可以知道,轨迹点包括五部分内容:

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

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

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

  • 45
    点赞
  • 229
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
ROS MoveIt是一个用于机器人操作的软件框架,其中包含了一些常用的规划算法,例如RRT(快速随机树),用于机械臂的路径规划。碰撞检测是MoveIt框架的一个重要功能,用于避免机械臂在执行路径时与障碍物发生碰撞。 在MoveIt中使用RRT进行碰撞检测的过程大致如下: 1.建立机械臂的运动规划场景:在ROS环境中,根据机械臂的运动学模型和环境设定,使用MoveIt框架创建机械臂的规划场景。这包括定义机械臂的关节和末端执行器的运动限制,以及环境中的障碍物。 2.定义机械臂路径:使用RRT算法定义机械臂的路径规划,即指定机械臂的起始姿态和目标姿态,然后通过RRT算法生成一条连接两者的路径。RRT算法会在工作空间中进行随机采样,通过逐步扩展采样点来生成路径,直到到达目标姿态。 3.碰撞检测:在生成路径的过程中,对每个路径上的关节姿态进行碰撞检测。MoveIt使用机械臂的碰撞模型和环境中的障碍物模型进行碰撞检测。如果在路径上有碰撞,MoveIt会通过调整路径或重新生成路径来避免碰撞。 4.路径优化和执行:根据需求,可以对生成的路径进行优化,以提高路径的质量和执行效率。优化过程可以包括减少路径的长度、姿态调整等。最后,将优化后的路径加载到机械臂控制器中执行。 在MoveIt中使用RRT进行碰撞检测可以有效避免机械臂与障碍物的碰撞,提高机械臂的路径规划和执行的安全性和可靠性。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值