当前位置:   article > 正文

UR机械臂Gazebo仿真以及运动控制_gazebo 机械臂仿真可视化怎么

gazebo 机械臂仿真可视化怎么

UR机械臂Gazebo仿真以及运动控制

在ROS中使用Gazebo进行UR (Universal Robots) 机械臂的仿真是一种常见的做法,用于测试机械臂的控制算法、路径规划、以及与环境的交互等,而无需接触实体机器。以下是一步步指导如何设置和运行UR机械臂在Gazebo仿真环境中的基础信息和指南。以及如何通过python代码实现对机械臂的控制,末端位置信息的获取等操作。

1. 环境准备

确保你已经安装了ROS和Gazebo。UR机械臂的Gazebo仿真通常还需要额外的ROS包,如ur_gazebo,ur_description,和ur5_moveit_config。这些包包含了机器人的描述文件、Gazebo启动脚本以及MoveIt的配置文件。

安装这些包(以ROS Noetic为例):

sudo apt-get install ros-noetic-ur-gazebo ros-noetic-ur-description ros-noetic-ur5-moveit-config
  • 1

或者用github源码安装,进入catkin_ws/src

git https://github.com/ros-industrial/universal_robot.git (branch: noetic)
  • 1

如果使用的是其他版本的ROS,比如Melodic,只需将noetic替换为melodic即可。

2. 启动Gazebo仿真

一旦安装了必要的包,你可以通过roslaunch命令启动UR机械臂的Gazebo仿真。例如,启动UR5机械臂的命令如下:

roslaunch ur_gazebo ur5.launch
  • 1

3. 集成MoveIt

MoveIt是一个强大的ROS库,用于机械臂的路径规划和运动控制。启动UR5机械臂的MoveIt配置并与Gazebo仿真集成:

roslaunch ur5_moveit_config ur5_moveit_planning_execution.launch sim:=true
  • 1

然后,启动MoveIt的RViz界面来可视化规划场景和控制机械臂:

roslaunch ur5_moveit_config moveit_rviz.launch config:=true
  • 1

在这里插入图片描述
然后就可以通过鼠标移动末端,按规划和执行按钮来控制仿真环境中机械臂的运动。

4. 编写和运行控制脚本

同时还可以使用Python或C++编写ROS节点来控制Gazebo中的UR机械臂。主要是使用moveit_commander库来控制UR5机械臂的关节空间。

#!/usr/bin/env python
import sys
import rospy
import moveit_commander

def main():
    moveit_commander.roscpp_initialize(sys.argv)
    rospy.init_node('ur5_gazebo_moveit')

    robot = moveit_commander.RobotCommander()
    scene = moveit_commander.PlanningSceneInterface()
    group = moveit_commander.MoveGroupCommander("manipulator")

    # 设置目标位置
    group.set_named_target("home")
    plan = group.go()

    # 执行更多的移动操作...

    moveit_commander.roscpp_shutdown()

if __name__ == "__main__":
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

关于执行更多操作,这里拓展下包括回零(回到初始位置)、移动到目标关节位置、抓取目标物体,以及沿预定的空间轨迹移动。
回零(回到初始位置)
在机器人操作中,回零是指将机械臂移动到其定义的“零”或“家”位置。这通常是机械臂启动时的默认位置。

group.set_named_target("home")  # MoveIt中预定义的家位置
group.go(wait=True)
group.stop()  # 确保没有残余的移动
  • 1
  • 2
  • 3

移动到目标关节位置
要将机械臂移动到特定的关节位置,可以指定每个关节的角度(单位为弧度)。

joint_goal = group.get_current_joint_values()
joint_goal[0] = 0  # 基座关节
joint_goal[1] = -pi/4  # 第二关节
joint_goal[2] = 0  # 第三关节
joint_goal[3] = -pi/2  # 第四关节
joint_goal[4] = 0  # 第五关节
joint_goal[5] = pi/3  # 第六关节(手腕)

group.go(joint_goal, wait=True)
group.stop()  # 调用stop()确保无其他运动
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

沿空间轨迹移动
执行特定的空间轨迹时,可以定义一个路径点的列表,MoveIt会尝试生成平滑的、碰撞自由的路径。

pose_target = geometry_msgs.msg.Pose()
pose_target.orientation.w = 1.0
pose_target.position.x = 0.4
pose_target.position.y = -0.1
pose_target.position.z = 0.4
group.set_pose_target(pose_target)

plan = group.plan()  # 计划路径
group.execute(plan, wait=True)  # 执行路径

# 清除目标位置,以防影响后续移动
group.clear_pose_targets()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在执行这些操作时,确保ROS和MoveIt的配置能够支持相应的动作,如正确配置了运动规划管道(motion planning pipeline),并确保有适当的碰撞检测设置来避免碰撞。

抓取目标
抓取操作通常需要与外部设备(如抓手)的集成。在MoveIt中,你可以将抓手作为一个额外的执行组添加到URDF模型中,并通过MoveIt控制它。

#!/usr/bin/env python
import sys
import rospy
import moveit_commander

def main():
    moveit_commander.roscpp_initialize(sys.argv)
    rospy.init_node('gripper_control')

    gripper = moveit_commander.MoveGroupCommander("gripper_group")
    gripper.set_named_target("close")  # 假设已定义抓手的关闭和打开位置
    plan = gripper.go(wait=True)
    gripper.stop()

    moveit_commander.roscpp_shutdown()

if __name__ == "__main__":
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

上面是驱动控制器进行开合的代码,另一个问题是如何获取末端抓手的位置,主要有几个方法:
(1)使用TF (Transform) 库
在ROS中,TF库被广泛用来管理不同坐标系之间的变换。如果你的抓手和机械臂的每个部分在URDF(Unified Robot Description Format)文件中都被正确配置,那么你可以通过TF来查询抓手相对于其他坐标系(如世界坐标系或机器人基座)的位置和姿态。

import rospy
import tf2_ros
import geometry_msgs.msg

def get_gripper_position():
    rospy.init_node('gripper_position_listener')

    tf_buffer = tf2_ros.Buffer()
    listener = tf2_ros.TransformListener(tf_buffer)

    rate = rospy.Rate(10.0)
    while not rospy.is_shutdown():
        try:
            # 替换 'base_link' 和 'gripper_link' 为你的参考坐标系和抓手的TF名字
            trans = tf_buffer.lookup_transform('base_link', 'gripper_link', rospy.Time(0))
            print("Gripper Position:", trans.transform.translation)
            print("Gripper Orientation:", trans.transform.rotation)
        except (tf2_ros.LookupException, tf2_ros.ConnectivityException, tf2_ros.ExtrapolationException) as e:
            print(e)
        rate.sleep()

if __name__ == '__main__':
    get_gripper_position()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

这个脚本会定期查询和打印从基座到抓手的变换,包括位置和方向。
(2)通过Forward Kinematics (正向运动学)
如果你使用的是MoveIt或其他机器人控制框架,通常它们会提供计算正向运动学的功能。正向运动学可以根据给定的关节角度计算机械臂末端(在这里是抓手)的位置。

import sys
import rospy
import moveit_commander

def main():
    moveit_commander.roscpp_initialize(sys.argv)
    rospy.init_node('moveit_gripper_position')

    robot = moveit_commander.RobotCommander()
    group = moveit_commander.MoveGroupCommander("manipulator")

    # 获取当前的末端执行器的姿态
    pose = group.get_current_pose()
    print("Current Gripper Pose:", pose.pose)

    moveit_commander.roscpp_shutdown()

if __name__ == "__main__":
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

这段代码使用MoveIt的API获取并打印当前抓手的姿态。

(3) 直接从传感器读取
如果你的抓手或机械臂装备了如编码器等传感器,可以直接从这些传感器读取数据来获取位置信息。这通常需要硬件支持和适当的驱动程序。

参考:
ros ur_gazebo tutorial

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/979140
推荐阅读
相关标签
  

闽ICP备14008679号