绪论
在上一篇文章中,我们成功实现了SolidWorks模型到URDF格式的转换。本文将重点介绍如何配置MoveIt,并将转换后的URDF模型与Rviz、Gazebo进行联合仿真。本文基于Ubuntu 20.04-ros-noetic环境展开若文中存在任何疏漏或不当之处,欢迎指正交流,让我们共同探讨、共同进步。
目录
2.2.10.构建3D信息(Setup 3D Perception Sensors)
MoveIt运动规划
1.MoveIt简介
MoveIt 是一个开源的机器人运动规划框架,主要用于机械臂的运动规划、操作、3D感知、运动学、控制以及导航等功能。它是ROS (Robot Operating System) 生态系统中最广泛使用的运动规划软件之一。
MoveIt的核心功能如下:
- 运动规划:为机械臂寻找从起点到目标点的无碰撞路径
- 逆运动学求解:计算使末端执行器达到目标位形所需的关节角度
- 碰撞检测:利用3D传感器数据或环境模型检测潜在碰撞
- 抓取生成:自动生成抓取物体的策略
- 运动执行:将规划好的轨迹发送给机器人控制器执行
- 可视化:通过Rviz插件实时查看机械臂模型、路径规划结果、目标位置等
2.MoveIt的安装与配置
2.1安装MoveIt
MoveIt依赖于ROS,因此需要先安装ROS(安装ros的过程这里就不进行赘述了,后期有时间会补充到博客)
# 更新ROS包列表
sudo apt update
# 安装MoveIt
sudo apt install ros-<ros_distro>-moveit
<ros_distro> 代表你的 ROS 发行版名称
#这里是ros-noetic版本
sudo apt install ros-noetic-moveit
这里可以用下面的命令查看是否安装成功,并查看moveit!的版本
moveit_version
有版本的输出证明安装成功了!!!
2.2配置MoveIt
2.2.1.启动设置向导
在新建的工作空间中,首先启动MoveIt Setup Assistant。在此之前,需要确保roscore已运行,并执行source命令刷新一下环境变量。这一步骤至关重要,因为后续操作需要从功能包中选择urdf文件,若文件不在功能包中,将导致操作失败。
roscore
source devel/setup.bash
rosrun moveit_setup_assistant moveit_setup_assistant
执行rosrun moveit_setup_assistant moveit_setup_assistant后会出现下面的界面:
可以看到有两个选择:新建MoveIt配置包(Create New MoveIt Configuration Package)或修改现有MoveIt配置包(Edit Existing MoveIt Configuration Package),这里我们选择新建MoveIt配置包。
然后这里选择自己文件夹下面的urdf后缀的文件点击Load Files
如果出现类似报错是因为没有在工作空间下的devel里面刷新环境变量(一般是这个问题)
在Workspace的devel目录下,打开终端并执行source setup.bash
命令,即可将文件路径加载至当前命令行环境。
重新运行 rosrun moveit_setup_assistant moveit_setup_assistant
命令,即可启动 MoveIt! Setup Assistant 工具,可看到在右边出现了我们机械臂模型,我们的鼠标也可以随意拖动它进行位置调整。
2.2.2配置自碰撞检测
这里点击Generate Collision Matrix会自动配置好选项
2.2.3添加虚拟关节
为建立虚拟关节与外部参考系的连接,请按以下步骤操作:
- 点击"Add Virtual Joints"按钮
- 在名称栏输入"virtual_joint"
- 在Child Link选项中选择"base_link"
- 将Parent Frame Name设置为"world"(即世界坐标系)
- 选择关节类型为"Fixed"
- 选择“Save”进行保存
2.2.4.创建运动规划组
- 点击 Add Group 按钮。
- Group Name :中输入 "damiao" 作为组名(这里大家可以随机,我是因为使用的达妙的电机)。
-
Kinematic Solver(运动学求解器):这里采用
kd_kinematics_plugin/KDLKinematicsPlugin
进行运动学计算,该插件基于KDL(Kinematics and Dynamics Library)开发。KDL作为一款广泛使用的开源运动学库,能够高效完成正运动学(Forward Kinematics)和逆运动学(Inverse Kinematics)的计算任务。 -
Kin. Search Resolution: 0.005 rad,作为运动学搜索分辨率参数,直接影响逆运动学求解的精度与效率。该值越小,计算精度越高,但相应的计算时间也会增加。
-
Kin. Search Timeout (sec): 0.005 运动学求解超时时间(单位:秒)若在此时间内未找到可行解,求解器将终止运算。
-
Goal Joint Tolerance (m|rad): 0.0001,这是关节空间目标容差,对于平移关节单位是米(m),对于旋转关节单位是弧度(rad),当实际关节位置与目标位置的差小于此值时认为达到目标。
-
Goal Position Tolerance (m): 0.0001,末端执行器位置容差,单位米(m),允许的末端执行器位置与目标位置之间的最大距离。
-
Goal Orientation Tolerance (rad): 0.0010,末端执行器方向容差,单位弧度(rad),允许的末端执行器方向与目标方向之间的最大角度差。
-
Kin. parameters file:运动学参数文件路径(此处为空)可以指定包含运动学参数的外部配置文件。
-
OMPL规划参数
-
Group Default Planner: RRTConnect
-
默认的运动规划算法,这里使用的是RRTConnect
-
RRTConnect是一种双向快速扩展随机树算法,适合解决高维空间的运动规划问题
-
它在起点和目标点同时生长两棵树,直到它们连接
-
接下来,为上述规划配置选择相应的关节(Joints),点击"Add Kin.Chain"按钮可直接添加运动链。
在设置中,选择"base_link"作为基链接(Base Link),并选择"link_3"作为末端链接(Tip Link),然后点击"保存"按钮,通过以上步骤,即可成功生成一个规划组。
保存后就会和下图显示的一样
2.2.5.预设机器人姿态
点击 "Add Pose" 按钮,为机械臂设置两个姿态:up 和 down。大家可根据需求自定义姿态名称和具体位置,但通常我们习惯采用这两个默认设置。其中,将所有角度为 0 的位姿定义为 up 姿态,设置完成后点击 "Save" 保存。
这里和上述步骤一样只不过需要修改名字和关节位置
2.2.6.设置末端执行器(End Effectors)
可以设置夹爪,我这里没有夹爪,有夹爪的可以设置一下
2.2.7.设置消极关节(Passive Joints)
这个就是进行轨迹规划时候不让运动的关节,我这里三个关节都需要运动所以没有设置
2.2.8.设置ROS Control
ROS通过ROS Control框架中的Controller接口,与Gazebo仿真环境或实际硬件设备建立连接。在配置过程中,点击"Auto Add FollowJointTrajectory..."选项,系统将自动为五个关节配置相应的Controller,其类型应为FollowJointTrajectory(若类型不符,需手动调整为该类型)。
选择“FollowJointTrajectory”
这里我也解释一下这个几种控制器有什么区别:
1. effort_controllers/JointTrajectoryController
控制方式: 使用“力/力矩”来控制每个关节。
典型应用: 如果你的机器人底层驱动支持力矩控制(例如某些高端机器人或使用了扭矩传感器的系统)。
优点: 可用于高精度控制或力控任务。
缺点: 对硬件要求较高,调试难度大。
2. velocity_controllers/JointTrajectoryController
控制方式: 通过设定“关节速度”来驱动关节运动。
典型应用: 电机只能接受速度命令,且内部会处理位置控制。
优点: 控制简单,系统响应速度快。
缺点: 精度和轨迹跟踪能力通常不如位置控制。
3. position_controllers/JointTrajectoryController
控制方式: 通过设定“关节位置”来控制每个关节。
典型应用: 适用于大多数机器人,特别是舵机控制系统。
优点: 精度高,易于实现。
缺点: 对关节之间协同控制能力要求高。
4. FollowJointTrajectory
控制方式: MoveIt 常用的标准接口类型(不直接控制底层,而是将轨迹传递给控制器)。
用途: 这是一个 动作服务器(action server),用于接收来自 MoveIt 的轨迹,并由底层 JointTrajectoryController 实现。
说明: 实际上你仍需要在底层使用 effort/velocity/position_controllers/JointTrajectoryController 之一,它们实现轨迹的执行。
5. GripperCommand
控制方式: 专门用于末端执行器(例如夹爪)。
接口: 通常通过设定“开合位置”和“力矩限制”等参数来控制夹爪。
典型应用: 控制夹爪开合程度,适用于 Robotiq 等支持 GripperCommand 接口的夹爪。
使用需求 推荐控制器类型
标准位置控制机械臂 position_controllers/JointTrajectoryController
只接受速度命令的系统 velocity_controllers/JointTrajectoryController
高级机器人,支持力控 effort_controllers/JointTrajectoryController
MoveIt 与控制器的桥接接口 FollowJointTrajectory
控制夹爪 GripperCommand
点击Save保存
点击 "Add Controller"
在控制器配置中添加一个名为 controller_gazebo
的控制器,将其类型设置为 position_controller/JointTrajectoryController
。接着,配置该控制器接收信息的关节,点击 "Add Planning Group Joints" 以完成设置。
把damiao添加进来,点击 Save 保存
我们新增了一组Controller模块:上层的Controller负责将MoveIt生成的运动数据发送出去,下层的Controller则负责接收这些数据并驱动Gazebo中的仿真机械臂执行相应动作。这套机制同样适用于实际机械臂的控制。
2.2.9.Simulation
该工具可自动生成包含Gazebo仿真属性的URDF模型,便于将机械臂模型直接导入Gazebo进行仿真。操作时,请点击"Overwrite original URDF"按钮,将生成的代码覆盖至robot_urdf_1.urdf文件中。
需要注意的是,由于我们先前已建立position_controller,需将代码中的EffortJointInterface统一修改为PositionJointInterface。
2.2.10.构建3D信息(Setup 3D Perception Sensors)
若配备3D感知功能的相机可以设置一下,此处我暂时跳过。
2.2.11.添加作者信息
根据自己相应信息填写就可以
2.2.12.生成配置文件
在 catkin_ws01/src 工作空间下新建一个名为 damiao_moveit_config 的文件夹(务必确保路径正确,否则后续程序运行将出现问题图中这个我建错了!!)。接着,选择该目录作为 Package Save Path,最后点击 Generate Package 完成创建。
弹出以下窗口是因为没添加末端执行器,直接点ok就行
最后点击 Generate Package 完成创建
3.运行演示程序
3.1预设置
运行之前我们进行一些预设置,不设置后面可能会报错,在原本的urdf文件里面添加一段:
<link name="base_footprint">
</link>
<joint name="base_footprint_joint" type="fixed">
<parent link="base_footprint" />
<child link="base_link" />
</joint>
如下:
还需要修改config下.srdf文件里面的child_link="base_footprint"
这个时候我们就可以启动了:
#进入到自己的工作空间里面
#刷新一下环境变量
source ./devel/setup.bash
#启动launch文件
roslaunch damiao_moveit_config demo.launch
这里你们根据自己的进行启动
3.2启动rviz
打开后会看到这个界面
勾选这俩个就可以拖动中间的圆球了
在Joints里面也可以拖动调节关机的位置
点击Plan & Execute可以看到成功的进行了轨迹规划
3.3Rviz和Gazebo仿真联合
这需要启动另外一个launch文件:demo_gazebo.launch
执行以后会看到同时打开了rviz和gazebo
拖动rviz里面的机械臂进行轨迹规划会看到Gazebo里面的机械臂也在同步运动,至此我们rviz和Gazebo联合成功!