UR机械臂学习(7-2):MoveIt简单编程实现机械臂运动——一些参考代码和遇到的问题

创建功能包

cd ~/ur_ws/src

# 创建功能包 control_robot
catkin_create_pkg control_robot std_msgs rospy roscpp

roscd 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/22221

import rospy
import moveit_commander

rospy.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/106801986

import rospy, sys
import moveit_commander
from moveit_commander import MoveGroupCommander
from geometry_msgs.msg import Pose
from copy import deepcopy
 
class MoveItCartesianDemo:
    def __init__(self):
 
        # 初始化move_group的API
        moveit_commander.roscpp_initialize(sys.argv)
 
        # 初始化ROS节点
        rospy.init_node('moveit_cartesian_demo', anonymous=True)
 
        # 是否需要使用笛卡尔空间的运动规划,获取参数,如果没有设置,则默认为True,即走直线
        cartesian = rospy.get_param('~cartesian', True)
                      
        # 初始化需要使用move group控制的机械臂中的arm group
        arm = 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)
        
        # 关闭并退出moveit
        moveit_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.

在这里插入图片描述

问题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 COMPONENTS
  roscpp
  rospy
  std_msgs
  moveit_ros_planning_interface
  moveit_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.
  • 12
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
你可以使用ROS-Melodic和MoveIt来进行UR5机械臂的仿真控制。以下是一个基本的步骤: 1. 安装ROS-Melodic:请根据ROS官方文档的说明安装ROS-Melodic。确保你的系统满足所有的依赖项。 2. 安装MoveIt:在终端中运行以下命令来安装MoveIt: ``` sudo apt-get install ros-melodic-moveit ``` 3. 配置工作空间:创建一个新的工作空间,并将其初始化为ROS工作空间。例如,你可以运行以下命令: ``` mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make ``` 4. 下载UR5机械臂包:在终端中运行以下命令来下载UR5机械臂ROS软件包: ``` cd ~/catkin_ws/src git clone https://github.com/ros-industrial/universal_robot.git ``` 5. 下载MoveIt配置文件:在终端中运行以下命令来下载MoveIt配置文件: ``` cd ~/catkin_ws/src git clone https://github.com/ros-planning/moveit_resources.git ``` 6. 构建和编译:在终端中运行以下命令来构建和编译你的工作空间: ``` cd ~/catkin_ws/ catkin_make ``` 7. 启动仿真环境:在终端中运行以下命令来启动UR5机械臂的仿真环境: ``` roslaunch ur_gazebo ur5.launch ``` 8. 启动MoveIt RViz:在终端中运行以下命令来启动MoveIt RViz界面: ``` roslaunch ur5_moveit_config moveit_rviz.launch config:=true ``` 9. 进行控制:在RViz界面中,你可以使用MoveIt插件来规划和控制UR5机械臂运动。你可以设置目标位置、执行运动等。 这些是基本的步骤,可以帮助你开始使用ROS-Melodic和MoveIt进行UR5机械臂的仿真控制。你可以根据自己的需求进行进一步的定制和开发。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值