diff --git a/src/lite6_controller/CMakeLists.txt b/src/lite6_controller/CMakeLists.txt index 5c26af6..05bf62b 100644 --- a/src/lite6_controller/CMakeLists.txt +++ b/src/lite6_controller/CMakeLists.txt @@ -16,6 +16,8 @@ find_package(moveit REQUIRED) find_package(pilz_industrial_motion_planner REQUIRED) find_package(moveit_msgs REQUIRED) find_package(geometry_msgs REQUIRED) +find_package(xarm_api REQUIRED) +find_package(xarm_msgs REQUIRED) find_package(tf2_ros REQUIRED) find_package(geometry_msgs REQUIRED) @@ -45,6 +47,18 @@ ament_target_dependencies(lite6_controller "moveit_ros_planning_interface" "robot_interfaces") +add_executable(lite6_calibration src/lite6_calibration.cpp) +ament_target_dependencies(lite6_calibration + "xarm_msgs" + "rclcpp" + "moveit" + "rclcpp_action" + "Eigen3" + "pilz_industrial_motion_planner" + "robot_controller" + "moveit_ros_planning_interface" + "robot_interfaces") + if(BUILD_TESTING) find_package(ament_lint_auto REQUIRED) ament_lint_auto_find_test_dependencies() @@ -52,6 +66,7 @@ endif() install(TARGETS lite6_controller + lite6_calibration DESTINATION lib/${PROJECT_NAME}) install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) diff --git a/src/lite6_controller/launch/lite6_real_calibration.launch.py b/src/lite6_controller/launch/lite6_real_calibration.launch.py new file mode 100644 index 0000000..a680e9f --- /dev/null +++ b/src/lite6_controller/launch/lite6_real_calibration.launch.py @@ -0,0 +1,126 @@ +import os +from launch import LaunchDescription +from launch.actions import OpaqueFunction, IncludeLaunchDescription, DeclareLaunchArgument +from launch.launch_description_sources import PythonLaunchDescriptionSource +from launch.substitutions import LaunchConfiguration, PathJoinSubstitution +from launch_ros.substitutions import FindPackageShare +from launch_ros.actions import Node + +from ament_index_python import get_package_share_directory +from launch.launch_description_sources import load_python_launch_file_as_module +from launch import LaunchDescription +from launch.actions import RegisterEventHandler, EmitEvent +from launch.event_handlers import OnProcessExit +from launch.events import Shutdown + + +def launch_setup(context, *args, **kwargs): + robot_ip = LaunchConfiguration('robot_ip', default='192.168.1.150') + report_type = LaunchConfiguration('report_type', default='normal') + prefix = LaunchConfiguration('prefix', default='') + hw_ns = LaunchConfiguration('hw_ns', default='ufactory') + limited = LaunchConfiguration('limited', default=True) + effort_control = LaunchConfiguration('effort_control', default=False) + velocity_control = LaunchConfiguration('velocity_control', default=False) + add_gripper = LaunchConfiguration('add_gripper', default=False) + add_vacuum_gripper = LaunchConfiguration('add_vacuum_gripper', default=False) + dof = LaunchConfiguration('dof', default=6) + robot_type = LaunchConfiguration('robot_type', default='lite') + no_gui_ctrl = LaunchConfiguration('no_gui_ctrl', default=False) + + add_other_geometry = LaunchConfiguration('add_other_geometry', default=False) + geometry_type = LaunchConfiguration('geometry_type', default='box') + geometry_mass = LaunchConfiguration('geometry_mass', default=0.1) + geometry_height = LaunchConfiguration('geometry_height', default=0.1) + geometry_radius = LaunchConfiguration('geometry_radius', default=0.1) + geometry_length = LaunchConfiguration('geometry_length', default=0.1) + geometry_width = LaunchConfiguration('geometry_width', default=0.1) + geometry_mesh_filename = LaunchConfiguration('geometry_mesh_filename', default='') + geometry_mesh_origin_xyz = LaunchConfiguration('geometry_mesh_origin_xyz', default='"0 0 0"') + geometry_mesh_origin_rpy = LaunchConfiguration('geometry_mesh_origin_rpy', default='"0 0 0"') + geometry_mesh_tcp_xyz = LaunchConfiguration('geometry_mesh_tcp_xyz', default='"0 0 0"') + geometry_mesh_tcp_rpy = LaunchConfiguration('geometry_mesh_tcp_rpy', default='"0 0 0"') + + baud_checkset = LaunchConfiguration('baud_checkset', default=True) + default_gripper_baud = LaunchConfiguration('default_gripper_baud', default=2000000) + + ros2_control_plugin = 'uf_robot_hardware/UFRobotSystemHardware' + controllers_name = LaunchConfiguration('controllers_name', default='controllers') + moveit_controller_manager_key = LaunchConfiguration('moveit_controller_manager_key', default='moveit_simple_controller_manager') + moveit_controller_manager_value = LaunchConfiguration('moveit_controller_manager_value', default='moveit_simple_controller_manager/MoveItSimpleControllerManager') + + xarm_type = '{}{}'.format(robot_type.perform(context), dof.perform(context)) + ros_namespace = LaunchConfiguration('ros_namespace', default='').perform(context) + + use_sim_time = LaunchConfiguration('use_sim_time', default=False) + log_level = LaunchConfiguration("log_level", default='warn') + + # robot_description_parameters + # xarm_moveit_config/launch/lib/robot_moveit_config_lib.py + moveit_config_package_name = 'custom_xarm_moveit_config' + mod = load_python_launch_file_as_module(os.path.join(get_package_share_directory(moveit_config_package_name), 'launch', 'lib', 'robot_moveit_config_lib.py')) + get_xarm_robot_description_parameters = getattr(mod, 'get_xarm_robot_description_parameters') + robot_description_parameters = get_xarm_robot_description_parameters( + xacro_urdf_file=PathJoinSubstitution([FindPackageShare('custom_xarm_description'), 'urdf', 'xarm_device.urdf.xacro']), + xacro_srdf_file=PathJoinSubstitution([FindPackageShare('custom_xarm_moveit_config'), 'srdf', 'xarm.srdf.xacro']), + urdf_arguments={ + 'prefix': prefix, + 'hw_ns': hw_ns.perform(context).strip('/'), + 'limited': limited, + 'effort_control': effort_control, + 'velocity_control': velocity_control, + 'add_gripper': add_gripper, + 'add_vacuum_gripper': add_vacuum_gripper, + 'dof': dof, + 'robot_type': robot_type, + 'ros2_control_plugin': ros2_control_plugin, + 'add_other_geometry': add_other_geometry, + 'geometry_type': geometry_type, + 'geometry_mass': geometry_mass, + 'geometry_height': geometry_height, + 'geometry_radius': geometry_radius, + 'geometry_length': geometry_length, + 'geometry_width': geometry_width, + 'geometry_mesh_filename': geometry_mesh_filename, + 'geometry_mesh_origin_xyz': geometry_mesh_origin_xyz, + 'geometry_mesh_origin_rpy': geometry_mesh_origin_rpy, + 'geometry_mesh_tcp_xyz': geometry_mesh_tcp_xyz, + 'geometry_mesh_tcp_rpy': geometry_mesh_tcp_rpy, + }, + srdf_arguments={ + 'prefix': prefix, + 'dof': dof, + 'robot_type': robot_type, + 'add_gripper': add_gripper, + 'add_vacuum_gripper': add_vacuum_gripper, + 'add_other_geometry': add_other_geometry, + }, + arguments={ + 'context': context, + 'xarm_type': xarm_type, + } + ) + calibration_node = Node( + package="lite6_controller", + executable="lite6_calibration", + output="screen", + arguments=["--ros-args", "--log-level", log_level], + parameters=[ + robot_description_parameters, + {"use_sim_time": use_sim_time}, + ], + ) + + return [ + RegisterEventHandler(event_handler=OnProcessExit( + target_action=calibration_node, + on_exit=[EmitEvent(event=Shutdown())] + )), + calibration_node + ] + + +def generate_launch_description(): + return LaunchDescription([ + OpaqueFunction(function=launch_setup) + ]) diff --git a/src/lite6_controller/package.xml b/src/lite6_controller/package.xml index 8b8d793..de24f32 100644 --- a/src/lite6_controller/package.xml +++ b/src/lite6_controller/package.xml @@ -15,6 +15,7 @@ moveit moveit_msgs + xarm_msgs geometry_msgs moveit_ros_planning_interface tf2_ros diff --git a/src/lite6_controller/src/lite6_calibration.cpp b/src/lite6_controller/src/lite6_calibration.cpp new file mode 100644 index 0000000..40d77c7 --- /dev/null +++ b/src/lite6_controller/src/lite6_calibration.cpp @@ -0,0 +1,128 @@ +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +//#include +//#include +//#include +#include +#include + +#include +#include + +#include +#include +#include +#include + + +#include +#include +#include +#include +#include +#include + + +#include +#include + +#include + +#include + +#include +#include + +const std::string MOVE_GROUP = "lite6"; + +using namespace std::chrono_literals; + +class Calibration : public rclcpp::Node +{ + public: + //moveit::planning_interface::MoveGroupInterface move_group; + + rclcpp::TimerBase::SharedPtr status_timer; + + rclcpp::Client::SharedPtr set_joint_client; + rclcpp::Client::SharedPtr get_joint_client; + + Calibration(const rclcpp::NodeOptions & options = rclcpp::NodeOptions()) + : Node("lite6_calibration",options) + //move_group(std::shared_ptr(std::move(this)), MOVE_GROUP) + { + //RCLCPP_INFO(this->get_logger(), "Starting state monitor"); + //move_group.startStateMonitor(30); + //RCLCPP_INFO(this->get_logger(), "Started state monitor"); + //move_group.setPlanningTime(30.0); + + //status_timer = this->create_wall_timer(5s, std::bind(&Calibration::getTree, this)); + + RCLCPP_ERROR(this->get_logger(), "create service client"); + set_joint_client = this->create_client("/ufactory/set_servo_angle"); + get_joint_client = this->create_client("/ufactory/get_servo_angle"); + //xarm_msgs::srv::MoveJoint + while (!set_joint_client->wait_for_service(1s)) { + RCLCPP_ERROR(this->get_logger(), "service not available, waiting again..."); + } + while (!get_joint_client->wait_for_service(1s)) { + RCLCPP_ERROR(this->get_logger(), "service not available, waiting again..."); + } + RCLCPP_ERROR(this->get_logger(), "Client ready"); + + //RCLCPP_ERROR(this->get_logger(), "create request"); + //auto request = std::make_shared(); + //RCLCPP_ERROR(this->get_logger(), "send request"); + //auto result = joint_client->async_send_request(request); + //RCLCPP_ERROR(this->get_logger(), "get request"); + //auto a = result.get()->message; + //RCLCPP_ERROR(this->get_logger(), "A:%s", a.c_str()); + + auto request = std::make_shared(); + RCLCPP_ERROR(this->get_logger(), ""); + auto result = get_joint_client->async_send_request(request); + auto msg = result.get()->message; + RCLCPP_ERROR(this->get_logger(), "A:%s", msg.c_str()); + + } + + void getTree() + { + //rclcpp::sleep_for(20s); + RCLCPP_INFO(this->get_logger(), "Getting robot state"); + //moveit::core::RobotStatePtr move_group_state = move_group.getCurrentState(30); + //RCLCPP_INFO(this->get_logger(), move_group_state->getStateTreeString().c_str()); + //RCLCPP_ERROR(this->get_logger(), "AAAAAAAAAA"); + } + +}; + +/** + * + */ +int main(int argc, char ** argv) +{ + rclcpp::init(argc, argv); + + + auto calibration = std::make_shared(); + + rclcpp::executors::MultiThreadedExecutor executor; + executor.add_node(calibration); + executor.spin(); + + rclcpp::shutdown(); + return EXIT_SUCCESS; +}