diff --git a/CMakeLists.txt b/CMakeLists.txt index 514d5d19b38b46f1c27c4b03a124c51b9b29ed06..34853ede58325647eea1682af6090fe21159515a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ find_package(catkin REQUIRED) # ******************************************************************** # Add catkin additional components here # ******************************************************************** -find_package(catkin REQUIRED COMPONENTS iri_base_driver move_base_msgs actionlib tf2) +find_package(catkin REQUIRED COMPONENTS iri_base_driver moby_msgs roscpp move_base_msgs actionlib tf2) ## System dependencies are found with CMake's conventions # find_package(Boost REQUIRED COMPONENTS system) @@ -63,7 +63,7 @@ catkin_package( # ******************************************************************** # Add ROS and IRI ROS run time dependencies # ******************************************************************** - CATKIN_DEPENDS iri_base_driver move_base_msgs actionlib tf2 + CATKIN_DEPENDS iri_base_driver moby_msgs roscpp move_base_msgs actionlib tf2 # ******************************************************************** # Add system and labrobotica run time dependencies here # ******************************************************************** @@ -101,6 +101,8 @@ target_link_libraries(${PROJECT_NAME} ${iriutils_LIBRARIES}) # Add message headers dependencies # ******************************************************************** # add_dependencies(${PROJECT_NAME} <msg_package_name>_generate_messages_cpp) +add_dependencies(${PROJECT_NAME} moby_msgs_generate_messages_cpp) +add_dependencies(${PROJECT_NAME} roscpp_generate_messages_cpp) add_dependencies(${PROJECT_NAME} mbf_msgs_generate_messages_cpp) add_dependencies(${PROJECT_NAME} iri_base_driver_generate_messages_cpp) add_dependencies(${PROJECT_NAME}_gencfg iri_base_driver_generate_messages_py) diff --git a/README.md b/README.md index 46e7b1ca6924c6100de0bb79f0a0b19f4d7f15fe..f3db8f517d70b5b42fec729d032e20f08933dc4b 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,9 @@ The looming_modbus project description # ROS Interface +### Service clients + - ~**mode_change** (moby_msgs/ModeChange.srv) + - ~**clear_costmaps** (roscpp/Empty.srv) ### Action clients - ~**move_base** (mbf_msgs/MoveBase.action) diff --git a/include/looming_modbus_driver_node.h b/include/looming_modbus_driver_node.h index bf34477f1bd80d334fdab742385504a0038a0c3e..960af72b635ff60d2ffc8515b19090cbe9f2ab94 100644 --- a/include/looming_modbus_driver_node.h +++ b/include/looming_modbus_driver_node.h @@ -31,6 +31,8 @@ // [publisher subscriber headers] // [service client headers] +#include <moby_msgs/ModeChange.h> +#include <roscpp/Empty.h> // [action server client headers] #include <actionlib/client/simple_action_client.h> @@ -64,6 +66,12 @@ class LoomingModbusDriverNode : public iri_base_driver::IriBaseNodeDriver<Loomin // [service attributes] // [client attributes] + ros::ServiceClient mode_change_client_; + moby_msgs::ModeChange mode_change_srv_; + + ros::ServiceClient clear_costmaps_client_; + roscpp::Empty clear_costmaps_srv_; + // [action server attributes] diff --git a/launch/node.launch b/launch/node.launch index 83eb3d94504e9ebbe4dda19784be98c7e3838787..89e57bb0a839c0d44b6083a9b6de93b52b9db1e2 100644 --- a/launch/node.launch +++ b/launch/node.launch @@ -1,11 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> <launch> - <arg name="node_name" default="looming_modbus"/> - <arg name="output" default="screen"/> - <arg name="launch_prefix" default=""/> - <arg name="config_file" default="$(find looming_modbus)/config/params.yaml"/> - <arg name="move_base_action" default="~move_base"/> + <arg name="node_name" default="looming_modbus"/> + <arg name="output" default="screen"/> + <arg name="launch_prefix" default=""/> + <arg name="config_file" default="$(find looming_modbus)/config/params.yaml"/> + <arg name="move_base_action" default="~move_base"/> + <arg name="mode_change_service" default="~mode_change"/> + <arg name="clear_costmaps_service" default="~clear_costmaps"/> <node name="$(arg node_name)" pkg ="looming_modbus" @@ -14,6 +16,8 @@ launch-prefix="$(arg launch_prefix)"> <rosparam file="$(arg config_file)" command="load"/> <remap from="~/move_base" to="$(arg move_base_action)"/> + <remap from="~mode_change" to="$(arg mode_change_service)"/> + <remap from="~clear_costmaps" to="$(arg clear_costmaps_service)"/> </node> </launch> diff --git a/launch/test.launch b/launch/test.launch index 26c1188f61dc0fff1ccb7ae87b6823aca2b35d3a..81d61328df3963b1f2a2381935251e2ea0e177b2 100644 --- a/launch/test.launch +++ b/launch/test.launch @@ -1,19 +1,22 @@ <?xml version="1.0" encoding="UTF-8"?> <launch> - <arg name="output" default="screen"/> - <arg name="launch_prefix" default=""/> - <arg name="dr" default="true"/> - <arg name="config_file" default="$(find looming_modbus)/config/params.yaml"/> - <arg name="move_base_action" default="~move_base"/> - + <arg name="output" default="screen"/> + <arg name="launch_prefix" default=""/> + <arg name="dr" default="true"/> + <arg name="config_file" default="$(find looming_modbus)/config/params.yaml"/> + <arg name="move_base_action" default="~move_base"/> + <arg name="mode_change_service" default="~mode_change"/> + <arg name="clear_costmaps_service" default="~clear_costmaps"/> <include file="$(find looming_modbus)/launch/node.launch"> - <arg name="node_name" value="looming_modbus"/> - <arg name="output" value="$(arg output)"/> - <arg name="launch_prefix" value="$(arg launch_prefix)"/> - <arg name="config_file" value="$(arg config_file)"/> - <arg name="move_base_action" value="$(arg move_base_action)"/> + <arg name="node_name" value="looming_modbus"/> + <arg name="output" value="$(arg output)"/> + <arg name="launch_prefix" value="$(arg launch_prefix)"/> + <arg name="config_file" value="$(arg config_file)"/> + <arg name="move_base_action" value="$(arg move_base_action)"/> + <arg name="mode_change_service" value="$(arg mode_change_service)"/> + <arg name="clear_costmaps_service" value="$(arg clear_costmaps_service)"/> </include> <!-- diff --git a/package.xml b/package.xml index 6c0a9d608412a0114aa3d000c25e8078c2322c56..42eed8b8cf93983aabca905a349de11383d62a89 100644 --- a/package.xml +++ b/package.xml @@ -52,6 +52,8 @@ <build_depend>iri_base_driver</build_depend> <build_export_depend>iri_base_driver</build_export_depend> <exec_depend>iri_base_driver</exec_depend> + <depend>moby_msgs</depend> + <depend>roscpp</depend> <depend>move_base_msgs</depend> <depend>actionlib</depend> <depend>tf2</depend> diff --git a/src/looming_modbus_driver.cpp b/src/looming_modbus_driver.cpp index 506a3117a7f8d43475c1c4468d2f4c29d57bca24..c98921ff3bfb89bb7bc247c5b81fae6d068b9d47 100644 --- a/src/looming_modbus_driver.cpp +++ b/src/looming_modbus_driver.cpp @@ -33,7 +33,7 @@ bool LoomingModbusDriver::openDriver(void) if(this->context!=NULL) { // create the mapping - this->mapping = modbus_mapping_new(5,2,sizeof(float)*1.5,sizeof(float)*1.5); + this->mapping = modbus_mapping_new(2,5,sizeof(float)*1.5,sizeof(float)*1.5); if(this->mapping==NULL) { ROS_WARN_STREAM("Impossible to create modbus mapping: " << modbus_strerror(errno)); @@ -210,9 +210,9 @@ void LoomingModbusDriver::set_ready(bool status) { this->access.enter(); if(status) - this->mapping->tab_bits[READY_REG]=0x01; + this->mapping->tab_input_bits[READY_REG]=0x01; else - this->mapping->tab_bits[READY_REG]=0x00; + this->mapping->tab_input_bits[READY_REG]=0x00; this->access.exit(); } } @@ -223,9 +223,9 @@ void LoomingModbusDriver::set_navigating(bool status) { this->access.enter(); if(status) - this->mapping->tab_bits[NAVIGATING_REG]=0x01; + this->mapping->tab_input_bits[NAVIGATING_REG]=0x01; else - this->mapping->tab_bits[NAVIGATING_REG]=0x00; + this->mapping->tab_input_bits[NAVIGATING_REG]=0x00; this->access.exit(); } } @@ -236,9 +236,9 @@ void LoomingModbusDriver::set_success(bool status) { this->access.enter(); if(status) - this->mapping->tab_bits[SUCCESS_REG]=0x01; + this->mapping->tab_input_bits[SUCCESS_REG]=0x01; else - this->mapping->tab_bits[SUCCESS_REG]=0x00; + this->mapping->tab_input_bits[SUCCESS_REG]=0x00; this->access.exit(); } } @@ -249,9 +249,9 @@ void LoomingModbusDriver::set_canceled(bool status) { this->access.enter(); if(status) - this->mapping->tab_bits[CANCELLED_REG]=0x01; + this->mapping->tab_input_bits[CANCELLED_REG]=0x01; else - this->mapping->tab_bits[CANCELLED_REG]=0x00; + this->mapping->tab_input_bits[CANCELLED_REG]=0x00; this->access.exit(); } } @@ -262,9 +262,9 @@ void LoomingModbusDriver::set_aborted(bool status) { this->access.enter(); if(status) - this->mapping->tab_bits[ABORTED_REG]=0x01; + this->mapping->tab_input_bits[ABORTED_REG]=0x01; else - this->mapping->tab_bits[ABORTED_REG]=0x00; + this->mapping->tab_input_bits[ABORTED_REG]=0x00; this->access.exit(); } } @@ -273,9 +273,9 @@ bool LoomingModbusDriver::is_start(void) { if(this->mapping!=NULL) { - if(this->mapping->tab_input_bits[START_REG]!=0x00) + if(this->mapping->tab_bits[START_REG]!=0x00) { - this->mapping->tab_input_bits[START_REG]=0x00; + this->mapping->tab_bits[START_REG]=0x00; return true; } else @@ -289,9 +289,9 @@ bool LoomingModbusDriver::is_cancel(void) { if(this->mapping!=NULL) { - if(this->mapping->tab_input_bits[CANCEL_REG]!=0x00) + if(this->mapping->tab_bits[CANCEL_REG]!=0x00) { - this->mapping->tab_input_bits[CANCEL_REG]=0x00; + this->mapping->tab_bits[CANCEL_REG]=0x00; return true; } else @@ -304,18 +304,18 @@ bool LoomingModbusDriver::is_cancel(void) void LoomingModbusDriver::set_current_position(float x,float y, float theta) { this->access.enter(); - modbus_set_float(x,&this->mapping->tab_registers[CURRENT_POSITION_X]); - modbus_set_float(y,&this->mapping->tab_registers[CURRENT_POSITION_Y]); - modbus_set_float(theta,&this->mapping->tab_registers[CURRENT_POSITION_THETA]); + modbus_set_float(x,&this->mapping->tab_input_registers[CURRENT_POSITION_X]); + modbus_set_float(y,&this->mapping->tab_input_registers[CURRENT_POSITION_Y]); + modbus_set_float(theta,&this->mapping->tab_input_registers[CURRENT_POSITION_THETA]); this->access.exit(); } void LoomingModbusDriver::get_target_position(float &x,float &y, float &theta) { this->access.enter(); - x=modbus_get_float(&this->mapping->tab_input_registers[TARGET_POSITION_X]); - y=modbus_get_float(&this->mapping->tab_input_registers[TARGET_POSITION_Y]); - theta=modbus_get_float(&this->mapping->tab_input_registers[TARGET_POSITION_THETA]); + x=modbus_get_float(&this->mapping->tab_registers[TARGET_POSITION_X]); + y=modbus_get_float(&this->mapping->tab_registers[TARGET_POSITION_Y]); + theta=modbus_get_float(&this->mapping->tab_registers[TARGET_POSITION_THETA]); this->access.exit(); } diff --git a/src/looming_modbus_driver_node.cpp b/src/looming_modbus_driver_node.cpp index a737f8258b8b01d6fef3284c2f9e5c36fc4fbeb0..b4df69a0cd5047c0a7174ddc00007d973325bd20 100644 --- a/src/looming_modbus_driver_node.cpp +++ b/src/looming_modbus_driver_node.cpp @@ -20,6 +20,9 @@ LoomingModbusDriverNode::LoomingModbusDriverNode(ros::NodeHandle &nh) : // [init services] // [init clients] + mode_change_client_ = this->private_node_handle_.serviceClient<moby_msgs::ModeChange>("mode_change"); + clear_costmaps_client_ = this->private_node_handle_.serviceClient<roscpp::Empty>("clear_costmaps"); + // [init action servers] @@ -37,6 +40,8 @@ void LoomingModbusDriverNode::mainNodeThread(void) // [fill msg structures] // [fill srv structure and make request to the server] + + // [fill action structure and make request to the action server] //// variable to hold the state of the current goal on the server @@ -85,7 +90,35 @@ void LoomingModbusDriverNode::mainNodeThread(void) this->driver_.set_ready(true); } if(this->driver_.is_start()) + { + this->mode_change_srv_.request.mode.mode=3; + if(this->mode_change_client_.call(this->mode_change_srv_)) + { + if(this->mode_change_srv_.response.accepted) + ROS_INFO("LoomingModbusDriverNode:: Navigation mode changed successfully"); + else + { + ROS_WARN("LoomingModbusDriverNode:: Impossible to change navigation mode"); + this->driver_.unlock(); + return; + } + } + else + { + ROS_WARN_STREAM("LoomingModbusDriverNode:: Impossible to change navigation mode (no connection to " << this->mode_change_client_.getService() << ")"); +// this->driver_.unlock(); +// return; + } + if(this->clear_costmaps_client_.call(this->clear_costmaps_srv_)) + ROS_INFO("LoomingModbusDriverNode:: costmaps cleared"); + else + { + ROS_INFO("LoomingModbusDriverNode:: Impossible to clear costmaps"); + this->driver_.unlock(); + return; + } this->move_baseMakeActionRequest(); + } else if(this->driver_.is_cancel()) move_base_client_.cancelGoal();