ROS(二)moveit控制机械臂运动

举报
Pengpengpeng 发表于 2025/04/28 15:58:17 2025/04/28
【摘要】 moveit控制机械臂运动----关节空间运动 点到点运动:不需要在笛卡尔空间规划运动轨迹,机器人各个关节运动不需要联动

关节空间运动

点到点运动:不需要在笛卡尔空间规划运动轨迹,机器人各个关节运动不需要联动

一、正向运动学

先解析一下需要运行的Python文件

moveit_fk_demo.py

1、文件头部(告诉系统用 Python3 解释器来执行此文件。)

#!/usr/bin/env python3

2、导入模块

import rospy,sys
import moveit_commander

rospy:ROS提供的Python库,用于节点管理、发布/订阅消息等。
sys:Python标准库,用来处理命令行参数。
moveit_commander:MoveIt! 的Python API,用于控制机械臂运动。

3、定义类MoveItFkDemo

class MoveItFkDemo:

定义了一个名为 MoveItFkDemo 的类,封装整个机械臂运动流程。

4、初始化函数 init

def __init__(self):

当类实例化时,这段逻辑会自动运行,做一系列初始化设置。

(1) 初始化 MoveIt
moveit_commander.roscpp_initialize(sys.argv)

初始化 MoveIt! 的 Python 接口。
sys.argv 是启动脚本时的参数列表,ROS需要这个来处理一些系统参数。

(2) 初始化 ROS 节点
rospy.init_node('moveit_fk_demo', anonymous=True)

初始化一个 ROS 节点,名字叫 moveit_fk_demo。
anonymous=True 保证每次运行时节点名唯一,避免冲突。

(3) 定义操作的机械臂组
arm = moveit_commander.MoveGroupCommander('manipulator')

创建一个操作对象 arm,对应 MoveIt 配置文件中叫 ‘manipulator’ 的 group。

(4) 设置参数
arm.set_goal_joint_tolerance(0.001)
arm.set_max_acceleration_scaling_factor(0.5)
arm.set_max_velocity_scaling_factor(0.5)

设定关节目标允许的误差:1毫米(非常精确)。
最大加速度和最大速度分别缩小为50%,保证运动更平稳,不至于太快导致机械臂震动。

(5) 回到初始位置 “home”
arm.set_named_target('home')
arm.go()
rospy.sleep(1)

set_named_target(‘home’):设置一个预先定义好的姿态(home位)。
go():开始运动到目标。
rospy.sleep(1):等待一秒,确保动作完成后再继续。

(6) 设置具体关节角度目标
joint_positions = [0.391410, -0.676384, -0.376217, 0.0, 1.052834, 0.454125]
arm.set_joint_value_target(joint_positions)
arm.go()
rospy.sleep(1)

joint_positions 是一个长度为 6 的列表,对应机械臂6个关节的角度值(单位是弧度 rad)。

set_joint_value_target:将这些角度作为目标。

go():控制机械臂运动到新位置。

sleep(1):等1秒,等待完成。

(7) 再次回到 “home”
arm.set_named_target('home')
arm.go()
rospy.sleep(1)

和之前一样,运动回初始姿态。

(8) 退出清理
moveit_commander.roscpp_shutdown()
moveit_commander.os._exit(0)

roscpp_shutdown():释放资源,关闭 MoveIt。

os._exit(0):强制退出 Python 程序。

6、程序入口

if __name__ == "__main__":
try:
    MoveItFkDemo()
except rospy.ROSInterruptException:
    pass

if name == “main”:保证这段代码作为脚本直接运行时才执行。

try-except 捕捉 ROS 中断异常(比如按 Ctrl+C 退出时)。

核心流程:

初始化 MoveIt 和 ROS 节点

创建操作机械臂的接口

控制机械臂回到 home

控制机械臂移动到一个指定姿态

再回 home

释放资源退出

代码执行

roslaunch probot_anno_moveit_config demo.launch

image.png

rosrun probot_demo moveit_fk_demo.py

image.png

可以看见机械臂从home位置运动到目标位置后又回到home位置

二、逆向运动学

先解析一下需要运行的Python文件

moveit_ik_demo.py

1、文件头部

#!/usr/bin/env python3

指示操作系统使用 Python 3 来执行这个脚本。

2、导入必要的模块

import rospy, sys
import moveit_commander
from geometry_msgs.msg import PoseStamped, Pose

rospy:是 ROS 的 Python 库,用于编写 ROS 节点。

sys:Python 的系统模块,通常用来获取命令行参数等。

moveit_commander:MoveIt! 的 Python 接口库,用于控制机器人。

PoseStamped 和 Pose:geometry_msgs 中的消息类型,用于表示位姿(位置和姿态)。

3、MoveItIkDemo 类

class MoveItIkDemo:
def __init__(self):

定义了一个 MoveItIkDemo 类,用于示范 MoveIt! 逆向运动学(IK)控制。

4、初始化和设置 MoveIt! API

moveit_commander.roscpp_initialize(sys.argv)
rospy.init_node('moveit_ik_demo')

moveit_commander.roscpp_initialize(sys.argv):初始化 MoveIt! 的 C++ API。

rospy.init_node(‘moveit_ik_demo’):初始化一个名为 moveit_ik_demo 的 ROS 节点。

5、控制机械臂

arm = moveit_commander.MoveGroupCommander('manipulator')

MoveGroupCommander 用于控制一个指定的机器人组(在此为 manipulator)。manipulator 是一个 MoveIt! 配置中指定的组名称,表示机械臂的运动控制。

end_effector_link = arm.get_end_effector_link()

获取机械臂末端执行器(即末端工具)链接的名称。这个名称通常会用于设置末端执行器的目标位姿。

reference_frame = 'base_link'
arm.set_pose_reference_frame(reference_frame)

设置参考坐标系为 base_link,即机械臂的基座坐标系。

arm.allow_replanning(True)

允许在运动失败时进行重新规划。

arm.set_goal_position_tolerance(0.001)
arm.set_goal_orientation_tolerance(0.01)

设置目标位置和目标姿态的容差,单位分别是米和弧度。用于定义目标位置的误差范围。

arm.set_max_acceleration_scaling_factor(0.5)
arm.set_max_velocity_scaling_factor(0.5)

设置运动的最大加速度和最大速度的缩放因子。值越小,速度和加速度越慢。

6、机械臂到达初始化位置

arm.set_named_target('home')
arm.go()
rospy.sleep(1)

7、设置目标位姿并进行运动

target_pose = PoseStamped()
target_pose.header.frame_id = reference_frame
target_pose.header.stamp = rospy.Time.now()
target_pose.pose.position.x = 0.2593
target_pose.pose.position.y = 0.0636
target_pose.pose.position.z = 0.1787
target_pose.pose.orientation.x = 0.70692
target_pose.pose.orientation.y = 0.0
target_pose.pose.orientation.z = 0.0
target_pose.pose.orientation.w = 0.70729

创建目标位姿 target_pose,使用 PoseStamped 消息类型,其中 frame_id 设置为参考坐标系 base_link,并设置目标位置和姿态(使用四元数)。

arm.set_start_state_to_current_state()
arm.set_pose_target(target_pose, end_effector_link)

set_start_state_to_current_state():将机械臂的当前状态设置为起始状态。

set_pose_target(target_pose, end_effector_link):设置目标位姿为 target_pose,并指定末端执行器链接。

8、规划和执行运动

traj = arm.plan()
arm.execute(traj)
rospy.sleep(1)

arm.plan():计算从当前状态到目标状态的运动规划。

arm.execute(traj):执行计算出的运动轨迹。

9、回到初始化位置并退出

arm.set_named_target('home')
arm.go()
moveit_commander.roscpp_shutdown()
moveit_commander.os._exit(0)

10、程序入口

if __name__ == "__main__":
MoveItIkDemo()

这是 Python 中的标准入口点。当文件作为脚本执行时,将创建 MoveItIkDemo 类的实例,启动机械臂运动。

代码执行

roslaunch probot_anno_moveit_config demo.launch

image.png

rosrun probot_demo moveit_fk_demo.py

image.png

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。