Browse Source

新增新年拍摄视频程序

zhuo 4 years ago
parent
commit
16e077c3d0

+ 210 - 0
src/robot_new_year/CMakeLists.txt

@@ -0,0 +1,210 @@
+cmake_minimum_required(VERSION 3.0.2)
+project(robot_new_year)
+
+## Compile as C++11, supported in ROS Kinetic and newer
+# add_compile_options(-std=c++11)
+
+## Find catkin macros and libraries
+## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
+## is used, also find other catkin packages
+find_package(catkin REQUIRED COMPONENTS
+  roscpp
+  geometry_msgs
+  nav_msgs
+  visualization_msgs
+  tf
+  ros_arduino_msgs
+  rasp_imu_hat_6dof
+)
+
+## System dependencies are found with CMake's conventions
+# find_package(Boost REQUIRED COMPONENTS system)
+
+
+## Uncomment this if the package has a setup.py. This macro ensures
+## modules and global scripts declared therein get installed
+## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html
+# catkin_python_setup()
+
+################################################
+## Declare ROS messages, services and actions ##
+################################################
+
+## To declare and build messages, services or actions from within this
+## package, follow these steps:
+## * Let MSG_DEP_SET be the set of packages whose message types you use in
+##   your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...).
+## * In the file package.xml:
+##   * add a build_depend tag for "message_generation"
+##   * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET
+##   * If MSG_DEP_SET isn't empty the following dependency has been pulled in
+##     but can be declared for certainty nonetheless:
+##     * add a exec_depend tag for "message_runtime"
+## * In this file (CMakeLists.txt):
+##   * add "message_generation" and every package in MSG_DEP_SET to
+##     find_package(catkin REQUIRED COMPONENTS ...)
+##   * add "message_runtime" and every package in MSG_DEP_SET to
+##     catkin_package(CATKIN_DEPENDS ...)
+##   * uncomment the add_*_files sections below as needed
+##     and list every .msg/.srv/.action file to be processed
+##   * uncomment the generate_messages entry below
+##   * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)
+
+## Generate messages in the 'msg' folder
+# add_message_files(
+#   FILES
+#   Message1.msg
+#   Message2.msg
+# )
+
+## Generate services in the 'srv' folder
+# add_service_files(
+#   FILES
+#   Service1.srv
+#   Service2.srv
+# )
+
+## Generate actions in the 'action' folder
+# add_action_files(
+#   FILES
+#   Action1.action
+#   Action2.action
+# )
+
+## Generate added messages and services with any dependencies listed here
+# generate_messages(
+#   DEPENDENCIES
+#   std_msgs  # Or other packages containing msgs
+# )
+
+################################################
+## Declare ROS dynamic reconfigure parameters ##
+################################################
+
+## To declare and build dynamic reconfigure parameters within this
+## package, follow these steps:
+## * In the file package.xml:
+##   * add a build_depend and a exec_depend tag for "dynamic_reconfigure"
+## * In this file (CMakeLists.txt):
+##   * add "dynamic_reconfigure" to
+##     find_package(catkin REQUIRED COMPONENTS ...)
+##   * uncomment the "generate_dynamic_reconfigure_options" section below
+##     and list every .cfg file to be processed
+
+## Generate dynamic reconfigure parameters in the 'cfg' folder
+# generate_dynamic_reconfigure_options(
+#   cfg/DynReconf1.cfg
+#   cfg/DynReconf2.cfg
+# )
+
+###################################
+## catkin specific configuration ##
+###################################
+## The catkin_package macro generates cmake config files for your package
+## Declare things to be passed to dependent projects
+## INCLUDE_DIRS: uncomment this if your package contains header files
+## LIBRARIES: libraries you create in this project that dependent projects also need
+## CATKIN_DEPENDS: catkin_packages dependent projects also need
+## DEPENDS: system dependencies of this project that dependent projects also need
+catkin_package(
+#  INCLUDE_DIRS include
+#  LIBRARIES robot_new_year
+#  CATKIN_DEPENDS roscpp
+#  DEPENDS system_lib
+)
+
+###########
+## Build ##
+###########
+
+## Specify additional locations of header files
+## Your package locations should be listed before other locations
+include_directories(
+  include
+  ${catkin_INCLUDE_DIRS}
+)
+
+## Declare a C++ library
+# add_library(${PROJECT_NAME}
+#   src/${PROJECT_NAME}/robot_new_year.cpp
+# )
+
+## Add cmake target dependencies of the library
+## as an example, code may need to be generated before libraries
+## either from message generation or dynamic reconfigure
+# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
+
+## Declare a C++ executable
+## With catkin_make all packages are built within a single CMake context
+## The recommended prefix ensures that target names across packages don't collide
+add_executable(${PROJECT_NAME}_node src/robot_new_year_node.cpp)
+
+## Rename C++ executable without prefix
+## The above recommended prefix causes long target names, the following renames the
+## target back to the shorter version for ease of user use
+## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
+# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")
+
+## Add cmake target dependencies of the executable
+## same as for the library above
+add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
+
+## Specify libraries to link a library or executable target against
+target_link_libraries(${PROJECT_NAME}_node
+  ${catkin_LIBRARIES}
+)
+
+#############
+## Install ##
+#############
+
+# all install targets should use catkin DESTINATION variables
+# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html
+
+## Mark executable scripts (Python etc.) for installation
+## in contrast to setup.py, you can choose the destination
+# catkin_install_python(PROGRAMS
+#   scripts/my_python_script
+#   DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
+# )
+
+## Mark executables for installation
+## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html
+# install(TARGETS ${PROJECT_NAME}_node
+#   RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
+# )
+
+## Mark libraries for installation
+## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html
+# install(TARGETS ${PROJECT_NAME}
+#   ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
+#   LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
+#   RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
+# )
+
+## Mark cpp header files for installation
+# install(DIRECTORY include/${PROJECT_NAME}/
+#   DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
+#   FILES_MATCHING PATTERN "*.h"
+#   PATTERN ".svn" EXCLUDE
+# )
+
+## Mark other files for installation (e.g. launch and bag files, etc.)
+# install(FILES
+#   # myfile1
+#   # myfile2
+#   DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
+# )
+
+#############
+## Testing ##
+#############
+
+## Add gtest based cpp test target and link libraries
+# catkin_add_gtest(${PROJECT_NAME}-test test/test_robot_new_year.cpp)
+# if(TARGET ${PROJECT_NAME}-test)
+#   target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
+# endif()
+
+## Add folders to be run by python nosetests
+# catkin_add_nosetests(test)

+ 33 - 0
src/robot_new_year/cfg/param.yaml

@@ -0,0 +1,33 @@
+robot_id: 1
+
+odom_frame: odom_combined
+base_frame: base_footprint
+
+cmd_topic: /cmd_vel
+voice_topic: /voice_system/iflytek_offline_tts_topic
+yaw_service: /imu_node/GetYawData
+gripper_service: /mobilebase_arduino/gripper_angle
+control_service: /mobilebase_arduino/gripper_control
+
+vertical_linear_x_speed: 0.1
+turn_angular_z_speed: -0.8
+curve_linear_x_speed: -0.06
+curve_angular_z_speed: 0.4
+diagonal_linear_x_speed: -0.1
+diagonal_linear_y_speed: -0.1
+
+first_vertical_distance: 0.1
+first_turn_yaw: 1.57
+second_turn_yaw: 0.35
+second_vertical_distance: 0.1
+diagonal_distance: 0.2
+gripper_open_angle: 65
+gripper_close_angle: 20
+
+tolerance_d: 0.005
+
+last_words: 我要甩掉二零二零年的霉气
+future_words: 祝全国人民新年快乐
+
+first_delay: 1
+second_delay: 3

+ 9 - 0
src/robot_new_year/launch/robot_new_year.launch

@@ -0,0 +1,9 @@
+<launch>
+
+  <arg name="cfg_file" default="$(find robot_new_year)/cfg/param.yaml" />
+
+  <node pkg="robot_new_year" type="robot_new_year_node" name="robot_new_year_node" output="screen">
+    <rosparam file="$(arg cfg_file)" command="load" />
+  </node>
+  
+</launch>

+ 77 - 0
src/robot_new_year/package.xml

@@ -0,0 +1,77 @@
+<?xml version="1.0"?>
+<package format="2">
+  <name>robot_new_year</name>
+  <version>0.0.0</version>
+  <description>The robot_new_year package</description>
+
+  <!-- One maintainer tag required, multiple allowed, one person per tag -->
+  <!-- Example:  -->
+  <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
+  <maintainer email="tianbot@todo.todo">tianbot</maintainer>
+
+
+  <!-- One license tag required, multiple allowed, one license per tag -->
+  <!-- Commonly used license strings: -->
+  <!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
+  <license>TODO</license>
+
+
+  <!-- Url tags are optional, but multiple are allowed, one per tag -->
+  <!-- Optional attribute type can be: website, bugtracker, or repository -->
+  <!-- Example: -->
+  <!-- <url type="website">http://wiki.ros.org/robot_new_year</url> -->
+
+
+  <!-- Author tags are optional, multiple are allowed, one per tag -->
+  <!-- Authors do not have to be maintainers, but could be -->
+  <!-- Example: -->
+  <!-- <author email="jane.doe@example.com">Jane Doe</author> -->
+
+
+  <!-- The *depend tags are used to specify dependencies -->
+  <!-- Dependencies can be catkin packages or system dependencies -->
+  <!-- Examples: -->
+  <!-- Use depend as a shortcut for packages that are both build and exec dependencies -->
+  <!--   <depend>roscpp</depend> -->
+  <!--   Note that this is equivalent to the following: -->
+  <!--   <build_depend>roscpp</build_depend> -->
+  <!--   <exec_depend>roscpp</exec_depend> -->
+  <!-- Use build_depend for packages you need at compile time: -->
+  <!--   <build_depend>message_generation</build_depend> -->
+  <!-- Use build_export_depend for packages you need in order to build against this package: -->
+  <!--   <build_export_depend>message_generation</build_export_depend> -->
+  <!-- Use buildtool_depend for build tool packages: -->
+  <!--   <buildtool_depend>catkin</buildtool_depend> -->
+  <!-- Use exec_depend for packages you need at runtime: -->
+  <!--   <exec_depend>message_runtime</exec_depend> -->
+  <!-- Use test_depend for packages you need only for testing: -->
+  <!--   <test_depend>gtest</test_depend> -->
+  <!-- Use doc_depend for packages you need only for building documentation: -->
+  <!--   <doc_depend>doxygen</doc_depend> -->
+  <buildtool_depend>catkin</buildtool_depend>
+  <build_depend>geometry_msgs</build_depend>
+  <build_depend>nav_msgs</build_depend>
+  <build_depend>roscpp</build_depend>
+  <build_depend>tf</build_depend>
+  <build_depend>ros_arduino_msgs</build_depend>
+  <build_depend>rasp_imu_hat_6dof</build_depend>
+  <build_export_depend>geometry_msgs</build_export_depend>
+  <build_export_depend>nav_msgs</build_export_depend>
+  <build_export_depend>roscpp</build_export_depend>
+  <build_export_depend>tf</build_export_depend>
+  <build_export_depend>ros_arduino_msgs</build_export_depend>
+  <build_export_depend>rasp_imu_hat_6dof</build_export_depend>
+  <exec_depend>geometry_msgs</exec_depend>
+  <exec_depend>nav_msgs</exec_depend>
+  <exec_depend>roscpp</exec_depend>
+  <exec_depend>tf</exec_depend>
+  <exec_depend>ros_arduino_msgs</exec_depend>
+  <exec_depend>rasp_imu_hat_6dof</exec_depend>
+
+
+  <!-- The export tag contains other, unspecified, tags -->
+  <export>
+    <!-- Other tools can request additional information be placed here -->
+
+  </export>
+</package>

+ 299 - 0
src/robot_new_year/src/robot_new_year_node.cpp

@@ -0,0 +1,299 @@
+/*
+ * @Author: adam_zhuo
+ * @Date: 2021-01-21 10:13:20
+ * @LastEditTime: 2021-01-22 15:23:19
+ * @LastEditors: Please set LastEditors
+ * @Description: In User Settings Edit
+ * @FilePath: /blackTornadoRobot/src/robot_new_year/src/robot_new_year_node.cpp
+ */
+
+#include <string>
+#include <ros/ros.h>
+#include <std_msgs/String.h>
+#include <geometry_msgs/Twist.h>
+#include <nav_msgs/Odometry.h>
+#include <tf/tf.h>
+#include <tf/transform_listener.h>
+#include "rasp_imu_hat_6dof/GetYawData.h"
+#include "ros_arduino_msgs/GripperAngle.h"
+#include "ros_arduino_msgs/GripperControl.h"
+
+using namespace std;
+
+#define VERTICAL_MOVE  1
+#define HORIZON_MOVE  2 
+#define DIAGONAL_MOVE 3
+#define ROBOT1 1
+#define ROBOT2 2
+
+ros::Publisher cmd_pub;
+ros::Publisher voice_pub;
+ros::ServiceClient yaw_srv_client;
+ros::ServiceClient gripper_srv_client;
+ros::ServiceClient control_srv_client;
+rasp_imu_hat_6dof::GetYawData yaw_srv;
+ros_arduino_msgs::GripperAngle gripper_srv;
+ros_arduino_msgs::GripperControl control_srv;
+
+float vertical_linear_x_speed;
+float turn_angular_z_speed;
+float curve_linear_x_speed,curve_angular_z_speed;
+float diagonal_linear_x_speed,diagonal_linear_y_speed;
+
+float first_vertical_distance,second_vertical_distance;
+float diagonal_distance;
+int gripper_open_angle,gripper_close_angle;
+float initial_yaw,first_turn_yaw,second_turn_yaw;
+
+float tolerance_d;
+
+string odom_frame = "/odom_combined";
+string base_frame = "/base_footprint";
+
+void pub_twist_cmd(float linear_x, float linear_y, float angular_z);
+void yaw_update(const float dynamic_turn_angle);
+void robot_move(int move_flag,const float check_dist);
+void robot_curve();
+
+void pub_twist_cmd(float linear_x, float linear_y, float angular_z)
+{
+    geometry_msgs::Twist twist_msg;
+
+    twist_msg.linear.x = linear_x;
+    twist_msg.linear.y = linear_y;
+    twist_msg.linear.z = 0.0;
+
+    twist_msg.angular.x = 0.0;
+    twist_msg.angular.y = 0.0;
+    twist_msg.angular.z = angular_z;
+
+    cmd_pub.publish(twist_msg);
+}
+
+void yaw_update(const float dynamic_turn_angle)
+{
+    float start_yaw = 0.0;
+    float target = 0.0;
+    float diff = 10.0;
+    float now_yaw = 0.0;
+    float turn_yaw = 0.0;
+    
+    yaw_srv_client.call(yaw_srv);
+    start_yaw = yaw_srv.response.yaw;
+    turn_yaw = dynamic_turn_angle;
+    target = start_yaw + turn_yaw;
+    if(target > M_PI){
+        target = target - M_PI*2.0;
+    }else if(target < -M_PI){
+        target = target + M_PI*2.0;
+    }
+    
+    while(fabs(diff) > 0.01){
+        yaw_srv_client.call(yaw_srv);
+        now_yaw = yaw_srv.response.yaw;
+        diff = target - now_yaw;
+        if(diff > 0){
+            pub_twist_cmd(0, 0, turn_angular_z_speed);
+        }
+        else{
+            pub_twist_cmd(0, 0, -turn_angular_z_speed);
+        }
+        ros::Duration(0.04).sleep();
+    }
+    pub_twist_cmd(0, 0, 0);
+}
+
+void robot_move(int move_flag,const float check_dist)
+{
+    tf::TransformListener tf_listener;
+    tf::StampedTransform tf_transform;
+    float dist = 0.0; 
+
+    try
+    {
+        tf_listener.waitForTransform(odom_frame, base_frame, ros::Time(0), ros::Duration(5.0));
+    }
+    catch(tf::TransformException &ex)
+    {
+        ROS_ERROR("tf_Listener.waitForTransform timeout error !");
+        ROS_ERROR("%s", ex.what());
+        ros::shutdown();
+    }
+
+    tf_listener.lookupTransform(odom_frame, base_frame, ros::Time(0), tf_transform);
+    float x_start = tf_transform.getOrigin().x();
+    float y_start = tf_transform.getOrigin().y();
+
+    bool dist_flag = true;
+    while(dist_flag&&(ros::ok()))
+    {
+        switch(move_flag){
+            case VERTICAL_MOVE:
+                pub_twist_cmd(copysign(vertical_linear_x_speed,check_dist), 0, 0);
+                break;
+            case DIAGONAL_MOVE:
+                pub_twist_cmd(diagonal_linear_x_speed,diagonal_linear_y_speed,0);
+                break;
+        }
+            
+        ros::Duration(0.10).sleep(); //100 ms
+
+        tf_listener.lookupTransform(odom_frame, base_frame, ros::Time(0),tf_transform);
+        float x = tf_transform.getOrigin().x();
+        float y = tf_transform.getOrigin().y();
+        dist = sqrt(pow((x - x_start), 2) + pow((y - y_start), 2));
+        if(fabs(check_dist)-dist<tolerance_d){
+            dist_flag = false;
+        }
+    }
+    pub_twist_cmd(0, 0, 0); //stop move
+}
+
+void robot_turn(float target,float angular_z_speed){
+    float start_yaw;
+    float now_yaw;
+    bool flag = true;
+    yaw_srv_client.call(yaw_srv);
+    start_yaw = yaw_srv.response.yaw;
+    while(flag){
+        pub_twist_cmd(0, 0, angular_z_speed);
+        ros::Duration(0.005).sleep();
+        yaw_srv_client.call(yaw_srv);
+        now_yaw = yaw_srv.response.yaw;
+        if((target-fabs(now_yaw - start_yaw))<0.005){
+            flag = false;
+        }
+    }
+    pub_twist_cmd(0, 0, 0);
+}
+
+void robot_curve(){
+    float start_yaw;
+    float now_yaw;
+    bool flag = true;
+    yaw_srv_client.call(yaw_srv);
+    start_yaw = yaw_srv.response.yaw;
+    while(flag){
+        pub_twist_cmd(curve_linear_x_speed, 0, curve_angular_z_speed);
+        ros::Duration(0.1).sleep();
+        yaw_srv_client.call(yaw_srv);
+        now_yaw = yaw_srv.response.yaw;
+        if((1.57-fabs(now_yaw - start_yaw))<0.005){
+            flag = false;
+        }
+    }
+    pub_twist_cmd(0, 0, 0);
+}
+
+void gripper(int angle){
+    gripper_srv.request.servoID = 1;
+    gripper_srv.request.angle = angle;
+    gripper_srv.request.delay = 0;
+    gripper_srv_client.call(gripper_srv);
+}
+
+void control(){
+    control_srv.request.servoID = 0;
+    control_srv.request.value = 1;
+    control_srv_client.call(control_srv);
+    ros::Duration(2).sleep();
+    control_srv.request.value = 3;
+    control_srv_client.call(control_srv);
+    ros::Duration(2).sleep();
+    control_srv.request.value = 2;
+    control_srv_client.call(control_srv);
+}
+
+void voice(string words){
+    std_msgs::String lucky;
+    lucky.data = words;
+    voice_pub.publish(lucky);
+}
+
+int main(int argc, char** argv){
+    string cmd_topic;
+    string voice_topic;
+    string yaw_service;
+    string gripper_service;
+    string control_service;
+    string last_words;
+    string future_words;
+    float first_delay;
+    float second_delay;
+    int robot_id;
+
+    ros::init(argc, argv, "robot_new_year_node");
+    ros::NodeHandle nh("~");
+
+    ros::param::get("~robot_id",robot_id);
+    ros::param::get("~odom_frame", odom_frame);
+    ros::param::get("~base_frame", base_frame);
+
+    ros::param::get("~cmd_topic", cmd_topic);
+    ros::param::get("~voice_topic", voice_topic);
+    ros::param::get("~yaw_service", yaw_service);
+    ros::param::get("~gripper_service", gripper_service);
+    ros::param::get("~control_service", control_service);
+
+    ros::param::get("~vertical_linear_x_speed", vertical_linear_x_speed);
+    ros::param::get("~turn_angular_z_speed", turn_angular_z_speed);
+    ros::param::get("~curve_linear_x_speed", curve_linear_x_speed);
+    ros::param::get("~curve_angular_z_speed", curve_angular_z_speed);
+    ros::param::get("~diagonal_linear_x_speed", diagonal_linear_x_speed);
+    ros::param::get("~diagonal_linear_y_speed", diagonal_linear_y_speed);
+
+    ros::param::get("~first_vertical_distance", first_vertical_distance);
+    ros::param::get("~second_vertical_distance", second_vertical_distance);
+    ros::param::get("~first_turn_yaw", first_turn_yaw);
+    ros::param::get("~second_turn_yaw", second_turn_yaw);
+    ros::param::get("~diagonal_distance", diagonal_distance);
+    ros::param::get("~gripper_open_angle", gripper_open_angle);
+    ros::param::get("~gripper_close_angle", gripper_close_angle);
+    
+    ros::param::get("~tolerance_d", tolerance_d);
+
+    ros::param::get("~last_words", last_words);
+    ros::param::get("~future_words", future_words);
+
+    ros::param::get("~first_delay", first_delay);
+    ros::param::get("~second_delay", second_delay);
+
+    
+    cmd_pub    = nh.advertise<geometry_msgs::Twist>(cmd_topic, 1);
+    voice_pub = nh.advertise<std_msgs::String>(voice_topic, 1);
+    yaw_srv_client = nh.serviceClient<rasp_imu_hat_6dof::GetYawData>(yaw_service);
+    gripper_srv_client = nh.serviceClient<ros_arduino_msgs::GripperAngle>(gripper_service);
+    control_srv_client = nh.serviceClient<ros_arduino_msgs::GripperControl>(control_service);
+
+    yaw_srv_client.call(yaw_srv);
+    initial_yaw = yaw_srv.response.yaw;
+
+    if(robot_id == ROBOT2){
+        turn_angular_z_speed = -turn_angular_z_speed;
+        curve_angular_z_speed = -curve_angular_z_speed;
+        diagonal_linear_y_speed = -diagonal_linear_y_speed;
+    }
+    ros::Duration(first_delay).sleep();
+    robot_move(VERTICAL_MOVE,first_vertical_distance);
+    robot_turn(first_turn_yaw,turn_angular_z_speed);
+    if(robot_id == ROBOT1){
+        voice(last_words);
+    }
+    ros::Duration(second_delay).sleep();
+    robot_turn(second_turn_yaw,turn_angular_z_speed);
+    robot_turn(second_turn_yaw,-turn_angular_z_speed);
+    robot_turn(second_turn_yaw,turn_angular_z_speed);
+    robot_turn(second_turn_yaw,-turn_angular_z_speed);
+    gripper(gripper_open_angle);
+    robot_curve();
+    robot_move(VERTICAL_MOVE,second_vertical_distance);
+    gripper(gripper_close_angle);
+    control();
+    robot_move(DIAGONAL_MOVE,diagonal_distance);
+    if(robot_id == ROBOT1){
+        voice(future_words);
+    }
+
+    ros::spin();
+    return 0;
+}