Moveit!学习笔记 - Move Group(Python接口)

Moveit! Python接口教程
本文详细介绍如何使用Moveit!的Python接口控制机器人执行常见任务,包括设置关节目标、规划路径、添加和移除环境中的对象等。适用于希望快速上手Moveit!的初学者。


类比于C++的MoveGroupInterface,MoveIt也提供了相应接口的Python封装。可以编写.py程序控制机器人的常用基本操作:

  • 设置关节或姿势目
  • 创建运动规划
  • 移动机器人
  • 向环境中添加对象
  • 从robot上附加/分离对象

1.启动RViz和MoveGroup节点

启动 panda 机械臂 Moveit 主程序:

cd ws_moveit
roslaunch panda_moveit_config demo.launch

在另一个终端运行 python 脚本:

rosrun moveit_tutorials move_group_python_interface_tutorial.py

2.期望输出

在shell终端中按enter

  • robot计划并移动它的arm到关节目标。
  • robot规划一条路径到达一个姿态目标。
  • robot规划一条笛卡尔坐标路径。
  • robot再次显示笛卡尔路径规划。
  • robot执行笛卡尔路径规划。
  • 一个方框出现在Panda末端执行器的位置。
  • box更改颜色以表示它现在已被附加。
  • robot计划并执行一个附加盒子的笛卡尔路径。
  • box再次更改颜色以表示它现在已被分离。
  • box消失。

3.代码理解

使用Python MoveIt!接口,将导入moveit_commander命名空间。该命名空间提供了

  • MoveGroupCommander类
  • PlanningSceneInterface类
  • RobotCommander类

也导入rospy和一些使用的信息:

import sys
import copy
import rospy
import moveit_commander
import moveit_msgs.msg
import geometry_msgs.msg
from math import pi
from std_msgs.msg import String
from moveit_commander.conversions import pose_to_list

首先初始化moveit_commander和rospy节点:

    moveit_commander.roscpp_initialize(sys.argv)
    rospy.init_node('move_group_python_interface_tutorial',
                    anonymous=True)

实例化RobotCommander对象,RobotCommander是针对整个机器人的控制:

    robot = moveit_commander.RobotCommander()

创建一个PlanningSceneInterface的对象。PlanningSceneInterface是用于和机器人环境的交互(如添加物体是会用到):

    scene = moveit_commander.PlanningSceneInterface()

实例化MoveGroupCommander对象。这个对象是一组关节的接口。在本例中,组是Panda手臂中的关节,因此设置group_name = panda_arm。如果使用的是不同的机器人,应该将此值更改为robot手臂planning group的名称。这个界面可以用来规划和执行Panda的运动:

    group_name = "panda_arm"
    group = moveit_commander.MoveGroupCommander(group_name)

创建一个Publisher,发布的类型是DisplayTrajectory,用于rivz显示:

    display_trajectory_publisher = rospy.Publisher('/move_group/display_planned_path',
                                                   moveit_msgs.msg.DisplayTrajectory,
                                                   queue_size=20)

3.1 Getting Basic Information

打印一些基本的信息:

    # We can get the name of the reference frame for this robot:
    planning_frame = group.get_planning_frame()
    print "============ Reference frame: %s" % planning_frame

    # We can also print the name of the end-effector link for this group:
    eef_link = group.get_end_effector_link()
    print "============ End effector: %s" % eef_link

    # We can get a list of all the groups in the robot:
  
要通过 **MoveIt!** 控制 **TR-Arm(一个机械臂)** 实现路径规划,你需要完成一系列 ROS(Robot Operating System)相关的配置和编程工作。下面我将详细说明整个流程,并提供示例代码。 --- ## ✅ 系统要求 - Ubuntu 20.04 / 22.04 - ROS Noetic / ROS2 Humble(本例以 ROS Noetic 为例) - MoveIt! - TR-Arm URDF 模型 - Gazebo(可选用于仿真) --- ## ✅ 步骤概览 1. 创建或获取 TR-Arm 的 URDF 模型 2. 使用 MoveIt Setup Assistant 配置 MoveIt 包 3. 启动 MoveIt 和 RViz 进行可视化 4. 编写 ROS 节点实现路径规划 --- ## ✅ Step-by-step 操作指南 ### 📌 Step 1: 获取或创建 TR-Arm 的 URDF 模型 确保你有一个完整的 URDF 文件描述 TR-Arm,例如 `tr_arm.urdf` 或 `tr_arm.xacro`。通常结构如下: ``` tr_arm_description/ ├── urdf/ │ └── tr_arm.urdf ├── meshes/ └── launch/ └── display.launch ``` 你可以使用 `xacro` 宏文件来简化建模。 --- ### 📌 Step 2: 使用 MoveIt Setup Assistant 配置 MoveIt 包 ```bash sudo apt-get install ros-noetic-moveit-setup-assistant ``` 运行助手并导入你的 URDF 模型: ```bash roslaunch moveit_setup_assistant setup_assistant.launch ``` 在 GUI 中完成以下步骤: 1. 导入 URDF 模型 2. 自动识别运动链(Kinematic Chain) 3. 设置虚拟关节(如 base_link -> world) 4. 添加自碰撞矩阵(Self-Collisions) 5. 生成配置包 最终会生成一个名为 `tr_arm_moveit_config` 的包。 --- ### 📌 Step 3: 启动 MoveIt 并进行路径规划测试 #### 启动 MoveIt 与 RViz: ```bash roslaunch tr_arm_moveit_config demo.launch ``` 你会看到 RViz 显示 TR-Arm 模型,并可以手动拖动目标位姿进行路径规划。 --- ### 📌 Step 4: 编写 ROS 节点进行自动路径规划 以下是使用 MoveIt C++ API 控制 TR-Arm 实现路径规划的示例代码: #### 示例代码:`plan_arm_motion.cpp` ```cpp #include <moveit/move_group_interface/move_group_interface.h> #include <moveit/planning_scene_interface/planning_scene_interface.h> #include <moveit_msgs/DisplayRobotState.h> #include <moveit_msgs/DisplayTrajectory.h> #include <moveit_msgs/AttachedCollisionObject.h> #include <moveit_msgs/CollisionObject.h> #include <moveit_visual_tools/moveit_visual_tools.h> int main(int argc, char** argv) { ros::init(argc, argv, "tr_arm_move_group"); ros::NodeHandle node_handle; ros::AsyncSpinner spinner(1); spinner.start(); // 设置规划组名称,需与 SRDF 中一致 static const std::string PLANNING_GROUP = "arm"; // 创建 MoveGroupInterface 对象 moveit::planning_interface::MoveGroupInterface move_group(PLANNING_GROUP); // 获取当前位姿 geometry_msgs::Pose target_pose = move_group.getCurrentPose().pose; // 设置目标位姿(示例中只改变 z 坐标) target_pose.position.z += 0.1; // 设置目标位姿 move_group.setPoseTarget(target_pose); // 调用规划器 moveit::planning_interface::MoveGroupInterface::Plan my_plan; bool success = (move_group.plan(my_plan) == moveit::planning_interface::MoveItErrorCode::SUCCESS); ROS_INFO("Visualizing plan %s", success ? "SUCCEEDED" : "FAILED"); if (success) { // 执行轨迹 move_group.execute(my_plan); } ros::shutdown(); return 0; } ``` #### 在 `CMakeLists.txt` 中添加编译规则: ```cmake add_executable(plan_arm_motion src/plan_arm_motion.cpp) target_link_libraries(plan_arm_motion ${catkin_LIBRARIES}) ``` #### 编译并运行: ```bash catkin_make source devel/setup.bash rosrun your_package_name plan_arm_motion ``` --- ## ✅ 注意事项 - 确保 TR-Arm 的关节名、规划组名与 MoveIt 配置一致。 - 如果你在真实硬件上控制,请将 MoveIt 与控制器接口连接(如 `controller_manager`)。 - 可以通过 `Rviz` 设置目标姿态,然后调用 `getCurrentPose()` 获取目标值。 - 如需避障,可在 `planning_scene` 中添加障碍物。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值