ROS2中使用MoveIt2精准操控Panda机械臂末端至固定位姿
创作时间:
作者:
@小白创作中心
ROS2中使用MoveIt2精准操控Panda机械臂末端至固定位姿
引用
CSDN
1.
https://m.blog.csdn.net/weixin_38428827/article/details/146029552
在机器人领域,精准控制机械臂末端执行器的位置和姿态是实现复杂任务的基础。ROS(机器人操作系统)和MoveIt2作为机器人开发的重要工具,提供了强大的运动规划和控制能力。本文将详细介绍如何在ROS2中使用MoveIt2精准操控Panda机械臂末端至固定位姿,帮助读者掌握这一关键技术。
创建ROS2包
首先,我们需要创建一个ROS2包,命名为panda_moveit_controller,并添加对moveit_ros_planning_interface的依赖。
ros2 pkg create --build-type ament_cmake panda_moveit_controller --dependencies rclcpp moveit_ros_planning_interface
编写控制代码
在~/ros2_ws/src/panda_moveit_controller/src目录下创建panda_moveit_control.cpp文件,编写控制代码如下:
#include <rclcpp/rclcpp.hpp>
#include <moveit/move_group_interface/move_group_interface.h>
#include <moveit/planning_scene_interface/planning_scene_interface.h>
#include <tf2/LinearMath/Quaternion.h>
#include <tf2_geometry_msgs/tf2_geometry_msgs.h>
#include <cmath>
// 定义一个将度数转换为弧度的函数
double degreesToRadians(double degrees) {
return degrees * M_PI / 180.0;
}
int main(int argc, char** argv)
{
rclcpp::init(argc, argv);
auto node = rclcpp::Node::make_shared("panda_moveit_control");
// 创建MoveGroupInterface对象,指定规划组名称
moveit::planning_interface::MoveGroupInterface move_group(node, "panda_arm");
// 创建PlanningSceneInterface对象
moveit::planning_interface::PlanningSceneInterface planning_scene_interface;
// 获取规划组的参考坐标系
std::string planning_frame = move_group.getPlanningFrame();
RCLCPP_INFO(node->get_logger(), "Planning frame: %s", planning_frame.c_str());
// 获取规划组的末端执行器名称
std::string end_effector_link = move_group.getEndEffectorLink();
RCLCPP_INFO(node->get_logger(), "End effector link: %s", end_effector_link.c_str());
// 设置目标位置
geometry_msgs::msg::Pose target_pose;
// 定义欧拉角(单位:弧度)
double roll = degreesToRadians(0.0);
double pitch = degreesToRadians(180.0);
double yaw = degreesToRadians(0.0);
// 创建一个四元数对象
tf2::Quaternion quaternion;
// 根据欧拉角设置四元数
quaternion.setRPY(roll, pitch, yaw);
// 将tf2的四元数转换为geometry_msgs的四元数
target_pose.orientation = tf2::toMsg(quaternion);
target_pose.position.x = 0.4;
target_pose.position.y = 0.1;
target_pose.position.z = 0.4;
move_group.setPoseTarget(target_pose);
// 进行运动规划
moveit::planning_interface::MoveGroupInterface::Plan my_plan;
bool success = (move_group.plan(my_plan) == moveit::core::MoveItErrorCode::SUCCESS);
RCLCPP_INFO(node->get_logger(), "Planning %s", success ? "SUCCEEDED" : "FAILED");
// 执行运动规划
if (success) {
move_group.execute(my_plan);
}
rclcpp::shutdown();
return 0;
}
修改CMakeLists.txt文件
在panda_moveit_controller包的根目录下修改CMakeLists.txt文件,添加对rclcpp和moveit_ros_planning_interface的依赖,并添加可执行文件。
cmake_minimum_required(VERSION 3.8)
project(panda_moveit_controller)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# 查找依赖项
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(moveit_ros_planning_interface REQUIRED)
# 添加可执行文件
add_executable(panda_moveit_control src/panda_moveit_control.cpp)
ament_target_dependencies(panda_moveit_control rclcpp moveit_ros_planning_interface)
# 安装可执行文件
install(TARGETS
panda_moveit_control
DESTINATION lib/${PROJECT_NAME}
)
ament_package()
编译运行
在两个终端分别执行以下命令:
- 启动Panda机械臂在Rviz中的场景
ros2 launch moveit2_tutorials demo.launch.py rviz_config:=panda_moveit_config_demo_empty.rviz
- 启动末端控制
cd ~/ros2_ws
colcon build --packages-select panda_moveit_controller
source install/setup.bash
ros2 run panda_moveit_controller panda_moveit_control
热门推荐
探秘中国世界遗产:旅游新体验
哪种原因导致大便发黑
手掌发黄怎么办?医生的专业解答来了
深度解读量化投资策略:从规则型到高频交易
每周吃1~6个鸡蛋能活到九十九:真相出乎意料
早餐鸡蛋的N种吃法
心脑清软胶囊成年人的安全剂量是多少
长期服用阿司匹林,这些检查不能忽视
遥望长安:历史长河中的古都长安及其影响
量子平行宇宙:从理论探索到哲学思考
汕头黄花山国家森林公园游玩攻略,体验南亚热带海洋性气候
河南周口:让优质便捷的医疗服务“触手可及”
如何处理废机油以保护环境?这种处理方法有哪些环保要求?
签订无固定期限劳动合同必看,你想知道的都在这里 丨劳动争议17
租房法律规定怎么保护承租人
上海租房必读:网签备案、合同签订与退房权益详解
生活中吃什么可以预防耳鸣?
三问三解之:汽车快充那些事
2025年公务员薪资排行:北京居首,深圳紧随其后
針灸治療糖尿病:中醫如何引領新趨勢?
强子变东哥!京东、美团给骑手上社保,饿了么要不要跟上?
中药雾化吸入治疗慢性喉炎的五种方法
为了吸引IP粉,这款SLG专门做了一整套角色扮演玩法
121亿元,全球票房榜前九!中国动画讲好“中国故事” 展现文化自信
痛风患者能吃排骨吗?医生给出专业解答
室内家装电路改造全攻略,帮你解决电路改造的难题
大气细颗粒物的体内旅程 | 大气细颗粒与人体健康
唐寅《山路松声图》欣赏
财务人员职业道德培训:强化职业操守
揭秘宇宙巨无霸黑洞TON618:660亿倍太阳质量,究竟如何诞生?