MoveIt:超详细通俗易懂ROS使用MoveIt助手工具生成配置文件

理解不深,先能用,再会用,以鱼学渔


文章混合理解和操作,有 操作:标识为需要操作的地方


先备知识

SRDF与URDF的区别

URDF全称是Unified Robot Description Format,意为描述机器人几何形状、连接关系等基本属性的一种统一格式,是一种静态描述

SRDF全称是Semantic Robot Description Format,也叫URDF with Semantics,顾名思义它是URDF的补充,在URDF的静态描述基础上增加了语义描述

它为机器人静态描述添加关于行为、功能、用途和约束等方面的信息,如碰撞检测、运动规划,使机器人的描述更加丰富,可以进行更高级的任务规划和操作

而MoveIt内的助手工具可以根据已有的URDF文件按需生成SRDF文件,这是本文存在的意义

安装MoveIt

        从官网下载ubuntu对应版本的MoveIt

https://moveit.ros.org/install/icon-default.png?t=N7T8https://moveit.ros.org/install/

开始配置

(1)启动配置助手

        操作:打开终端,输入

roslaunch moveit_setup_assistant  setup_assistant.launch

        操作:点击配置新软件包,并导入一个urdf模型(xacro也可),点击Load Files加载模型 

        若成功,则可在窗口看到预览图

 

(2)生成自碰撞矩阵 

        操作:点击左边栏第二个选项卡Self-Collisions,这个选项有两个功能:

                1)选择性禁用连杆对的碰撞检测,减少处理时间

                        因为要知道有些连杆因为结构设计是不可能碰撞的,预定义这些连杆的关系,可以减少分析,提高响应,分类有:

                                        始终处于碰撞状态(Always in Collision)

                                        永远不会碰撞(Never in Collision)

                                        默认处于碰撞状态(Default in Collision)

                                        禁用相邻连杆(Adjacent Links Disabled)

                                        有时处于碰撞状态(Sometimes in Collision)

                        下面根据gpt回答进行理解,选择性摄入,不保证正确,但能自洽,用于记忆

                2)设置碰撞采样密度,平衡自碰撞几率与处理时间

                        自碰撞采样密度指有多少个随机位置会检查是否有自碰撞现象,密度越高自碰撞几率越小,但计算量越大

        操作:点击Generate Collision Matrix,根据采样密度的设定自动生成自碰撞矩阵

 (3)增加虚拟关节

        操作:点击左边栏第三个选项卡Virtual Joints,这个选项对于底座固定的机器人可以忽略

        当机械臂底座不固定在一个地方时才需要虚拟关节,比如底座在移动物体之上时,就需要一个对应里程计odom的虚拟关节,因为底座base_link相对于里程计odom的坐标系frame是移动的

(4)添加规划组

        操作:点击左边栏第四个选项卡Planning Groups,这个选项用于对机器人多个关节的规划,比如一个规划组可以包含多个关节,至于怎么规划,交给工具,以下还是可以参考但不一定对

        操作:点击右下角Add Group,添加机械臂规划组,设置组名Group Name为arm,设置解算器Kinematic Solver为kdl_kinematics_plugin/KDLKinematicsPlugin,其他可默认

        操作:点击下方Add Kin.Chain添加运动链,基础链接Base Link为base_link,末端链接Tip Link为grasping_frame,保存,arm规划组至此结束


        操作:点击右下角Add Group,添加夹爪规划组,设置组名Group Name为gripper,夹爪不需要提供运动解算器了,所以解算器Kinematic Solver为None,其他可默认

        操作:点击下方Add Joints添加关节,添加finger_joint1与finger_joint2,保存

        操作:点击gripper中的Links,点击下方Edit Selected添加连杆,添加gripper_finger_link1与gripper_finger_link2,保存

        和下图一样即可,可以尝试反复操作去理解

(5)添加机器人姿态

         操作:点击左边栏第五个选项卡Robot Poses,这个选项用于设定机器人在模拟中的初始姿势,有需要可以添加

(6)设置机器人末端执行器

        操作:点击左边栏第六个选项卡End Effector,这个选项用于添加末端执行器

        操作:点击右下方Add End Effector添加末端执行器,name设为robot_eef,规划组Group Name设置gripper,父连杆Parent Link设置grasping_frame,父级组Parent Group设置arm,保存

 (7)添加被动关节

         操作:点击左边栏第七个选项卡Passive joints,用于添加被动关节从而不发布其状态

        比如脚轮,这里无需添加

(8)生成配置文件

        第七个选项卡以后的想了解可以单独花时间,至此已经可以用了

        操作:点击左边栏最后一个选项卡Configuration Files,准备生成配置文件!

        操作:点击Browse来配置配置文件保存目录,对此功能包建议在seven_dof_arm所在工作空间下创建自己的文件夹保存,最后点击Generate Package生成配置文件。

        因为有些设置没完成会弹窗,直接无视即可

        

        大功告成

 

### MoveIt 中夹爪控制的配置与使用 #### 1. 夹爪控制器的选择 在 MoveIt 的配置过程中,夹爪通常由独立的控制器管理。常见的夹爪控制器有 `gripper_controller` 或者自定义实现的关节位置/速度控制器。这些控制器可以通过 ROS 控制器框架 (ros_control) 进行集成[^1]。 #### 2. 配置夹爪的动作接口 为了使 MoveIt 能够控制夹爪,需要设置动作服务器 (Action Server),以便通过标准的 `control_msgs/GripperCommandAction` 接口发送目标命令。这一步骤可以在 MoveIt 助手工具中完成,具体操作如下: - 打开终端并启动 MoveIt Setup Assistant 工具: ```bash roslaunch moveit_setup_assistant setup_assistant.launch ``` - 在助手界面中加载机器人的 URDF 文件,并进入 **Planning Groups** 页面。 - 添加一个新的 Planning Group 并将其命名为 “Gripper”,随后指定该组所包含的关节名称(通常是夹爪的两个手指对应的关节)[^3]。 #### 3. 编辑 SRDF 和 YAML 配置文件 完成上述步骤后,需进一步编辑生成的 SRDF 文件和 YAML 配置文件来适配实际硬件需求。以下是关键部分的内容说明: - **SRDF**: 定义夹爪的初始状态及其约束条件。例如,在 `<group_state>` 标签下可以设定默认闭合或张开的状态。 - **YAML**: 修改位于 `config/gripper_controllers.yaml` 下的相关参数,确保它们匹配真实的物理特性,比如最大努力值 (`max_effort`) 和目标位置范围 (`joint_limits`) [^2]。 #### 4. 实现夹爪的操作逻辑 利用 Python 或 C++ API 可以编写脚本来调用已配置好的服务节点执行具体的抓取任务。下面给出一段基于 Python 的简单示例代码用于演示如何开启一次完整的抓握过程: ```python import rospy from control_msgs.msg import GripperCommandGoal, GripperCommandAction from actionlib import SimpleActionClient def gripper_client(): client = SimpleActionClient('gripper_controller/gripper_action', GripperCommandAction) client.wait_for_server() goal = GripperCommandGoal() goal.command.position = 0.05 # 设置目标宽度为 5cm goal.command.max_effort = -1.0 # 不限力度 client.send_goal(goal) client.wait_for_result(rospy.Duration.from_sec(5.0)) if __name__ == "__main__": try: rospy.init_node('gripper_command') result = gripper_client() print("Result:", ', '.join([str(n) for n in result])) except rospy.ROSInterruptException as e: print(e) ``` 此段程序创建了一个客户端实例向名为 'gripper_controller/gripper_action' 的服务器提交请求;其中 position 字段决定了最终两指之间的距离大小而 max_effort 则表示施加力矩上限[-∞,+∞]之间任意实数值均可接受但负数意味着不限定具体数值仅依靠内部算法自行调整直至达到期望效果为止。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值