实验一
在 ROS 组件中测试模型的显示效果;
使用上述机器人模型,完成 MoveIt! Setup Assistant 的配置,并生成配置功能 包;运行 demo.launch 例程,测试 MoveIt!可视化终端的运动控制功能;
一、solidwords模型转urdf,然后配置moveit,流程如下,模型是网上找的,具体配置网上很多参考教材,这里不详细说。
二、使用ur3模型,完成 MoveIt! Setup Assistant 的配置,并生成配置功能包
一、什么是moveit
在实现机械臂的自主抓取中机械臂的运动规划是其中最重要的一部分,其中包含运动学正逆解算、碰撞检测、环境感知和动作规划等。
MoveIt! 是ROS系统中集合了与移动操作相关的组件包的运动规划库。它包含了运动规划中所需要的大部分功能,同时其提供友好的配置和调试界面便于完成机器人在ROS系统上的初始化及调试,其具体架构如下图所示:
moveit支持的机械臂:Robots | MoveIt
具体组块介绍
(1)move_group: move_group是MoveIt!的核心部分,它的功能在于集成机器人的各独立模块并为用户提供一系列的动作指令和服务。其本身并不具备太多的功能,起到的是积分器的作用,完成各功能包和插件的集成。(1)move_group: move_group是MoveIt!的核心部分,它的功能在于集成机器人的各独立模块并为用户提供一系列的动作指令和服务。 其本身并不具备太多的功能,起到的是积分器的作用,完成各功能包和插件的集成。
(2)场景规划(Planning Scene): 通过场景规划,用户可以创建一个具体的工作环境或者加入障碍物。(2)场景规划(Planning Scene): 通过场景规划,用户可以创建一个具体的工作环境或者加入障碍物。
(3)运动规划(motion panning): 在MoveIt!中,运动规划器起的作用是实现运动规划算法,其以插件的方式通过ROS的pluginlib接口完成信息的通讯,根据需求可制作或选用不同的规划算法。(3)运动规划(motion panning): 在MoveIt!中,运动规划器起的作用是实现运动规划算法,其以插件的方式通过ROS的pluginlib接口完成信息的通讯,根据需求可制作或选用不同的规划算法。
(4)运动学(Kinematics): 运动学算法是机械臂控制算法中的核心内容,其中包括正运动学算法和逆运动学算法,在MoveIt!中,运动学算法同样以插件的形式完成于ROS的集成,因此可根据实际需求,编写自己的运动学算法来控制机器人。(4)运动学(Kinematics): 运动学算法是机械臂控制算法中的核心内容,其中包括正运动学算法和逆运动学算法,在MoveIt!中,运动学算法同样以插件的形式完成于ROS的集成,因此可根据实际需求,编写自己的运动学算法来控制机器人。
(5)碰撞检测(collision checking): 为避免机器人自身或者和环境发生干涉导致意外的发生,在进行运动规划时碰撞检测是必不可少的一部分,在MoveIt!中,采用FCL(Flexible Collision Library)进行对象碰撞的运算。(5)碰撞检测(collision checking): 为避免机器人自身或者和环境发生干涉导致意外的发生,在进行运动规划时碰撞检测是必不可少的一部分,在MoveIt!中,采用FCL(Flexible Collision Library)进行对象碰撞的运算。
(6)开源运动规划库(open motion planning library): OMPL是一个的开源的C++库,主要用于运动规划,其中包含了大量用于运动规划的先进算法。该库中的算法以采样规划算法为主,通过其可以实现不同目标点之间的路径规划。(6)开源运动规划库(open motion planning library): OMPL是一个的开源的C++库,主要用于运动规划,其中包含了大量用于运动规划的先进算法。 该库中的算法以采样规划算法为主,通过其可以实现不同目标点之间的路径规划。
三、怎么配置moveit
首先是安装moveit包
sudo apt-get install ros-noetic-moveit
source /opt/ros/noetic/setup.bash
安装好之后,可以输入以下代码检查安装的版本
moveit_version
没什么问题,就可以启动moveit了,这里我启动moveit的时候报错了
Resource not found: The following package was not found in <arg name=“db_path“ default=
解决方法就是更新一下库,可能是版本比较旧的问题
然后就可以启动moveit了
roslaunch moveit_setup_assistant setup_assistant.launch
启动完之后的界面如下:
这时候我们选择 Create New MoveIt Configuration Package
然后寻找并加载我们之前建模写好的urdf文件,然后点击Load Files
然后还是报错,说找不到文件;
Ros was unable to find the package name 'my arm' withinthe Ros workspace.This may cause issues later.
这里解决方法是:
先roscore
然后进到模型文件所在的工作空间里
先source一下,刷新环境变量
然后再在该工作空间启动moveeit,这样就能正常加载了。
加载完之后,就可以去配置其他文件。 注意:右边显示出模型的缩略图,可以通过鼠标调整大小和位置
四、产生自碰撞矩阵 Self-Collision Matrix
默认自碰撞矩阵生成器在机器人上搜索可以安全禁用碰撞检查的链接对,从而减少了运动计划的处理时间。当这些链接对始终处于碰撞状态,从不碰撞,处于机器人默认位置的碰撞状态或在运动链上彼此相邻时,这些链接对将被禁用。采样密度指定要检查自我碰撞的随机机器人位置的数量。较高的密度需要更多的计算时间,而较低的密度则有可能禁用不应禁用的对。默认值为10,000个冲突检查。并行执行冲突检查以减少处理时间。
简单来说就是机器人urdf模型里面可以定义障碍物,也就是你不希望机器人碰撞到的地方。Moveit在运行你的机器人过程中会一直进行碰撞检测。碰撞检测是按照一定检测频率实时进行的,检测频率低了会检测不到一些碰撞,高了就会影响运行速度。所以moveit提供了一个优化碰撞检测的选项供用户配置。
优化机制:
了解优化机制前有必要了解一下碰撞检测机制,假如你的urdf里面定义了三个link:link1 link2和link3。link1连着lin2,link2连着link3,且link3和link1永远不会碰撞,link2和link1一直在碰撞。但是电脑不知道他们之间谁和谁肯定不会碰撞,或者谁和谁肯定会碰撞,所以会分别实时检测连杆对(pair of link):link1和link2,link2和link3,link1和link3之间的碰撞情况。因此为了节省计算资源,可以提前告诉电脑哪几个link是肯定不会碰撞的,哪几个link是肯定碰撞。这样一来不需要花费计算资源去检测那几对link了。
预览
所以只需要点击Generate collision Matrix
系统就会自动帮你检测可以优化的选项
成功生成
五、添加虚拟关节 virtual joint
通过添加虚拟关节把机械臂关联到world。这里我们只需要定义一个虚拟关节把panda_link0关联到world,从而定义机械臂基座和world的坐标系关系。
五、添加规划组planning group
MoveIt通过定义规划组(planning group)来语义上定义机机械臂的各个部分(如手臂,末端执行器等)。这是MoveIt中一个很重要的概念。简单来说就是定义某些关节为一个组合并起一个名字。
- 选择左侧Planning Groups
- 点击Add Group
添加规划组arm
-
输入名称panda_arm
-
运动学求解器选择kdl_kinematics_plugin/KDLKinematicsPlugin (一般用KDL就可以)如果需要更强大的求解器,参考IKFast Kinematics/IKFast
添加关节组
如果有末端执行器,则额外添加一个规划组 (hand)
五、添加预设的机器人姿态
MoveIt允许添加一个预设的机器人姿态,之后可以方便调用,例如初始姿态。
这里我们添加一个HOME姿态。
- 选择左侧Robot Poses
- 点击Add Pose按钮,定义名称为home
- 选择规划组panda_arm, 右侧会出现各个关节的滑条,拖动设置想要的姿态
- 点击Save保存
然后生成配置文件
然后放到工作空间下,编译运行demo.launch
运行结果如图
实验二
使用上述机器人模型,完成 MoveIt!+Gazobo 仿真系统配置,可通过 MoveIt!控 制 Gazebo 中的机械臂运动;
实验二主要参考古月居老师的
这里主要用到ros_control
ros_control功能:
为开发者提供机器人控制中间件
包含一系列控制器接口、传动装置接口、硬件接口、控制器工具箱等等
可以帮助机器人应用功能包快速落地,提高开发效率。
一、采用ros_control实现的控制系统整体架构:
控制器管理器
提供一种通用的接口来管理不同的控制器,比如小车的轮子需要速度指令,机械臂需要位置、扭矩指令,不同的控制器就需要一个controller manager来管理,以同时包含多种controller
控制器
读取硬件状态,发布控制命令,完成每个joint的控制
硬件资源
为上下两层提供硬件资源的接口
机器人硬件抽象
机器人硬件抽象直接连接硬件资源,通过write和read方法完成硬件操作
真实机器人
执行接收到的命令
二、ros_control这个功能包包含了很多controllers,完成速度、位置、力控制。常用的有四个controller:
joint_state_controller
这个controller其实和控制没关系,监控机器人状态,比如编码器的反馈回来的位置速度等数据,它将其封装成topic发出来,功能和joint_state_publisher这个节点是一样的,只是数据输入不一样,输出都是话题形式。
joint_effort_controller
joint_position_controller
joint_velocity_controller
三、实现过程
(1)完善urdf文件
第一步:在可视化基础上为link添加惯性参数和碰撞属性(质量设小一点,惯性矩阵设大一点)
这样设置的原因:
-
质量小:
- 将质量设小一点,可以降低Gazebo计算模型运动时产生的惯性效应。由于质量越大惯性越大,因此大的质量会导致Gazebo在仿真中出现更明显的振动或数值不稳定情况。减小质量可以减轻这些效应,使模型在仿真中更加“轻便”和灵活。
- 质量较大时,对模型的力和碰撞的响应更大,会使模型容易出现不稳定的情况,甚至可能导致仿真中的模型“弹跳”或震荡。
-
惯性矩阵大:
- 惯性矩阵反映物体在各轴方向的转动惯性。将惯性矩阵设大一点,相当于增加了模型各方向的转动惯性,使得模型在受到外力或碰撞时,转动变得更“缓慢”且不容易旋转,这样可以减少不稳定的旋转效应。
- 较大的惯性矩阵相当于增加了“阻尼”效果,使模型的运动更加平滑和稳定,避免因为数值误差或碰撞导致的剧烈旋转。
- 在仿真中,惯性矩阵值太小容易导致Gazebo的数值误差放大,造成一些非物理的运动现象,因此通常将惯性矩阵设置得略大一些来增强模型的稳定性。
第二步:为joint添加传动装置
代表减速器等传动装置,传进来的是控制指令,比如下图的位置指令
第三步:添加gazebo控制器插件
电机如何转起来,需要添加一个控制器,对应真实机器人的伺服驱动器,就是前面讲的controller,完成电机的运动控制,输入位置,输出到transmission上面去。参数是比较多的,一般在模型中加载插件,再通过多个参数文件具体配置。
robotNamespace代表具体的机器人命名空间,仿真类型robotSimType,使用默认的硬件抽象层接口,完成上面的指令到机器人的转换。legacyModeNS用于兼容之前ROS版本的配置。
(2)在gazebo中加载机械臂
launch文件完成的功能:一是启动gazebo仿真环境,二是将模型加载到仿真环境中去。
<launch>
<!-- these are the arguments you can pass this launch file, for example paused:=true -->
<arg name="paused" default="false"/>
<arg name="use_sim_time" default="true"/>
<arg name="gui" default="true"/>
<arg name="headless" default="false"/>
<arg name="debug" default="false"/>
<!-- 用于启动整个Gazebo仿真环境 -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="debug" value="$(arg debug)" />
<arg name="gui" value="$(arg gui)" />
<arg name="paused" value="$(arg paused)"/>
<arg name="use_sim_time" value="$(arg use_sim_time)"/>
<arg name="headless" value="$(arg headless)"/>
</include>
<!-- 用于保存机器人模型路径 -->
<param name="robot_description" command="cat $(find my_arm)/urdf/my_arm.urdf" />
<!-- 用于将机器人模型放置在gazebo中 -->
<node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
args="-urdf -model ur3_arm -param robot_description"/>
</launch>