MoveGroupInterface功能分析

本文围绕ROS和MoveIt展开机械臂运动规划讲解。涵盖普通运动(关节运动、Pose运动)、具有约束的路径规划、Cartesian路径规划,还介绍Pick和Place操作,包括抓取与放置操作的详细步骤,如确定末端执行器方位、关节状态等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

普通运动

关节运动

给定一个目标关节值,将机械臂运动到这一个目标:

moveit::planning_interface::MoveGroupInterface move_group(groupName);
move_group.setJointValueTarget(target_position);
moveit::planning_interface::MoveGroupInterface::Plan my_plan;
bool success=(move_group.plan(my_plan)==moveit::planning_interface::MoveitErrorCode::SUCCESS);
if(success)
    move_group.move();

Pose运动

运动到一个给定的目标Pose。若未指定末端执行器的link,则使用默认的末端执行器link,即该group的最后一个link。

moveit::planning_interface::MoveGroupInterface move_group(groupName);
move_group.setPoseTarget(target_pose, end_effector_link="");
moveit::planning_interface::MoveGroupInterface::Plan my_plan;
bool success=(move_group.plan(my_plan)==moveit::planning_interface::MoveitErrorCode::SUCCESS);
if(success)
    move_group.move();

具有约束的路径规划

在进行路径规划时,可以为某个link或joint设置如下约束:

  • JointConstraint,设置一个关节的位置约束,也就是说在规划时,必须使该关节经过该位置。
  • PositionConstraint,设置一个link的位置约束
  • OrientationConstraint,设置link的方向约束。该约束在开始时必须将link的方向调整为与目标方向一致,然后从起始位置移动到目标位置时,会令link的方向保持不变。该约束非常有用,例如在一个平面内进行焊接和雕刻,以及拧螺丝操作等等。
  • VisibilityConstraint

如下是以OrientationConstraint为例说明约束路径规划的使用

//定义一个方向约束
moveit_msgs::OrientationConstraint ocm;
ocm.link_name = "link6";
ocm.header.frame_id="link0";
ocm.orientation=start_pose.orientation;
ocm.absolute_x_axis_tolerance = 0.1;
ocm.absolute_y_axis_tolerance = 0.1;
ocm.absolute_z_axis_tolerance = 0.1;
//将这个约束应用于move_group
moveit_msgs::Constraints test_constraints;
test_constraints.orientation_constraints.push_back(ocm);
move_group.setPathConstraints(test_constraints);

// 注意目标的方向要与起始方向一致
move_group.setPoseTarget(target_pose);
//...

Cartesian路径规划

将机器人的手臂沿一个期望的笛卡尔坐标路径运动,这里以一个三角形(向下,向右,在左上)。可以通过指定路径点的方式来实现。在代码中采用包含pose的vector来设置路径点。通常初始的pose可以不放在里面,但添加初始pose有助于可视化。

//创建三角形的顶点,第一个顶点为机器人的起始位置点
vector<geometry_msgs::Pose> way_points;
geometry_msgs::Pose target_pose =start_pose;
way_points.push_back(target_pose);
target_pose.position.z -=0.2;
way_points.push_back(target_pose);
target_pose.position.y -=0.2;
way_points.push_back(target_pose);
target_pose.position.z +=0.2;
target_pose.position.y +=0.2;
way_points.push_back(target_pose);
//创建move_group
moveit::planning_interface::MoveGroupInterface move_group(groupName);
//move_group.setMaxVelocityScalingFactor(0.1);

//按照路径点进行轨迹规划
moveit_msgs::RobotTrajectory trajectory;
const double jump_threshold=0.0;
const double eef_step=0.01;
double fraction = move_group.computeCartesianPath(way_points, eef_step, jump_threshold, trajectory);

//在rviz中显示轨迹线
moveit_visual_tools::MoveitVisualToolsPtr visual_tools;
visual_tools.reset(new moveit_visual_tools::MoveitVisualTools("world", "/rviz_visual_tools"));
visual_tools->deleteAllMarkers();
visual_tools->publishPath(way_points, rviz_visual_tools::LIME_GREEN, rviz_visual_tools::SMALL);
for(size_t i=0; i<way_points.size(); ++i) 
    visual_tools->publishAxisLabeled(way_points[i], "pt"+std::to_string(i), rvt::SMALL);
visual_tools->trigger();

注意其中moveit_visual_tools显示marker时,要确定rviz中MarkerArray是打开并且其Topic为"/rviz_visual_tools"

Pick和Place

pick和place用的是moveit_msgs::Grasp消息,位于<moveit_msgs/Grasp.h>头文件中。其包含了如下的字段:

  • trajectory_msgs/JointTrajectory pre_grasp_posture, 定义了在进行抓取之前,末端执行器关节的位置。
  • trajectory_msgs/JointTrajectory grasp_posture, 定义了在进行抓取时,末端执行器group中各关节的位置。
  • geometry_msgs/PoseStamped grasp_pose, 定义了末端执行器尝试抓取时的方向。
  • moveit_msgs/GripperTranslation pre_grasp_approach, 定义用于接近目标物体的方向和距离
  • moveit_msgs/GripperTranslation pose_grasp_retreat, 定义在抓取到物体后移动的方向和距离
  • moveit_msgs/GripperTranslation pose_place_retreat, 定义在物体被放置后手臂移动的方向和距离

我们以下图中的示例来说明pick和place的应用。这是moveit中的pick和place的教程。

图中创建了两个长方体模拟台桌,第一个台桌的尺寸为(0.2,0.4,0.4),位置在(0.5,0,0.2)。第二个台桌的尺寸为(0.4,0.2,0.4),位置在(0,0.5,0.2)。然后在第一个台桌上放置一个待移动的物件,其尺寸为(0.02,0.02,0.2),放置在(0.5, 0, 0.4+0.1)的位置,即第一个台桌上。
注意: 创建的长方体的自身坐标原点都为其中心点。图中显示的坐标系,红绿蓝分别指向XYZ轴。)

抓取操作

下面我们会按照顺序说明进行抓取操作需要定义的内容,实际编程时可以随意安排。
第一,确定抓取之前末端执行器接近目标物体的方向和距离。 也就是说将link_8坐标系在给定的距离上调整到与抓取方向(后面会定义)一致的方向,然后再沿设定的接近方向靠近物体,直到link_8坐标系与给定的抓取方位一致。
第二,定义在抓取前末端执行器关节名称以及状态。 在第一步中将末端调整到所需位置后,就会按照此步的定义将末端执行器关节进行调整,以便进行抓取。
第三,确定抓取时link_8的方位。 这里要确定一个事情:1,末端执行器手掌面到link_8的距离为0.058;2,末端执行器手抓要抓住长条物体的中间部位。那么link_8的位置可以确定为:
0.5−长条宽度/2−掌面到link8的距离−一些padding=0.5−0.01−0.058−0.017=0.4150.5-长条宽度/2-掌面到link_8的距离-一些padding=0.5-0.01-0.058-0.017=0.4150.5/2link8padding=0.50.010.0580.017=0.415

link_8的坐标方向则相对于link_0坐标系进行变换,其RPY(分别绕固定轴X,Y,Z旋转)值为(−π/2,−π/4,−π/2)。(-\pi/2,-\pi/4,-\pi/2)。(π/2,π/4,π/2)
说明: 为什么要确定link_8的方位呢?因为link_8是arm关节组中的最后一个关节,而运动规划是针对这个关节组的,所以确定link_8的方位就知道怎么进行运动了。而末端执行器都是固连于arm关节组的最后一个关节的,如果不是,那么也可归到arm关节组去了。)
第四,确定抓取时末端执行器关节的名称以及状态。 当机器人运动到第三步中指定的抓取方位后,按此步中的定义调整末端执行器,以便夹住物体。这一步很重要,当夹住物体时会暗地里将物体依附到末端执行器关节上随之运动。
说明: 在机器人的urdf中,必须为末端执行器定义可活动的旋转或移动关节,如果是fixed关节则会出错。就算末端执行器是一个固定的吸盘,也将关节定义成移动的,只不过编程时不让它动而已。)
第五,确定抓取后末端执行器退出动作的方向和距离。 也就是说在link_8到达指定位置并抓取目标物体后,机器人末端会安装给定的方向移动一段距离(这时末端坐标系的方向并不变)。

放置操作

放置操作的过程与抓取操作具有很多相似之处。
第一 定义放置前机器人末端如何接近目标放置位置的方向和距离。
第二 定义放置时link_8的方位。注意这里的方向是相对于抓取时的方向的,本列中是将抓取时方向再绕"base_link"的Z轴旋转90度。而位置则是物体中心的全局坐标。
第三 定义放置后机器人末端如何退出的方向和距离。退出时物体将解除于机器人的依附关系。
第四 定义放置后末端执行器关节的名称和状态。

<think>我们正在解决一个关于共享库文件缺失的问题。用户遇到了一个错误:无法打开共享对象文件 `libmoveit_move_group_interface.so.2.5.8`。这通常发生在程序运行时,系统无法找到所需的共享库(动态链接库)。 ### 问题分析 1. **共享库的作用**:共享库(在Linux中通常以`.so`为扩展名)包含可被多个程序共享的代码和数据。当程序需要某个库时,动态链接器会在运行时加载它。 2. **错误原因**:出现此错误通常有以下几种可能: - 该共享库未安装在系统上。 - 库文件已安装,但不在动态链接器搜索的路径中。 - 库文件存在,但权限不足无法读取。 - 库文件损坏或版本不匹配(例如,程序需要2.5.8版本,但安装的是其他版本)。 ### 解决步骤 #### 1. 确认库文件是否安装 首先,我们需要检查系统上是否安装了该库文件。可以使用`find`或`locate`命令来搜索: ```bash sudo find / -name 'libmoveit_move_group_interface.so*' 2>/dev/null ``` 或者使用`locate`(如果已安装并更新了数据库): ```bash sudo updatedb # 如果数据库未更新,先更新 locate libmoveit_move_group_interface.so ``` 如果找到类似文件(如`libmoveit_move_group_interface.so.2.5.8`或带有其他版本号的文件),则说明库已安装。否则,需要安装。 #### 2. 安装缺失的库 库文件通常由特定的软件包提供。在Ubuntu/Debian系统中,可以使用`apt-file`来查找提供该库的包: - 安装`apt-file`: ```bash sudo apt update sudo apt install apt-file sudo apt-file update ``` - 搜索库文件对应的包: ```bash apt-file search libmoveit_move_group_interface.so.2.5.8 ``` 如果没有精确匹配,可以尝试搜索不带版本号的部分: ```bash apt-file search libmoveit_move_group_interface.so ``` 根据搜索结果,安装相应的包。例如,如果发现包名为`ros-melodic-moveit-ros`(假设ROS版本为Melodic),则安装: ```bash sudo apt install ros-melodic-moveit-ros ``` 注意:`moveit`是ROS中的一个模块,因此用户可能需要在正确的ROS发行版下安装。请确保安装的版本与程序所需的版本(2.5.8)匹配。 #### 3. 添加库路径到链接器配置 如果库已经安装,但不在标准库路径(如`/usr/lib`、`/usr/local/lib`)中,则需要将库所在目录添加到链接器的搜索路径中。 - 临时方法(仅当前终端有效): ```bash export LD_LIBRARY_PATH=/path/to/directory/containing/library:$LD_LIBRARY_PATH ``` 然后重新运行程序。 - 永久方法(推荐): 创建或编辑`/etc/ld.so.conf.d/mylib.conf`(例如`/etc/ld.so.conf.d/moveit.conf`),将库路径添加到文件中: ```bash sudo sh -c "echo '/path/to/directory' > /etc/ld.so.conf.d/moveit.conf" ``` 然后更新链接器缓存: ```bash sudo ldconfig ``` #### 4. 检查文件权限 如果库文件存在,但权限不足,使用`chmod`更改权限: ```bash sudo chmod 755 /path/to/libmoveit_move_group_interface.so.2.5.8 ``` #### 5. 符号链接 如果找到的是其他版本(如`libmoveit_move_group_interface.so.2.5.9`),可以尝试创建一个符号链接指向所需版本(但需谨慎,可能存在兼容性问题): ```bash sudo ln -s /path/to/libmoveit_move_group_interface.so.2.5.9 /usr/lib/libmoveit_move_group_interface.so.2.5.8 sudo ldconfig ``` ### 针对ROS环境的特别说明 由于`libmoveit_move_group_interface`是ROS MoveIt的一部分,用户可能是在ROS环境中运行程序。因此,请确保: 1. 已正确安装ROSMoveIt。 2. 如果使用工作空间,请确保已经`source`了工作空间的`setup.bash`(例如`source /opt/ros/melodic/setup.bash`或`source ~/catkin_ws/devel/setup.bash`)。 3. 如果是从源代码编译的,确保编译成功并且已经安装(`catkin_make install`或`catkin build`)。 ### 验证 运行程序前,可以再次检查动态链接库是否被找到: ```bash ldconfig -p | grep libmoveit_move_group_interface ``` 如果输出中包含该库,则说明链接器可以找到它。 ### 总结 解决共享库缺失问题的步骤: 1. 搜索库文件是否存在。 2. 如果不存在,安装提供该库的软件包。 3. 如果存在但不在标准路径,添加路径并更新链接器缓存。 4. 检查权限。 5. 在ROS环境中,确保正确配置环境。 通过以上步骤,应该能解决该问题。 ### 相关问题 1. 如何查看一个程序依赖哪些共享库? 2. 在Linux中,动态链接器是如何搜索共享库的? 3. 如何创建和管理自定义的共享库? 4. ROS环境下如何正确配置库路径?</think>### 解决 libmoveit_move_group_interface.so.2.5.8 无法打开的问题 #### 1. **确认库文件是否存在** 首先检查系统中是否安装了该共享库: ```bash find / -name "libmoveit_move_group_interface.so*" 2>/dev/null ``` 如果无输出结果,说明库未安装[^5]。 #### 2. **安装缺失的库文件** 该库属于 ROS MoveIt 组件,需通过包管理器安装: ```bash # Ubuntu/Debian 系统 sudo apt update sudo apt install ros-${ROS_DISTRO}-moveit-ros ``` 将 `${ROS_DISTRO}` 替换为实际 ROS 版本(如 `noetic`、`melodic`),安装后库文件会出现在 `/opt/ros/${ROS_DISTRO}/lib/` 目录[^3]。 #### 3. **配置动态链接器路径** 若库已安装但程序仍找不到,需添加库路径: ```bash # 临时生效(当前终端) export LD_LIBRARY_PATH=/opt/ros/${ROS_DISTRO}/lib:$LD_LIBRARY_PATH # 永久生效 echo "export LD_LIBRARY_PATH=/opt/ros/${ROS_DISTRO}/lib:\$LD_LIBRARY_PATH" >> ~/.bashrc source ~/.bashrc ``` #### 4. **验证库文件完整性** 检查库文件的哈希值和权限: ```bash # 检查哈希值(对比正常机器) sha256sum /opt/ros/${ROS_DISTRO}/lib/libmoveit_move_group_interface.so.2.5.8 # 修复权限问题 sudo chmod 755 /opt/ros/${ROS_DISTRO}/lib/libmoveit_move_group_interface.so.2.5.8 ``` 若哈希值不匹配,需重新安装 ROS MoveIt 包[^4]。 #### 5. **重建符号链接** 检查版本符号链接是否正确: ```bash cd /opt/ros/${ROS_DISTRO}/lib ls -l libmoveit_move_group_interface.so* ``` 若缺少 `libmoveit_move_group_interface.so.2.5.8` 的软链接,手动创建: ```bash sudo ln -s libmoveit_move_group_interface.so.2.5.8 libmoveit_move_group_interface.so ``` #### 6. **重新编译相关程序** 如果问题出现在自编译程序中: ```bash cd ~/catkin_ws catkin clean -y catkin build source devel/setup.bash ``` ### 常见问题排查表 | 现象 | 解决方案 | |------|----------| | 库文件不存在 | 安装 `ros-<版本>-moveit-ros` 包 | | 路径未配置 | 设置 `LD_LIBRARY_PATH` | | 权限不足 | `chmod 755` 修改权限 | | 符号链接损坏 | 重建 `.so` 版本软链接 | | ROS 环境未激活 | `source /opt/ros/${ROS_DISTRO}/setup.bash` | ### 相关问题 1. 如何检查 ROS 包的依赖关系? 2. 动态链接库加载失败的其他常见原因有哪些? 3. MoveItROS 中的核心功能是什么? 4. 如何为不同 ROS 版本安装兼容的 MoveIt? [^1]: 共享库接口转换示例 [^3]: 包安装依赖检查方法 [^4]: 文件哈希值验证操作 [^5]: 模块化组件管理说明
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值