介绍
通过本篇文章学习,你可以收获以下内容
学会将配置好的moveit文件在rviz中可视化出来
学会利用python代码进行编程控制
版本平台
系统版本:ubuntu20.04
ROS2版本:noetic
Moveit版本:moveit-noetic
一、机械臂在ros里面的可视化
1. 在终端中运行以下命令,启动MoveIt的demo文件
roslaunch ur_config demo.launch
启动成功后,你会看到RViz界面,界面中包含了以下内容:
- 机械臂的3D模型。
- 交互式标记器(Interactive Marker),用于控制机械臂。
- 机械臂的规划组(Planning Groups),你可以选择要操作的关节组
2. 在RViz中进行机械臂操作
-
运动规划
在RViz中,可以通过以下步骤进行简单的运动规划:- 选择 "Planning Groups" 中的机械臂关节组。
- 使用交互标记器调整机械臂末端的目标位置。
- 点击 “Plan” 按钮进行路径规划。
- 点击 “Execute” 按钮执行规划的路径。
-
显示关节状态
在左侧的 "Displays" 栏中,可以查看机械臂当前的关节状态,并通过修改关节角度手动调整机械臂姿态。
二、使用Python代码控制机械臂
MoveIt支持通过Python接口控制机械臂,以下是代码示例和关键设置:
Python代码示例:
#!/usr/bin/env python3
import rospy
from moveit_commander import RobotCommander, MoveGroupCommander, PlanningSceneInterface
from geometry_msgs.msg import Pose
# 初始化ROS节点
rospy.init_node('move_to_hole') # 替换为你的节点名称
# 创建MoveIt Commander对象
robot = RobotCommander()
move_group = MoveGroupCommander('arm') # 替换为你的机械臂组名
# 获取当前的机器人状态
current_state = robot.get_current_state()
#rospy.loginfo("当前机械臂状态: %s", current_state)
# 创建PlanningSceneInterface对象
scene = PlanningSceneInterface()
rospy.sleep(2) # 等待场景更新
# 设置目标位置坐标为(x, y, z)
target_position = Pose()
target_position.position.x = 0.0000 # 目标位置x坐标
target_position.position.y = 0.6916 # 目标位置y坐标
target_position.position.z = 0.1038 # 目标位置z坐标
target_position.orientation.w = 1.000000 # 确保方向正确
# 设置规划参数
move_group.set_num_planning_attempts(15) # 增加规划尝试次数
move_group.set_planning_time(20) # 增加规划时间
move_group.set_goal_position_tolerance(0.05) # 放宽位置容忍度
move_group.set_goal_orientation_tolerance(0.05) # 放宽姿态容忍度
move_group.set_goal_tolerance(0.05) # 设置整体容忍度
# 设置目标
move_group.set_pose_target(target_position)
#if move_group.check_collision():
# rospy.logwarn("目标位置存在碰撞,请调整目标位置")
# 使用MoveGroupCommander检查当前状态的有效性(避免碰撞)
if move_group.get_current_state().joint_state:
rospy.loginfo("当前状态有效,可以规划路径")
else:
rospy.logerr("当前状态无效,发生碰撞或超出工作空间")
# 尝试路径规划
plan = move_group.plan()
#rospy.loginfo(f"规划路径: {plan}")
# 确认规划结果是否有效
if plan[0]: # 检查plan是否是有效轨迹
rospy.loginfo("规划成功,准备执行路径...")
try:
# 执行路径
success = move_group.execute(plan[1], wait=True)
if success:
rospy.loginfo("成功将机械臂移动至目标位置")
else:
rospy.logwarn("执行失败,请检查轨迹或目标姿态")
except Exception as e:
rospy.logerr(f"执行时出现错误: {e}")
else:
rospy.logerr("规划轨迹失败,检查障碍物信息或目标位置是否合理")
# 输出目标位置和当前机械臂末端状态,方便调试
current_pose = move_group.get_current_pose().pose
rospy.loginfo(f"目标位置: {target_position}")
rospy.loginfo(f"当前末端位置: {current_pose}")
三、核心选项解析
MoveIt的操作面板和代码接口中包含多个核心选项,用于控制规划方式和执行策略。以下是每个选项的详细解析:
1. Use Cartesian Path
- 功能:使用笛卡尔路径规划,使机械臂末端沿直线轨迹移动。
- 优点:
- 保证末端以精确的方式移动到目标位置。
- 避免曲线运动导致的干涉问题。
- 应用场景:用于抓取、插入或沿固定路径操作。
2. Collision-aware IK
- 功能:基于碰撞检测的逆运动学求解器,避免生成导致机械臂碰撞的解。
- 优点:
- 提高规划路径的安全性。
- 避免与环境中的障碍物发生碰撞。
- 应用场景:机械臂在复杂环境中工作时使用。
3. Approx IK Solutions
- 功能:使用近似的逆运动学求解,可能提供比精确求解更快的结果。
- 优点:
- 提升规划速度,特别是在目标频繁变化的情况下。
- 适合对精度要求不高的应用。
- 缺点:可能导致路径不够平滑。
- 应用场景:实时性优先的控制任务。
4. External Comm
- 功能:允许MoveIt与外部设备通信,如传感器或远程控制系统。
- 优点:
- 实现更高层次的控制。
- 支持将机械臂与深度相机、激光雷达等设备结合使用。
- 应用场景:传感器融合、多机器人协作。
5. Replanning
- 功能:当检测到路径阻塞或目标发生变化时,自动重新规划路径。
- 优点:
- 增强对动态环境的适应性。
- 提高任务完成率。
- 应用场景:移动机械臂需要避开动态障碍物时使用。
6. Sensor Positioning
- 功能:利用传感器(如深度相机、激光雷达)实时获取环境信息,并根据这些信息调整机械臂动作。
- 优点:
- 实现视觉引导。
- 动态调整机械臂姿态。
- 应用场景:需要实时感知和调整的复杂任务。