UR机械臂学习(7-2):MoveIt简单编程实现机械臂运动——一些参考代码和遇到的问题
创建功能包
cd ~/ur_ws/src# 创建功能包 control_robot
catkin_create_pkg control_robot std_msgs rospy roscpproscd control_robot# 新建scripts文件夹(用来放置python程序)
mkdir scripts# 新建.py文件
touch demo.py# 将.py文件变为可执行文件
sudo chmod +x talker.py
注意:
- python的程序执行前,要先设置为可执行文件
sudo chmod +x [文件名.py]
- 更重要的一点,在
.py
文件的第一行要有:
#!/usr/bin/env python
02 一些参考代码
2.1 代码1(python)
这个是可以正常使用
#!/usr/bin/env python# https://www.guyuehome.com/22221import rospy
import moveit_commanderrospy.init_node('grasp_object')
arm = moveit_commander.MoveGroupCommander("manipulator")
# grp = moveit_commander.MoveGroupCommander("gripper")# 表示方式1
arm.set_named_target('up')
arm.go(wait=True)# 表示方式2
arm.set_joint_value_target([-0.21957805043352518, -1.097296859939564, 1.8945345194815335,-2.366067038969164, -1.571228181260084, -1.0061550793898952])
arm.go(wait=True)# 表示方式3
pose = arm.get_current_pose().pose
pose.position.z -= 0.05
arm.set_pose_target(pose)
arm.go(wait=True)# 设置手抓
# grp.set_named_target('close')
# grp.go(wait=True)pose = arm.get_current_pose().pose
pose.position.z += 0.05
arm.set_pose_target(pose)
arm.go(wait=True)
2.2 代码2(python)
原代码rviz在不停的动,但是停止后不动,gazebo不动,说运动规划失败,所以做了修改
#!/usr/bin/env python
# -*- coding: utf-8 -*-# https://blog.csdn.net/weixin_45839124/article/details/106801986import rospy, sys
import moveit_commander
from moveit_commander import MoveGroupCommander
from geometry_msgs.msg import Pose
from copy import deepcopyclass MoveItCartesianDemo:def __init__(self):# 初始化move_group的APImoveit_commander.roscpp_initialize(sys.argv)# 初始化ROS节点rospy.init_node('moveit_cartesian_demo', anonymous=True)# 是否需要使用笛卡尔空间的运动规划,获取参数,如果没有设置,则默认为True,即走直线cartesian = rospy.get_param('~cartesian', True)# 初始化需要使用move group控制的机械臂中的arm grouparm = MoveGroupCommander('manipulator')# 当运动规划失败后,允许重新规划arm.allow_replanning(True)# 设置目标位置所使用的参考坐标系arm.set_pose_reference_frame('base_link')# 设置位置(单位:米)和姿态(单位:弧度)的允许误差arm.set_goal_position_tolerance(0.001)arm.set_goal_orientation_tolerance(0.001)# 设置允许的最大速度和加速度arm.set_max_acceleration_scaling_factor(0.5)arm.set_max_velocity_scaling_factor(0.5)# 获取终端link的名称end_effector_link = arm.get_end_effector_link()# 控制机械臂先回到初始化位置arm.set_named_target('home')arm.go()rospy.sleep(1)# 获取当前位姿数据为机械臂运动的起始位姿start_pose = arm.get_current_pose(end_effector_link).pose# 设置机器臂当前的状态作为运动初始状态arm.set_start_state_to_current_state()# 控制机械臂先回到预设位置arm.set_named_target('up')arm.go()rospy.sleep(1)# 关闭并退出moveitmoveit_commander.roscpp_shutdown()moveit_commander.os._exit(0)if __name__ == "__main__":try:MoveItCartesianDemo()except rospy.ROSInterruptException:pass
2.3 代码3(c++)
// https://blog.csdn.net/weixin_39312052/article/details/88130730
#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> int main(int argc, char **argv)
{ros::init(argc, argv, "movo_moveit");ros::NodeHandle node_handle; ros::AsyncSpinner spinner(1);spinner.start();moveit::planning_interface::MoveGroupInterface group("manipulator");//ur3对应moveit中选择的规划部分// 设置发送的数据,对应于moveit中的拖拽geometry_msgs::Pose target_pose1;target_pose1.orientation.x= 0.00196463;target_pose1.orientation.y = 0.7072;target_pose1.orientation.z = 0.707008;target_pose1.orientation.w = -0.00225032;target_pose1.position.x = 0.428326;target_pose1.position.y = 0.257828;target_pose1.position.z = 0.307195;group.setPoseTarget(target_pose1);group.setMaxVelocityScalingFactor(0.02);// 进行运动规划,计算机器人移动到目标的运动轨迹,对应moveit中的plan按钮moveit::planning_interface::MoveGroupInterface::Plan my_plan;bool success = group.plan(my_plan)== moveit::planning_interface::MoveItErrorCode::SUCCESS;;ROS_INFO("Visualizing plan 1 (pose goal) %s",success?"":"FAILED"); //让机械臂按照规划的轨迹开始运动,对应moveit中的execute。if(success)group.execute(my_plan);///第二个位置
geometry_msgs::Pose target_pose2;target_pose2.orientation.x= -0.00202662520084;target_pose2.orientation.y = -0.706992052889;target_pose2.orientation.z = -0.707215193629;target_pose2.orientation.w = 0.00219085420338;target_pose2.position.x =0.389998894713;target_pose2.position.y =0.31251544014;target_pose2.position.z = 0.361921853036;group.setPoseTarget(target_pose2);group.setMaxVelocityScalingFactor(0.02);// moveit::planning_interface::MoveGroupInterface::Plan my_plan;// 进行运动规划,计算机器人移动到目标的运动轨迹,对应moveit中的plan按钮moveit::planning_interface::MoveGroupInterface::Plan my_plan_1;
//bool success = (ptr_group->plan(my_plan_1) == moveit::planning_interface::MoveItErrorCode::SUCCESS;bool success1 = group.plan(my_plan_1)== moveit::planning_interface::MoveItErrorCode::SUCCESS;;ROS_INFO("Visualizing plan 1 (pose goal) %s",success?"":"FAILED"); //让机械臂按照规划的轨迹开始运动,对应moveit中的execute。if(success1)group.execute(my_plan_1);
// 第三个位置
geometry_msgs::Pose target_pose3;target_pose3.orientation.x= 0.00196463;target_pose3.orientation.y = 0.7072;target_pose3.orientation.z = 0.707008;target_pose3.orientation.w = -0.00225032;target_pose3.position.x = 0.428326;target_pose3.position.y = 0.257828;target_pose3.position.z = 0.307195;group.setPoseTarget(target_pose3);group.setMaxVelocityScalingFactor(0.01);// 进行运动规划,计算机器人移动到目标的运动轨迹,对应moveit中的plan按钮moveit::planning_interface::MoveGroupInterface::Plan my_plan_2;
//bool success = (ptr_group->plan(my_plan) == moveit::planning_interface::MoveItErrorCode::SUCCESS;bool success2 = group.plan(my_plan_2)== moveit::planning_interface::MoveItErrorCode::SUCCESS;;ROS_INFO("Visualizing plan 1 (pose goal) %s",success?"":"FAILED"); //让机械臂按照规划的轨迹开始运动,对应moveit中的execute。if(success2)group.execute(my_plan_2);ros::shutdown(); return 0;
}
每次修改后,都要catkin_make
运行
rosrun control_robot demo_node
03 报错及解决
问题1 /usr/bin/env: “python\r”: 没有那个文件或目录
guyue@guyue:~$ rosrun control_robot demo1.py
/usr/bin/env: "python\r": 没有那个文件或目录
解决:
这可能是因为这是在windows下创建的txt文件,然后另存为的.py文件。
可以像下面的链接一样修改,也可以touch新建一个.py文件,然后把原文件的东西复制进去。
参考:https://blog.csdn.net/qq_24894159/article/details/83957605
问题2 Kinematics solver doesn’t support
启动rviz的时候报错:
[ WARN] [1626783917.175885562, 69.111000000]: Kinematics solver doesn't support #attempts anymore, but only a timeout.
Please remove the parameter '/robot_description_kinematics/manipulator/kinematics_solver_attempts' from your configuration.
- 参考:https://github.com/ros-planning/moveit/issues/1642
这个一个弃用警告,忽略即可
问题3 Waiting for server
guyue@guyue:~$ rosrun control_robot demo.py
Waiting for server at /scaled_pos_joint_traj_controller/follow_joint_trajectory
[FATAL] [1626788950.130852, 875.302000]: Did not find trajectory server. Exiting.
guyue@guyue:~$ rosrun control_robot demo.py
Waiting for server at /pos_joint_traj_controller/follow_joint_trajectory
[FATAL] [1626789377.320829, 1301.956000]: Did not find trajectory server. Exiting.
问题4 The dependency target does not exist.
CMake Error at control_robot/CMakeLists.txt:155 (add_dependencies):The dependency target "control_robot_generate_messages_cpp" of target"movo_moveit" does not exist.
- 解决
修改CMakeList.txt,加入下面这些:
add_executable(demo_node src/demo.cpp)target_link_libraries(demo_node ${catkin_LIBRARIES})
问题5 moveit/move_group_interface/move_group.h: 没有那个文件或目录
在运行c++程序时报错
fatal error: moveit/move_group_interface/move_group.h: 没有那个文件或目录#include <moveit/move_group_interface/move_group.h>
- 解决
CmakeList.txt里:
find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmoveit_ros_planning_interfacemoveit_ros_move_group
)
cpp文件里
// #include <moveit/move_group_interface/move_group.h> 改为
#include <moveit/move_group_interface/move_group_interface.h>
问题6 ‘MoveGroup’ is not a member of ‘moveit::planning_interface’
在运行c++程序时报错
error: ‘MoveGroup’ is not a member of ‘moveit::planning_interface’
- 解决
// moveit::planning_interface::MoveGroup group("manipulator");//ur5对应moveit中选择的规划部分
// 改为
moveit::planning_interface::MoveGroupInterface group("manipulator");//ur5对应moveit中选择的规划部分
上面这么多错误,就是搜索,然后把所有的MoveGroup
改为MoveGroupInterface
问题7 No motion plan found. No execution attempted.
[ WARN] [1626940425.124303441, 78.920000000]: Fail: ABORTED: No motion plan found. No execution attempted.
- 换个位置即可
参考:https://blog.csdn.net/weixin_45462252/article/details/103856440
UR机械臂学习(7-2):MoveIt简单编程实现机械臂运动——一些参考代码和遇到的问题相关推荐
- Sawyer机械臂学习系列之Moveit!配置
Sawyer机械臂学习系列之Moveit!配置 前言 1.Sawyer SDK安装及配置 2.Moveit!安装 3.Sawyer机械臂Moveit!配置 4.查看配置结果 前言 1.Sawyer S ...
- UR机械臂学习(7-1):MoveIt简单编程实现机械臂运动(正逆运动学)
主要参考: MoveIt编程实现关节空间机械臂运动(正运动学) https://blog.csdn.net/zzu_seu/article/details/90611186 MoveIt编程实现关节空 ...
- UR机械臂学习(8):Python实现机械臂运动控制(不使用MoveIt)
以下是在gazebo仿真中使用,如果是控制真实机械臂,只需要修改订阅的话题即可 后期肯定会自己进行轨迹算法规划,用moveit的话想要更换算法太麻烦,所以尝试自己写程序不通过moveit来控制机械臂. ...
- UR机械臂学习(5-1):驱动真实机械臂准备工作——示教器配置
在使用Universal_Robots_ROS_Driver驱动真实机械臂前,需要在示教器上安装urcap 版本说明 使用的版本是 Ubuntu18.04 + ROS melodic + UR3(CB ...
- UR机械臂学习(5-2):使用Universal_Robots_ROS_Driver驱动真实机械臂
使用的版本是 Ubuntu18.04 + ROS melodic + UR3(CB3.12) 因为后续需要使用手控器,手控器的驱动需要在Ubuntu18.04下才可以使用. 这篇文章是电脑上的设置,关 ...
- UR机械臂仿真和用上位机编程控制
UR机械臂仿真和用上位机编程控制 在没有实物UR机械臂时怎么办,优傲提供了仿真工具可以满足开发者需求,这样也减少了实际操作机械臂时的麻烦. 需要下载和安装的软件 虚拟机 使用VMware是不错的选择, ...
- 使用 MoveIt 控制自己的真实机械臂【3】——优化轨迹发给真实机械臂执行
上一篇文章中,使用 MoveIt 控制自己的真实机械臂[2]--编写 action server 端代码,已经实现了 action server 端代码,并且拿到了 MoveIt 规划的轨迹数据.当然 ...
- 机械臂学习——舵机的速度控制、坐标变换、DH模型、正运动学解、逆运动学解
机械臂学习 文章目录 机械臂学习 前言 一.舵机的速度控制 1.舵机概述 2.代码实现 二.机械臂的坐标变换 1.坐标变换 2.坐标的几何概述 三.DH模型和正运动学解 四.逆运动学解 1.逆运动学几 ...
- 机械臂学习——标准DH法和改进MDH法建模法对比学习
D-H法机械臂建模 D-H建模方法是由D和H两个人提出的,是用于机器人运动学上的建模方法,该方法是在每个连杆上建立一个坐标系,通过齐次变换来实现两个连杆上的坐标变换. 通过依次的变换最终可以推导处末端 ...
最新文章
- 领域驱动设计门槛很高,没有深厚的面向对象编码能力很难实践成功
- 纯脚本搞掂DataGrid表表头不动,表身滚动
- python学习之路-第七天-python面向对象编程简介
- .NET Core Run On Docker By Kubernetes 系列文章汇总
- Springboot整合缓存
- pyinstaller下载_《快速掌握PyQt5》第二十五章 Pyinstaller打包
- 图像匹配得到精确的旋转角度
- C语言,函数调用使用方法
- matlab处理图像的报告,matlab图像处理的 毕业论文中期考核报告怎么写
- c语言中罗马字母数字,罗马数字转整数C语言实现
- js Tree(梅花雪)最简单的例子(来字MEIZZ)
- wordpress入门主题_设置和运行WordPress网站的终极入门指南
- 一文读懂什么是EPP、EDR、CWPP、HIDS及业内主流产品
- addon游戏_addon_game_mode游戏基本情况设置
- uni-app上传图片到腾讯云
- oracle是ascii码,ascii码chr(9),chr(10),chr(13)在oracle中的用法
- Java实现多重继承
- 如何将Word转化为Markdown文本
- Linux系统设置命令大全
- sr550服务器配置硬盘,【联想SR550配置】联想SR5502颗服务器配置-ZOL中关村在线
热门文章
- Python画箱型图之seaborn
- html二级域名,免费二级域名申请
- Java基础二十二:函数式接口介绍,函数式接口作为方法参数、返回值,Supplier接口、Consumer接口、Predicate接口、Function接口基本介绍及其案例小练习
- 高通410随身WiFi之格行SP970系列刷机教程
- 装了激光雷达的iPad Pro,还能用鼠标了:苹果新键盘、新iPad Pro、新MacBook Air来了
- python输入随机的口算算式_小学生家长的福利来啦--利用EXCEL随机生成口算题目...
- 一、Echarts图表之X轴(xAxios)与Y轴(yAxios)配置项大全
- 【问题】yocto学习:ERROR: Execution of event handler ‘sstate_eventhandler2‘ failed
- fairmot_example
- Kinect DK相机与Realsense D435i相机记录