ROS试炼——UR5机器人配置、通讯、RVIZ-moveit控制、C++调用moveit控制
*注:配置:Ubuntu16.04+ROS kinetic
1.创建工作空间
$mkdir -p catkin_ws/src
进入到catkin_ws目录下,执行如下命令:
$catkin_make
*这个命令用于构建该工作空间,在catkin_ws路径下使用catkin_make命令
$source devel/setup.bash
*该命令是在catkin_ws目录下执行的,意思是把catkin_ws/devel目录下的setup.bash文件挂载到ROS的文件系统里去,这样当用户执行一些文件系统的命令时,就不会提示找不到
2.创建功能包
*功能包是一个存在于工作空间catkin_ws目录src目录下的一个目录,这个目录中包含一些文件或者目录,一个功能包必须以下几部分组成:
(1) 必须包括一个package.xml文件;
(2) 必须包括一个CMakeLists.txt文件。
*首先进入到目录catkin_ws/src目录下,创建一个名字为demo的功能包,它直接依赖于三个功能包:std_msgs,rospy以及roscpp,使用如下命令:
$catkin_create_pkg demo std_msgs rospy roscpp
使用rospack命令来查看功能包之间的依赖关系(使用rospack命令的前提是已经安装了该命令) 查看直接依赖关系:
$rospack depends1 demo
功能包创建好后,在工作空间catkin_ws路径下用catkin_make编译功能包,如果不出错,则功能包创建成功。
$catkin_make
该部分内容参考链接:创建工作空间及功能包
*********以上内容为创建工作空间前期准备,UR机器人的安装与编译,在此工作空间下调试
3.安装UR5相关的各种包
注:需要提前安装moveit,否则功能包编译不成功;执行如下命令
$sudo apt-get update
$sudo apt-get install ros-indigo-moveit-full
第二行代码如果执行不成功,则执行下面的代码
$sudo apt-get install ros-indigo-moveit*
(1) cd ~/catkin_ws/src (将路径定位在工作空间的src路径下)
(2) git clone -b kinetic-devel https://github.com/ros-industrial/universal_robot.git
( 下载universal_robot功能包, 备注:如果你的ROS系统版本不是kinetic,请将上面代码的kinetic换成相应的版本)
(3) cd ~/catkin_ws (定位到catkin_ws路径下)
(4) rosdep install --from-paths src --ignore-src --rosdistro indigo
(???什么意思???备注:同样的,如果你的ROS系统版本不是indigo,请将上面代码的indigo 换成相应的版本)
(5) catkin_make
( 6) source devel/setup.bash
4.ur_modern_driver驱动安装
虽然第二步中universal_robot文件夹下已经包含了ur_driver但这个驱动只支持比较早的UR5机械臂控制器的版本,换句话说,ur_modern_driver更适合(如果你的UR5本体的控制箱的软件版本是3.0以上)
具体的步骤:
(1)删除catkin_ws/src/universal_robot这个目录下的ur_driver文件夹,
(2)然后下载ur_modern_driver (可以直接下载,然后复制到universal_robot文件夹下,或者使用命令下载,如3.2步中方式)
(3)再解压,粘贴到原来的ur_driver这个文件夹的位置(把文件名更改为ur_modern_driver)。
(4)接着cd ~/catkin_ws
(5)最后catkin_make
**************************************编译过程中,出现错误,采用如下方法纠正
打开文件ur_hardware_interface.cpp;将 if (controller_it->hardware_interface) 改为 if (controller_it->type);即hardware_interface变为type;controller_it->hardware_interface.c_str()变为type.c_str(); if (stop_controller_it->hardware_interface) 改为 if (stop_controller_it->type);具体数量大概是12个。
5.UR5本体实物通信测试
首先打开进入Ubuntu系统打开一个新的终端
(1) cd ~/catkin_ws
(2) source devel/setup.bash
(3) roslaunch ur_modern_driver ur5_bringup.launch limited:=true robot_ip:=
IP_OF_THE_ROBOT [reverse_port:=REVERSE_PORT]
(备注:如果机器人通过网线与PC端相连接,IP_OF_THE_ROBOT需要替换成UR5机械臂本体(示教器中机器人网络设置)中的静态地址这种情况下保证机器人与PC在同一个网段下,即机器人与PC的IP地址只有最后一个小数点后的数不同,PC端的IP设置为有线连接,通过设置中的网络进行IP设置。若果机器人通过路由器与PC端相连接,IP_OF_THE_ROBOT需要替换成UR5机械臂本体的DHCP)
(4) roslaunch ur5_moveit_config ur5_moveit_planning_execution.launch limited:=true
(备注:执行(4)之前开新的终端,先执行(2)再执行(4),不然可能会报错。)
(5).roslaunch ur5_moveit_config moveit_rviz.launch config:=true
(备注,开新的终端,先执行4中的(2)再执行(5),不然可能会报错)
如果一切正常, 你就会看到RVIZ中的UR5机械臂和实物的状态是一致的,拖动UR5机械臂实物,在RVIZ里的机械臂也会跟着运动。此时,你可以在RVIZ中用鼠标拖动机械臂到达目标位置,在planing下点击plan,如果路径规划成功即可点击execute,你就会看到UR5实物也会跟着运动到目标点。界面中可以调节机械臂运行速度。
这部分内容参考链接UR机器人通讯与控制
6.C++调用moveit控制UR5机器人运动
1.首先,创建一个新的功能包,来放置我们的代码:
$catkin_create_pkg puncture_demo catkin cmake_modules interactive_markers moveit_core moveit_ros_perception moveit_ros_planning_interface pluginlib roscpp std_msgs
2.在创建的功能包下创建puncture_demo.cpp文件;代码如下:
//punture_demo.cpp #include <moveit/move_group_interface/move_group.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::MoveGroup group("manipulator");//ur5对应moveit中选择的规划部分 // 设置发送的数据,对应于moveit中的拖拽 geometry_msgs::Pose target_pose1; target_pose1.orientation.x= -0.1993; target_pose1.orientation.y = 0.3054; target_pose1.orientation.z = -0.2284; target_pose1.orientation.w = 0.902; target_pose1.position.x = -0.2004; target_pose1.position.y = -1.0177; target_pose1.position.z = 1.56930; group.setPoseTarget(target_pose1); group.setMaxVelocityScalingFactor(0.02); // 进行运动规划,计算机器人移动到目标的运动轨迹,对应moveit中的plan按钮 moveit::planning_interface::MoveGroup::Plan my_plan; //bool success = (ptr_group->plan(my_plan) == moveit::planning_interface::MoveItErrorCode::SUCCESS; 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.1993; target_pose2.orientation.y = 0.3054; target_pose2.orientation.z = -0.2284; target_pose2.orientation.w = 0.902; target_pose2.position.x = 0.096; target_pose2.position.y = -0.9618; target_pose2.position.z = 1.934; group.setPoseTarget(target_pose2); group.setMaxVelocityScalingFactor(0.02); // moveit::planning_interface::MoveGroup::Plan my_plan; // 进行运动规划,计算机器人移动到目标的运动轨迹,对应moveit中的plan按钮 moveit::planning_interface::MoveGroup::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.1993; target_pose3.orientation.y = 0.3054; target_pose3.orientation.z = -0.2284; target_pose3.orientation.w = 0.902; target_pose3.position.x = 0.1219; target_pose3.position.y = -0.9801; target_pose3.position.z = 1.9163; group.setPoseTarget(target_pose3); group.setMaxVelocityScalingFactor(0.01); // 进行运动规划,计算机器人移动到目标的运动轨迹,对应moveit中的plan按钮 moveit::planning_interface::MoveGroup::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; }
注:程序控制机器人运动三个位置,分别为 target_pose1、 target_pose2、 target_pose3;三段程序相同,对应的my_plan、my_plan_1、my_plan_2;success也需要修改。
3.更改puncture_demo功能包下的CMakeLists.txt文件
将如下代码添加到下面:
add_executable(puncture_demo src/puncture_demo.cpp) target_link_libraries(puncture_demo ${catkin_LIBRARIES} )
×××××××××××××××××××××××程序运行时出现错误××××××××××××××××××××××
参考如下进行调试:
错误及改正方法
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
编译程序
在工作空间catkin_ws下编译功能包:catkin_make
编译成功会在catkin_ws/devel/lib/puncture_demo/文件夹下出现执行文件puncture_demo文件
执行如下命令即可控制机器人运动:
$rosrun puncture_demo puncture_demo
注:机器人执行过程中,打开新终端,执行第5步的过程
7.机器人环境配置
机器人运行过程中,需要重新配置环境:机器人没有安装在地面上,需更改机器人环境配置文件
找到catkin_ws/src/universal_robot-kinetic-devel/ur_description/urdf/ur5_joint_limited_robot.urdf.xacro文件
修改代码如下:
<?xml version="1.0"?> <robot xmlns:xacro="http://wiki.ros.org/xacro" name="ur5" > <!-- common stuff --> <xacro:include filename="$(find ur_description)/urdf/common.gazebo.xacro" /> <!-- ur5 --> <xacro:include filename="$(find ur_description)/urdf/ur5.urdf.xacro" /> <!-- arm --> <xacro:ur5_robot prefix="" joint_limited="true" shoulder_pan_lower_limit="${-pi}" shoulder_pan_upper_limit="${pi}" shoulder_lift_lower_limit="${-pi}" shoulder_lift_upper_limit="${pi}" elbow_joint_lower_limit="${-pi}" elbow_joint_upper_limit="${pi}" wrist_1_lower_limit="${-pi}" wrist_1_upper_limit="${pi}" wrist_2_lower_limit="${-pi}" wrist_2_upper_limit="${pi}" wrist_3_lower_limit="${-pi}" wrist_3_upper_limit="${pi}" /> <link name="world" /> <joint name="world_joint" type="fixed"> <parent link="world" /> <child link = "base_link" /> <origin xyz="0 -0.242 1.428" rpy="${pi*0.75} 0 0" /> </joint> </robot>
相对于源文件,添加了
<link name="world" /> <joint name="world_joint" type="fixed"> <parent link="world" /> <child link = "base_link" /> <origin xyz="0 -0.242 1.428" rpy="${pi*0.75} 0 0" /> </joint>
- ROS下通过MoveIt控制UR5机器人的运动
- CICS通讯java应用调用服务的CTG Client配置
- 机器人控制程序的配置问题
- ROS分布式控制的节点配置
- ROS(indigo)MoveIt!控制ABB RobotStudio 5.6x 6.0x中机器人运动
- 配置底盘机器人与笔记本通讯中遇到的问题
- 【笔记】ROSjava-android控制ROS机器人——ROSjava消息发送的解密
- ros下机器人自主定位服务的调用
- 浅谈机器人控制与仿真设计----RDS和ROS
- ROS下如何调用USB摄像头在rviz显示(核心:权限问题)?
- 在Virtualbox虚拟机中配置使用ROS Spark机器人(Orbbec Astra 和 Xtion)
- ROS机器人操作系统的安装、配置与初级教程 1
- ROS 位置反馈控制机器人
- ROS中新建机器人模型(.xacro)并用rviz显示
- Rossum--ROSjava-android控制ROS机器人
- ROS::用摇杆控制你的机器人(准备篇)
- VC++调用phantom控件控制RCX机器人
- ROS之游戏手柄控制乌龟和机器人
- (二)ROS中控制机器人运动(示例运行)__新的适合自己的进步切入点,跟风榜样
- 浅谈机器人控制与仿真设计----RDS和ROS