《Moveit-基础篇2》机械臂在rviz中的可视化以及编程控制

介绍

通过本篇文章学习,你可以收获以下内容

学会将配置好的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
  • 功能:利用传感器(如深度相机、激光雷达)实时获取环境信息,并根据这些信息调整机械臂动作。
  • 优点
    • 实现视觉引导。
    • 动态调整机械臂姿态。
  • 应用场景:需要实时感知和调整的复杂任务。

 

### RVIZ机械仿真与实际机械联动 #### 一、准备工作 为了使RVIZ中的机械仿真相对于实际机械进行联动操作,需先完成一系列必要的准备步骤。这包括但不限于安装并配置好ROS环境以及确保所使用的硬件设备支持ROS接口。 - 安装ROS及其配套工具包,如`ros-noetic-desktop-full`[^2]。 - 配置工作空间,建立对应的catkin workspace,并下载所需的软件包来驱动特定型号的机械(例如KUKA KR210),这些通常可以从制造商官方获取或通过社区资源找到[^1]。 #### 二、启动Gazebo仿真环境 利用Gazebo作为物理引擎来进行模拟实验前,可以通过下面这条指令快速设置一个包含TurtleBot3在内的虚拟世界: ```bash roslaunch turtlebot3_gazebo turtlebot3_world.launch ``` 此命令将会打开一个新的终端窗口运行Gazebo客户端程序,并加载预设的地图文件和机器人模型。 #### 三、初始化RVIZ可视化界面 接着,在另一个新的终端里输入以下语句以开启RVIZ应用,它允许用户直观地观察到机械的状态变化情况: ```bash rviz & ``` 此时应该能看到一个空旷的工作区等待进一步定制化调整;接下来可通过添加不同的显示组件(Display Types)比如Joint State Display, Robot Model等让画面更加丰富生动[^4]。 #### 四、编写自定义节点实现数据交互 为了让两者之间形成有效的通信链路,则需要开发专门负责处理传感器反馈信息及发出控制指令的小型应用程序——即所谓的“节点”。这里可以采用Python脚本语言配合ROS API轻松达成目的。具体来说就是监听来自真实世界的关节角度读数并通过话题发布给模拟端,反之亦然。 ```python import rospy from sensor_msgs.msg import JointState def joint_state_callback(data): # 处理接收到的数据... if __name__ == '__main__': rospy.init_node('joint_sync') sub = rospy.Subscriber('/real_robot/joint_states', JointState, joint_state_callback) pub = rospy.Publisher('/simulated_robot/joint_commands', JointState, queue_size=10) rate = rospy.Rate(10) # 设置循环速率 while not rospy.is_shutdown(): msg = JointState() # 构建消息体... pub.publish(msg) rate.sleep() ``` 上述代码片段展示了如何订阅真实的机械状态并将之转发至仿真环境中去影响后者的行为表现形式。 #### 五、校准时间戳保证同步性 由于网络传输延迟等因素的影响可能会造成两个平台间存在不同步现象的发生,为此建议定期对比双方的时间戳差异程度并对症下药采取措施加以修正,从而达到理想的协调运作效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值