From 3a1206d27e9b714a86fcad8dd318e20414de2ffe Mon Sep 17 00:00:00 2001 From: Naman Gupta Date: Fri, 6 Dec 2019 15:18:46 -0500 Subject: [PATCH 01/62] [Task 3.17]Updated CMakeLists.txt Changed OpenCV 2 to OpenCV so that it can find OpenCV package from ROS that is 3.3.0 --- CMakeLists.txt | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 86dc7dd..9edd8d2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,14 +5,14 @@ project(supermarket_cleaning_robot) add_compile_options(-std=c++11) ## Find catkin and any catkin packages -find_package(OpenCV 2 REQUIRED) +find_package(OpenCV REQUIRED) find_package( catkin REQUIRED COMPONENTS roscpp sensor_msgs - geometry_msgs - move_base_msgs + geometry_msgs + move_base_msgs cv_bridge image_transport ) @@ -28,10 +28,10 @@ include_directories( ) ## Add executables -add_executable(supermarket_cleaning_robot src/turtlebot.cpp src/obstacle_avoidance.cpp) +add_executable(supermarket_cleaning_robot src/turtlebot.cpp src/obstacle_avoidance.cpp src/main.cpp) ## Add target link libraries -## target_link_libraries(supermarket_cleaning_robot ${catkin_LIBRARIES}${OpenCV_INCLUDE_DIRS}) +## target_link_libraries( ${catkin_LIBRARIES} ${OpenCV_INCLUDE_DIRS}) ## Enable catkin test and add files for the same if(CATKIN_ENABLE_TESTING) @@ -47,12 +47,11 @@ if(CATKIN_ENABLE_TESTING) src/obstacle_avoidance.cpp) target_link_libraries( - test_supermarket_cleaning_robot + test_project_x_robot ${catkin_LIBRARIES} ${OpenCV_LIBS}) add_dependencies( - supermarket_cleaning_robot - test_project_x_robot + test_project_x_robot ${catkin_EXPORTED_TARGETS}) endif() \ No newline at end of file From ab2e757ab78d9feae8afc805a151e7cb5a22cda1 Mon Sep 17 00:00:00 2001 From: Naman Gupta Date: Fri, 6 Dec 2019 15:22:14 -0500 Subject: [PATCH 02/62] [Task 3.7]Added main.cpp --- src/main.cpp | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/main.cpp diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..3647c13 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,53 @@ +/** + * Copyright (c) 2019, Naman Gupta, Umang Rastogi + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file main.cpp + * @author Naman Gupta + * @author Umang Rastogi + * @copyright GNU + * @brief Implementation of algorithm + */ + +#include "object_detection/object_detection.h" +#include "obstacle_avoidance/obstacle_avoidance.h" +#include "turtlebot/turtlebot.h" + +/** + * @brief main function + * @param argc + * @param argv + * @return none + */ +int main(int argc, char* argv[]) { + return -1; +} From 03518facf6a6bc7d65402f73dd52ca9d93f92867 Mon Sep 17 00:00:00 2001 From: Naman Gupta Date: Fri, 6 Dec 2019 15:27:53 -0500 Subject: [PATCH 03/62] [Task 3.8]Fixed bugs Changed use of EXPECT_EQ in turtlebot.cpp, added semi-colon, removed unused functions, etc --- src/obstacle_avoidance.cpp | 7 ++----- src/turtlebot.cpp | 6 +++--- test/obstacle_avoidance_test.cpp | 4 ++-- test/turtlebot_test.cpp | 2 +- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/obstacle_avoidance.cpp b/src/obstacle_avoidance.cpp index 1425b88..fd5bef7 100644 --- a/src/obstacle_avoidance.cpp +++ b/src/obstacle_avoidance.cpp @@ -40,16 +40,13 @@ ObstacleAvoidance::ObstacleAvoidance() { ROS_INFO_STREAM("Setting up obstacle avoidance for the robot..."); - /// Initialize the current value of velocities in m/s and rad/s - linearVelocity = 1.0; - anguarVelocity = 0.52; /// Initialize obstacle detected value with false obstacleDetected = false; /// Initialize safe distance from an obstacle in meters distanceThreshold = 0.2; /// Subscribe for data from the laser sensor on the scan topic subscibeSensor = nh.subscribe("/scan", 500, \ - &ObstacleAvoidance::sensorCallback, this); + &ObstacleAvoidance::laserSensorCallback, this); ROS_INFO_STREAM("Set up complete"); } @@ -61,7 +58,7 @@ ObstacleAvoidance::ObstacleAvoidance(float distThreshold) { distanceThreshold = distThreshold; /// Subscribe for data from the laser sensor on the scan topic subscibeSensor = nh.subscribe("/scan", 500, \ - &ObstacleAvoidance::sensorCallback, this); + &ObstacleAvoidance::laserSensorCallback, this); ROS_INFO_STREAM("Set up complete"); } diff --git a/src/turtlebot.cpp b/src/turtlebot.cpp index c19ff0d..ba3ca79 100644 --- a/src/turtlebot.cpp +++ b/src/turtlebot.cpp @@ -45,7 +45,7 @@ Turtlebot::Turtlebot() { ROS_INFO_STREAM("Initiliazing the robot..."); ObstacleAvoidance obstacleAvoidance; - ObjectDetection objectDetection; + // ObjectDetection objectDetection; /// Initialize the current value of velocities in m/s and rad/s linearVelocity = 1.0; anguarVelocity = 0.52; @@ -60,7 +60,7 @@ Turtlebot::Turtlebot() { Turtlebot::Turtlebot(float linVelX, float angVelZ) { ROS_INFO_STREAM("Initiliazing the robot..."); ObstacleAvoidance obstacleAvoidance; - ObjectDetection objectDetection; + // ObjectDetection objectDetection; /// Initialize the current value of velocities in m/s and rad/s linearVelocity = linVelX; anguarVelocity = angVelZ; @@ -93,7 +93,7 @@ float Turtlebot::turn(float angVelZ) { } bool Turtlebot::collectObject() { - return false + return false; } void Turtlebot::moveBot() { diff --git a/test/obstacle_avoidance_test.cpp b/test/obstacle_avoidance_test.cpp index c3ac734..1b0e149 100644 --- a/test/obstacle_avoidance_test.cpp +++ b/test/obstacle_avoidance_test.cpp @@ -50,6 +50,6 @@ TEST(ObstacleAvoidanceTest, obstacleNotDetected) { */ TEST(ObstacleAvoidanceTest, obstacleDetected) { ObstacleAvoidance obstacle; - EXPECT_EQ(obstacle.getObstacleDetected(), - obstacle.setObstacleDetected(true)); + obstacle.setObstacleDetected(true); + EXPECT_EQ(obstacle.getObstacleDetected(), true); } diff --git a/test/turtlebot_test.cpp b/test/turtlebot_test.cpp index a9e45d1..2205300 100644 --- a/test/turtlebot_test.cpp +++ b/test/turtlebot_test.cpp @@ -52,7 +52,7 @@ TEST(TurtlebotTest, velocityChangedTest) { */ TEST(TurtlebotTest, moveForwardTest) { Turtlebot turtle; - EXPECT_EQ(2.0, turtle.moveForward(2.0)) + EXPECT_EQ(2.0, turtle.moveForward(2.0)); } /** From 08fe16f4d6d07a22be53361b97de34bd1a716bab Mon Sep 17 00:00:00 2001 From: Naman Gupta Date: Fri, 6 Dec 2019 15:50:45 -0500 Subject: [PATCH 04/62] Changed location of UML directory --- {data/uml => uml}/initial/uml_activity_diagram.pdf | Bin {data/uml => uml}/initial/uml_class_diagram.pdf | Bin {data/uml => uml}/revised/uml_class_diagram.pdf | Bin 3 files changed, 0 insertions(+), 0 deletions(-) rename {data/uml => uml}/initial/uml_activity_diagram.pdf (100%) rename {data/uml => uml}/initial/uml_class_diagram.pdf (100%) rename {data/uml => uml}/revised/uml_class_diagram.pdf (100%) diff --git a/data/uml/initial/uml_activity_diagram.pdf b/uml/initial/uml_activity_diagram.pdf similarity index 100% rename from data/uml/initial/uml_activity_diagram.pdf rename to uml/initial/uml_activity_diagram.pdf diff --git a/data/uml/initial/uml_class_diagram.pdf b/uml/initial/uml_class_diagram.pdf similarity index 100% rename from data/uml/initial/uml_class_diagram.pdf rename to uml/initial/uml_class_diagram.pdf diff --git a/data/uml/revised/uml_class_diagram.pdf b/uml/revised/uml_class_diagram.pdf similarity index 100% rename from data/uml/revised/uml_class_diagram.pdf rename to uml/revised/uml_class_diagram.pdf From e4ae8944ce03b4a0390d44450ed93bcee6039656 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Fri, 6 Dec 2019 16:59:05 -0500 Subject: [PATCH 05/62] [Task 3.8] Link target libraries to fix build errors --- CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9edd8d2..4b2149c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,8 +11,8 @@ find_package( catkin REQUIRED COMPONENTS roscpp sensor_msgs - geometry_msgs - move_base_msgs + geometry_msgs + move_base_msgs cv_bridge image_transport ) @@ -28,10 +28,10 @@ include_directories( ) ## Add executables -add_executable(supermarket_cleaning_robot src/turtlebot.cpp src/obstacle_avoidance.cpp src/main.cpp) +add_executable(object_collection src/turtlebot.cpp src/obstacle_avoidance.cpp src/main.cpp) ## Add target link libraries -## target_link_libraries( ${catkin_LIBRARIES} ${OpenCV_INCLUDE_DIRS}) +target_link_libraries(object_collection ${catkin_LIBRARIES} ${OpenCV_LIBS}) ## Enable catkin test and add files for the same if(CATKIN_ENABLE_TESTING) From 67407191399c9dedc47292d9b8d0fdf0033a0131 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Fri, 6 Dec 2019 17:02:16 -0500 Subject: [PATCH 06/62] [Task 3.8] Remove re-declaration of node handle Remove build errors --- src/turtlebot.cpp | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/turtlebot.cpp b/src/turtlebot.cpp index ba3ca79..b5e88ef 100644 --- a/src/turtlebot.cpp +++ b/src/turtlebot.cpp @@ -49,11 +49,8 @@ Turtlebot::Turtlebot() { /// Initialize the current value of velocities in m/s and rad/s linearVelocity = 1.0; anguarVelocity = 0.52; - /// Define the main access point to communications with the ROS system - ros::NodeHandle nh; /// Publish the velocities to the robot on the navigation topic - publishVelocities = nh.advertise\ - ("/cmd_vel_mux/input/navi", 1000); + publishVelocities = nh.advertise("/cmd_vel_mux/input/navi", 1000); ROS_INFO_STREAM("Set up complete"); } @@ -64,11 +61,8 @@ Turtlebot::Turtlebot(float linVelX, float angVelZ) { /// Initialize the current value of velocities in m/s and rad/s linearVelocity = linVelX; anguarVelocity = angVelZ; - /// Define the main access point to communications with the ROS system - ros::NodeHandle nh; /// Publish the velocities to the robot on the navigation topic - publishVelocities = nh.advertise\ - ("/cmd_vel_mux/input/navi", 1000); + publishVelocities = nh.advertise("/cmd_vel_mux/input/navi", 1000); ROS_INFO_STREAM("Set up complete"); } From c45f824117f8b076b3854e65f066b83e6edacb94 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Fri, 6 Dec 2019 17:04:43 -0500 Subject: [PATCH 07/62] [Task 3.8] Initialize ros and various classes to fix errors --- src/main.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 3647c13..324e120 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -37,7 +37,7 @@ * @copyright GNU * @brief Implementation of algorithm */ - +#include "ros/ros.h" #include "object_detection/object_detection.h" #include "obstacle_avoidance/obstacle_avoidance.h" #include "turtlebot/turtlebot.h" @@ -49,5 +49,8 @@ * @return none */ int main(int argc, char* argv[]) { - return -1; + ros::init(argc, argv, "object_collection"); + ObstacleAvoidance obstacleAvoidance; + Turtlebot turtlebot; + return 0; } From 434fc41e02d7ce56475272a5b1e1b75560978eba Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Fri, 6 Dec 2019 17:14:32 -0500 Subject: [PATCH 08/62] [Task 3.8] Install ros dependencies to fic travis build errors --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 358c776..a9b3fb4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,6 +30,9 @@ before_install: - gem install coveralls-lcov # Install ROS-Base: (Bare Bones) ROS package, build, and communication libraries. No GUI tools. - sudo apt-get install -y --allow-unauthenticated ros-$ROS_DISTRO-ros-base + # Install package dependencies + - sudo apt-get install -y --allow-unauthenticated ros-$ROS_DISTRO-move-base ros-$ROS_DISTRO-geometry-msgs ros-$ROS_DISTRO-sensor-msgs ros-$ROS_DISTRO-cv-bridge ros-$ROS_DISTRO-image-transport + # Source ros kinetic setup file - source /opt/ros/$ROS_DISTRO/setup.bash # Prepare rosdep to install dependencies. - sudo rosdep init From a195ec5182c645702b7b92edc10d54868d6995f3 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Fri, 6 Dec 2019 17:57:58 -0500 Subject: [PATCH 09/62] [Task 3.8] Change node name for uniformity --- test/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/main.cpp b/test/main.cpp index a5acf47..b35b250 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -39,7 +39,7 @@ // Run all the tests that were declared with TEST() int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); - ros::init(argc, argv, "tester"); - ros::NodeHandle n; + ros::init(argc, argv, "test_project_x_robot"); + ros::NodeHandle nh; return RUN_ALL_TESTS(); } From 10be514eb4fff59599c99543d2ab92e4090f0a80 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Fri, 6 Dec 2019 17:59:26 -0500 Subject: [PATCH 10/62] [Task 3.8] Add launch to fix linking errors --- test/project_x_test.launch | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 test/project_x_test.launch diff --git a/test/project_x_test.launch b/test/project_x_test.launch new file mode 100644 index 0000000..26c4280 --- /dev/null +++ b/test/project_x_test.launch @@ -0,0 +1,3 @@ + + + \ No newline at end of file From 6719f4aca4645b8c0282ec4a995ee275c8b9acf8 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Fri, 6 Dec 2019 18:00:23 -0500 Subject: [PATCH 11/62] [Task 3.8] Fix travis build errors to make tests --- CMakeLists.txt | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4b2149c..02c4d3a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,13 +38,15 @@ if(CATKIN_ENABLE_TESTING) set(CMAKE_BUILD_TYPE Debug) find_package(rostest REQUIRED) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 --coverage") + add_rostest_gtest( test_project_x_robot - test/main.cpp - test/obstacle_avoidance_test.cpp - test/turtlebot_test.cpp - src/turtlebot.cpp - src/obstacle_avoidance.cpp) + test/project_x_test.launch + test/main.cpp + test/obstacle_avoidance_test.cpp + test/turtlebot_test.cpp + src/obstacle_avoidance.cpp + src/turtlebot.cpp) target_link_libraries( test_project_x_robot @@ -53,5 +55,6 @@ if(CATKIN_ENABLE_TESTING) add_dependencies( test_project_x_robot + object_collection ${catkin_EXPORTED_TARGETS}) endif() \ No newline at end of file From b7c4404e8208d5ad2ce3c7766daebd28800a8b1b Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Fri, 6 Dec 2019 18:01:59 -0500 Subject: [PATCH 12/62] [Task 3.8] Edit travis to only build test Do not make the test results for coveralls --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a9b3fb4..fe0f303 100644 --- a/.travis.yml +++ b/.travis.yml @@ -81,7 +81,7 @@ script: - catkin_make # Run the tests, ensuring the path is set correctly. - source devel/setup.bash - - catkin_make run_tests && catkin_test_results + - catkin_make run_tests # && catkin_test_results after_success: - cd ~/catkin_ws/build From 44bd4ecc19ab3303ffc10ad73901fd1913d5245e Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Sat, 7 Dec 2019 12:44:22 -0500 Subject: [PATCH 13/62] [Task 3.1] Change function definition of moveBot --- include/turtlebot/turtlebot.h | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/include/turtlebot/turtlebot.h b/include/turtlebot/turtlebot.h index 80ae172..9a423e3 100644 --- a/include/turtlebot/turtlebot.h +++ b/include/turtlebot/turtlebot.h @@ -40,9 +40,12 @@ /// Add ROS headers #include "ros/ros.h" #include "geometry_msgs/Twist.h" +#include "object_detection/object_detection.h" +#include "obstacle_avoidance/obstacle_avoidance.h" class Turtlebot { private: + // ObjectDetection objectDetection; /// Define the main access point to communications with the ROS system ros::NodeHandle nh; /// Define a publisher object to publish velocities for the robot @@ -52,9 +55,11 @@ class Turtlebot { /// Initialize linear velocity in x-axis float linearVelocity; /// Initialize angular velocity about z-axis - float anguarVelocity; + float angularVelocity; + /// Define variables to store previous velocities + float prevLinearVelocity, prevAngularVelocity; /// Initialize publishing rate - const int publishRate = 2; + const int publishRate = 500; public: /** @@ -107,7 +112,7 @@ class Turtlebot { * @detail Use obstacle avoidance and go-to-goal strategies * to move towards the object to be collected */ - void moveBot(); + void moveBot(ObstacleAvoidance& obstacleAvoidance); /** * @brief Reset the velocities of the bot From 40c93a2b80e10d8d511020884df440a8e2ab16fd Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Sat, 7 Dec 2019 12:46:21 -0500 Subject: [PATCH 14/62] [Task 3.1] Add stub implementation for all methods --- src/turtlebot.cpp | 65 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 56 insertions(+), 9 deletions(-) diff --git a/src/turtlebot.cpp b/src/turtlebot.cpp index b5e88ef..8d238b3 100644 --- a/src/turtlebot.cpp +++ b/src/turtlebot.cpp @@ -44,11 +44,12 @@ Turtlebot::Turtlebot() { ROS_INFO_STREAM("Initiliazing the robot..."); - ObstacleAvoidance obstacleAvoidance; - // ObjectDetection objectDetection; /// Initialize the current value of velocities in m/s and rad/s - linearVelocity = 1.0; - anguarVelocity = 0.52; + linearVelocity = 0.2; + angularVelocity = 0.52; + /// Initialize previous with the current value of velocities + prevLinearVelocity = linearVelocity; + prevAngularVelocity = angularVelocity; /// Publish the velocities to the robot on the navigation topic publishVelocities = nh.advertise("/cmd_vel_mux/input/navi", 1000); ROS_INFO_STREAM("Set up complete"); @@ -56,11 +57,12 @@ Turtlebot::Turtlebot() { Turtlebot::Turtlebot(float linVelX, float angVelZ) { ROS_INFO_STREAM("Initiliazing the robot..."); - ObstacleAvoidance obstacleAvoidance; - // ObjectDetection objectDetection; /// Initialize the current value of velocities in m/s and rad/s linearVelocity = linVelX; - anguarVelocity = angVelZ; + angularVelocity = angVelZ; + /// Initialize previous with the current value of velocities + prevLinearVelocity = linearVelocity; + prevAngularVelocity = angularVelocity; /// Publish the velocities to the robot on the navigation topic publishVelocities = nh.advertise("/cmd_vel_mux/input/navi", 1000); ROS_INFO_STREAM("Set up complete"); @@ -90,14 +92,59 @@ bool Turtlebot::collectObject() { return false; } -void Turtlebot::moveBot() { - return; +void Turtlebot::moveBot(ObstacleAvoidance& obstacleAvoidance) { + // Set the publishing rate + ros::Rate loop_rate(publishRate); + while (ros::ok()) { + if (obstacleAvoidance.checkObstacle()) { + ROS_DEBUG_STREAM("Inside obstacle detected"); + /// Start turning the robot to avoid obstacles + turn(angularVelocity); + /// Check if velocities have changed + checkVelocityChanged(); + } else { + /// Start moving the robot once obstacle is avoided + moveForward(linearVelocity); + /// Check if velocities have changed + checkVelocityChanged(); + } + + /// Publish the velocities + publishVelocities.publish(velocities); + /// Handle callback + ros::spinOnce(); + /// Make the system sleep to maintain loop rate + loop_rate.sleep(); + } } bool Turtlebot::resetBot() { + ROS_INFO_STREAM("Resetting the robot config..."); + /// Reset linear velocities of the both robot + velocities.linear.x = 0.0; + velocities.linear.y = 0.0; + velocities.linear.z = 0.0; + /// Reset angular velocities of the both robot + velocities.angular.x = 0.0; + velocities.angular.y = 0.0; + velocities.angular.z = 0.0; + /// Publish the reset velocities + publishVelocities.publish(velocities); + ROS_INFO_STREAM("Reset complete"); return true; } bool Turtlebot::checkVelocityChanged() { + /// Linear and angular change simultaneously + /// Check if both the velocities have changed + if (velocities.linear.x != prevLinearVelocity and \ + velocities.angular.z != prevAngularVelocity) { + ROS_DEBUG_STREAM("Velocity of the robot changed"); + /// Update previous velocities + velocities.linear.x = prevLinearVelocity; + velocities.angular.z = prevAngularVelocity; + return true; + } + return false; } From db70f71ca705969ca932144dd27da9abba2ee1b2 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Sat, 7 Dec 2019 12:49:10 -0500 Subject: [PATCH 15/62] [Task 3.2] Change obstacle detection condition --- src/obstacle_avoidance.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/obstacle_avoidance.cpp b/src/obstacle_avoidance.cpp index fd5bef7..a50672a 100644 --- a/src/obstacle_avoidance.cpp +++ b/src/obstacle_avoidance.cpp @@ -68,7 +68,7 @@ void ObstacleAvoidance::laserSensorCallback( const sensor_msgs::LaserScan::ConstPtr& sensorData) { /// Read sensor data to get obstacle distances with respect to the robot for (const float &range : sensorData->ranges) { - if (range < distanceThreshold) { + if (range <= distanceThreshold) { setObstacleDetected(true); return; } From 5b102777d88f14f9fae19757f9f4b39440f3d343 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Sat, 7 Dec 2019 12:50:03 -0500 Subject: [PATCH 16/62] [Task 3.1] Edit main to start moving the bot --- src/main.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 324e120..4f9ac49 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -38,9 +38,9 @@ * @brief Implementation of algorithm */ #include "ros/ros.h" +#include "turtlebot/turtlebot.h" #include "object_detection/object_detection.h" #include "obstacle_avoidance/obstacle_avoidance.h" -#include "turtlebot/turtlebot.h" /** * @brief main function @@ -51,6 +51,8 @@ int main(int argc, char* argv[]) { ros::init(argc, argv, "object_collection"); ObstacleAvoidance obstacleAvoidance; + /// ObjectDetection objectDetection; Turtlebot turtlebot; + turtlebot.moveBot(obstacleAvoidance); return 0; } From 2b6597e7a3ef5983d0d6a4f89a9054a0330eec00 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Sat, 7 Dec 2019 12:50:51 -0500 Subject: [PATCH 17/62] [Task 3.1] Edit world to add turtle bot --- data/worlds/supermarket.world | 1166 ++++++++++++++++++++++++++++++++- 1 file changed, 1165 insertions(+), 1 deletion(-) diff --git a/data/worlds/supermarket.world b/data/worlds/supermarket.world index a9bae6c..765a01c 100644 --- a/data/worlds/supermarket.world +++ b/data/worlds/supermarket.world @@ -85,6 +85,28 @@ 1243 345518802 1575272231 359268243 1231802 + + 0.0 0.0 0.0 0.0 0.0 0.0 + 1 1 1 + + 0.195541 0.29695 -0.001131 6e-05 -0.007995 -0.973856 + 2.8e-05 3.3e-05 -1.4e-05 -0.000308 0.00077 -0.000278 + -9.9e-05 -4.6e-05 -0.002513 -0.04738 0.104093 0.027379 + -0.000463 -0.000214 -0.011802 0 -0 0 + + + 0.290473 0.36182 0.035019 -1.57084 -0.02402 -0.973855 + 7.3e-05 1.7e-05 -0.000107 -0.000308 0.00077 -0.000278 + 0.038672 0.009168 -2.37668 0.080951 -0.119103 0.018942 + 0.000387 9.2e-05 -0.023767 0 -0 0 + + + 0.100263 0.232531 0.034853 -1.57083 -0.030552 -0.973852 + 3.7e-05 7e-05 8e-05 -0.000308 0.00077 -0.000278 + 0.007628 0.012269 -1.96845 0.068068 -0.100148 0.012996 + 7.6e-05 0.000123 -0.019684 0 -0 0 + + 3.29168 0.29942 0.264462 -1.57506 0 0 1 1 1 @@ -6253,6 +6275,1148 @@ -2.96266 2.64651 0.264462 -1.57082 0.004264 1.56552 + + + 0 0 0 0 -0 0 + + -0.002635 -4.1e-05 0.129243 0 -0 0 + 4.6973 + + 0.1365 + -2.51802e-05 + 0.0108194 + 0.132157 + 4.89572e-05 + 0.0741648 + + + + 0 0 0.06969 0 -0 0 + + + 0.10938 + 0.178 + + + 10 + + + + + + + + + + + + + + + -0.087 -0.0015 0.2972 0 -0 0 + + + 0.073 0.276 0.072 + + + + + + + + + + + + + + + 10 + + + -0.135 0 0.0192 -1.5708 0 0 + + + 0.0176 + 0.017 + + + + + + 1e+06 + 100 + 1 + 0.001 + + + + + 0 + 0 + + + + + + + + 10 + + + 0.115 0 0.0172 -1.5708 0 0 + + + 0.0176 + 0.017 + + + + + + 1e+06 + 100 + 1 + 0.001 + + + + + 0 + 0 + + + + + + + + 10 + + + -0.1024 0 0.2822 0 -0 0 + + + 0.033 0.276 0.012 + + + 10 + + + + + + + + + + + + + + + 0 0 0.1408 0 -0 0 + + + 0.006 + 0.17 + + + 10 + + + + + + + + + + + + + + + 0 0 0.1976 0 -0 0 + + + 0.006 + 0.17 + + + 10 + + + + + + + + + + + + + + + 0 0 0.4068 0 -0 0 + + + 0.006 + 0.17 + + + 10 + + + + + + + + + + + + + + + 0.12 0.082 0.113 0 -0 0 + + + 0.0492 + 0.006 + + + 10 + + + + + + + + + + + + + + + 0.055 0.12 0.113 0 -0 0 + + + 0.0492 + 0.006 + + + 10 + + + + + + + + + + + + + + + -0.055 0.12 0.113 0 -0 0 + + + 0.0492 + 0.006 + + + 10 + + + + + + + + + + + + + + + 0.12 -0.082 0.113 0 -0 0 + + + 0.0492 + 0.006 + + + 10 + + + + + + + + + + + + + + + 0.055 -0.12 0.113 0 -0 0 + + + 0.0492 + 0.006 + + + 10 + + + + + + + + + + + + + + + -0.055 -0.12 0.113 0 -0 0 + + + 0.0492 + 0.006 + + + 10 + + + + + + + + + + + + + + + -0.1024 0.098 0.2474 0 -0 0 + + + 0.0936 + 0.006 + + + 10 + + + + + + + + + + + + + + + -0.1024 -0.098 0.2474 0 -0 0 + + + 0.0936 + 0.006 + + + 10 + + + + + + + + + + + + + + + 0.0381 0.1505 0.1742 0 -0 0 + + + 0.0608 + 0.006 + + + 10 + + + + + + + + + + + + + + + 0.0381 -0.1505 0.1742 0 -0 0 + + + 0.0608 + 0.006 + + + 10 + + + + + + + + + + + + + + + -0.0381 0.1505 0.1742 0 -0 0 + + + 0.0608 + 0.006 + + + 10 + + + + + + + + + + + + + + + -0.0381 -0.1505 0.1742 0 -0 0 + + + 0.0608 + 0.006 + + + 10 + + + + + + + + + + + + + + + 0.0381 0.1505 0.3022 0 -0 0 + + + 0.2032 + 0.006 + + + 10 + + + + + + + + + + + + + + + 0.0381 -0.1505 0.3022 0 -0 0 + + + 0.2032 + 0.006 + + + 10 + + + + + + + + + + + + + + + -0.0381 0.1505 0.3022 0 -0 0 + + + 0.2032 + 0.006 + + + 10 + + + + + + + + + + + + + + + -0.0381 -0.1505 0.3022 0 -0 0 + + + 0.2032 + 0.006 + + + 10 + + + + + + + + + + + + + + + 0.001 0 0.06219 0 -0 0 + + + 1 1 1 + /opt/ros/kinetic/share/kobuki_description/meshes/main_body.dae + + + + + + + + -0.102 0.002 0.3012 0 -0 0 + + + 1 1 1 + /opt/ros/kinetic/share/turtlebot_description/meshes/sensors/xtion_pro_camera.dae + + + + + + + + -0.1024 0 0.2822 -1.5708 0 0 + + + 1 1 1 + /opt/ros/kinetic/share/turtlebot_description/meshes/sensors/xtion_pro_stack.dae + + + + + 0.02364 0 0.1408 0 -0 0 + + + 1 1 1 + /opt/ros/kinetic/share/turtlebot_description/meshes/stacks/hexagons/plate_bottom.dae + + + + + -0.01364 0 0.1976 0 -0 0 + + + 1 1 1 + /opt/ros/kinetic/share/turtlebot_description/meshes/stacks/hexagons/plate_middle.dae + + + + + -0.01364 0 0.4068 0 -0 0 + + + 1 1 1 + /opt/ros/kinetic/share/turtlebot_description/meshes/stacks/hexagons/plate_top.dae + + + + + 0.12 0.082 0.113 0 -0 0 + + + 1 1 1 + /opt/ros/kinetic/share/turtlebot_description/meshes/stacks/hexagons/pole_bottom.dae + + + + + 0.055 0.12 0.113 0 -0 0 + + + 1 1 1 + /opt/ros/kinetic/share/turtlebot_description/meshes/stacks/hexagons/pole_bottom.dae + + + + + -0.055 0.12 0.113 0 -0 0 + + + 1 1 1 + /opt/ros/kinetic/share/turtlebot_description/meshes/stacks/hexagons/pole_bottom.dae + + + + + 0.12 -0.082 0.113 0 -0 0 + + + 1 1 1 + /opt/ros/kinetic/share/turtlebot_description/meshes/stacks/hexagons/pole_bottom.dae + + + + + 0.055 -0.12 0.113 0 -0 0 + + + 1 1 1 + /opt/ros/kinetic/share/turtlebot_description/meshes/stacks/hexagons/pole_bottom.dae + + + + + -0.055 -0.12 0.113 0 -0 0 + + + 1 1 1 + /opt/ros/kinetic/share/turtlebot_description/meshes/stacks/hexagons/pole_bottom.dae + + + + + -0.1024 0.098 0.2374 0 -0 0 + + + 1 1 1 + /opt/ros/kinetic/share/turtlebot_description/meshes/sensors/sensor_pole.dae + + + + + -0.1024 -0.098 0.2374 0 -0 0 + + + 1 1 1 + /opt/ros/kinetic/share/turtlebot_description/meshes/sensors/sensor_pole.dae + + + + + 0.0381 0.1505 0.1742 3.14159 -0 3.14159 + + + 1 1 1 + /opt/ros/kinetic/share/turtlebot_description/meshes/stacks/hexagons/pole_middle.dae + + + + + 0.0381 -0.1505 0.1742 3.14159 -0 3.14159 + + + 1 1 1 + /opt/ros/kinetic/share/turtlebot_description/meshes/stacks/hexagons/pole_middle.dae + + + + + -0.0381 0.1505 0.1742 3.14159 -0 3.14159 + + + 1 1 1 + /opt/ros/kinetic/share/turtlebot_description/meshes/stacks/hexagons/pole_middle.dae + + + + + -0.0381 -0.1505 0.1742 3.14159 -0 3.14159 + + + 1 1 1 + /opt/ros/kinetic/share/turtlebot_description/meshes/stacks/hexagons/pole_middle.dae + + + + + 0.0381 0.1505 0.3022 0 -0 0 + + + 1 1 1 + /opt/ros/kinetic/share/turtlebot_description/meshes/stacks/hexagons/pole_top.dae + + + + + 0.0381 -0.1505 0.3022 0 -0 0 + + + 1 1 1 + /opt/ros/kinetic/share/turtlebot_description/meshes/stacks/hexagons/pole_top.dae + + + + + -0.0381 0.1505 0.3022 0 -0 0 + + + 1 1 1 + /opt/ros/kinetic/share/turtlebot_description/meshes/stacks/hexagons/pole_top.dae + + + + + -0.0381 -0.1505 0.3022 0 -0 0 + + + 1 1 1 + /opt/ros/kinetic/share/turtlebot_description/meshes/stacks/hexagons/pole_top.dae + + + + + + 1 + 50 + 1 + + base_footprint_fixed_joint_lump__base_collision + __default_topic__ + + 0 0 0.0102 0 -0 0 + + + + 1 + 20 + + 1.0472 + + B8G8R8 + 640 + 480 + + + 0.05 + 8 + + + + camera + true + 10 + rgb/image_raw + depth/image_raw + depth/points + rgb/camera_info + depth/camera_info + camera_depth_optical_frame + 0.1 + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 + 0.4 + / + + -0.087 -0.0015 0.2972 0 -0 0 + + + + + + 1 + 50 + 1 + + + + 50 + 1 + -0.0436 + 0.0436 + + + 1 + 0 + 0 + + + + 0.01 + 0.15 + 1 + + + 0.156 0 0.0316 3.14159 1.57079 3.14159 + + + + 1 + 50 + 1 + + + + 50 + 1 + -0.0436 + 0.0436 + + + 1 + 0 + 0 + + + + 0.01 + 0.15 + 1 + + + 0.08734 0.13601 0.0316 3.14159 1.57079 3.14159 + + + + 1 + 50 + 1 + + + + 50 + 1 + -0.0436 + 0.0436 + + + 1 + 0 + 0 + + + + 0.01 + 0.15 + 1 + + + 0.085 -0.13601 0.0316 3.14159 1.57079 3.14159 + + 1 + + + 1 + 50 + 0 + + + + + 0 + 1.96e-06 + 0 + 0 + + + + + 0 + 1.96e-06 + 0 + 0 + + + + + 0 + 1.96e-06 + 0 + 0 + + + + + + + 0 + 0.017 + 0.1 + 0.001 + + + + + 0 + 0.017 + 0.1 + 0.001 + + + + + 0 + 0.017 + 0.1 + 0.001 + + + + + 0.056 0.062 0.0304 0 -0 0 + + 0 + 0 + + + 0 0.115 0.0352 -1.5708 0 0 + + 0 0 0 0 -0 0 + 0.01 + + 0.001 + 0 + 0 + 0.001 + 0 + 0.001 + + + + 0 0 0 0 -0 0 + + + 0.0206 + 0.0352 + + + + + + 1e+06 + 100 + 1 + 0.001 + + + + + 1 + 1 + + + + + + + + 10 + + + 0 0 0 0 -0 0 + + + 1 1 1 + /opt/ros/kinetic/share/kobuki_description/meshes/wheel.dae + + + + + + + 1 + + 0 + 0 + + + wheel_left_link + base_footprint + + 0 1 0 + + -1e+16 + 1e+16 + + + 0 + 0 + + 1 + + + + 0 -0.115 0.0352 -1.5708 0 0 + + 0 0 0 0 -0 0 + 0.01 + + 0.001 + 0 + 0 + 0.001 + 0 + 0.001 + + + + 0 0 0 0 -0 0 + + + 0.0206 + 0.035 + + + + + + 1e+06 + 100 + 1 + 0.001 + + + + + 1 + 1 + + + + + + + + 10 + + + 0 0 0 0 -0 0 + + + 1 1 1 + /opt/ros/kinetic/share/kobuki_description/meshes/wheel.dae + + + + + + + 1 + + 0 + 0 + + + wheel_right_link + base_footprint + + 0 1 0 + + -1e+16 + 1e+16 + + + 0 + 0 + + 1 + + + 0 + + 1 + wheel_left_joint + wheel_right_joint + .230 + 0.070 + 1.0 + 0.6 + cliff_sensor_left + cliff_sensor_front + cliff_sensor_right + 0.04 + bumpers + imu + / + + 0 0 0 0 -0 0 + 1 @@ -8314,7 +9478,7 @@ 10 10 0.01 - 100 + 20 random From 9f61d4854f393da680b18943adb48cf01c67db56 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Sat, 7 Dec 2019 12:52:21 -0500 Subject: [PATCH 18/62] [Task 3.1] Add file to launch object collection node --- launch/object_collection.launch | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 launch/object_collection.launch diff --git a/launch/object_collection.launch b/launch/object_collection.launch new file mode 100644 index 0000000..3e48768 --- /dev/null +++ b/launch/object_collection.launch @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file From 8eb8d337413efa1d12a797a4852f835431339a1e Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Sat, 7 Dec 2019 13:08:50 -0500 Subject: [PATCH 19/62] [Task 3.11] Update readme with build and run instructions --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4d07c7b..82ba17c 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,7 @@ This project is under-development. Currently, we are facing build issues. Sorry - Run the following commands to clone and build this project: ```shell script git clone --recursive https://github.com/urastogi885/obstacle_avoidance_simulation +git checkout Phase3 cd .. catkin_make ``` @@ -117,7 +118,7 @@ Close and terminate everything including rosmaster. In a new terminal, switch to ``` cd catkin_ws source devel/setup.bash -catkin_make run_tests_supermarket_cleaning_robot +catkin_make run_tests_test_project_x_robot ``` ## Run @@ -127,7 +128,7 @@ Now, we use launch file to run. In a new terminal, type ``` cd catkin_ws source devel/setup.bash -roslaunch supermarket_cleaning_robot launcher.launch +roslaunch supermarket_cleaning_robot object_collection.launch ``` ## Doxygen From de3dfef614bf9c1882c3385a40d19d01d1d0fc1a Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Sat, 7 Dec 2019 16:08:45 -0500 Subject: [PATCH 20/62] [Task 3.2] Change threshold distance for an obstacle --- src/obstacle_avoidance.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/obstacle_avoidance.cpp b/src/obstacle_avoidance.cpp index a50672a..1797fa7 100644 --- a/src/obstacle_avoidance.cpp +++ b/src/obstacle_avoidance.cpp @@ -43,7 +43,7 @@ ObstacleAvoidance::ObstacleAvoidance() { /// Initialize obstacle detected value with false obstacleDetected = false; /// Initialize safe distance from an obstacle in meters - distanceThreshold = 0.2; + distanceThreshold = 0.8; /// Subscribe for data from the laser sensor on the scan topic subscibeSensor = nh.subscribe("/scan", 500, \ &ObstacleAvoidance::laserSensorCallback, this); @@ -69,6 +69,7 @@ void ObstacleAvoidance::laserSensorCallback( /// Read sensor data to get obstacle distances with respect to the robot for (const float &range : sensorData->ranges) { if (range <= distanceThreshold) { + ROS_INFO_STREAM("Distance: " << range); setObstacleDetected(true); return; } From be678790172152a99685f435c14001b25984c8a0 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Sat, 7 Dec 2019 17:07:54 -0500 Subject: [PATCH 21/62] [Task 3.8] Fix package name in launch file --- test/project_x_test.launch | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/project_x_test.launch b/test/project_x_test.launch index 26c4280..73b6663 100644 --- a/test/project_x_test.launch +++ b/test/project_x_test.launch @@ -1,3 +1,5 @@ - + \ No newline at end of file From aea902ecf3cf3200d0831f2698843311ce7b19b4 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Sat, 7 Dec 2019 17:16:43 -0500 Subject: [PATCH 22/62] [Task 3.8] Add check for obstacle test --- test/obstacle_avoidance_test.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/test/obstacle_avoidance_test.cpp b/test/obstacle_avoidance_test.cpp index 1b0e149..7f43811 100644 --- a/test/obstacle_avoidance_test.cpp +++ b/test/obstacle_avoidance_test.cpp @@ -51,5 +51,13 @@ TEST(ObstacleAvoidanceTest, obstacleNotDetected) { TEST(ObstacleAvoidanceTest, obstacleDetected) { ObstacleAvoidance obstacle; obstacle.setObstacleDetected(true); - EXPECT_EQ(obstacle.getObstacleDetected(), true); + EXPECT_TRUE(obstacle.getObstacleDetected()); } + +/** + * @brief Test to check obstacle + */ +TEST(ObstacleAvoidanceTest, checkObstacle) { + ObstacleAvoidance obstacle; + EXPECT_FALSE(obstacle.checkObstacle()); +} \ No newline at end of file From 65051cb8e8fc68cdc507397a02659e7c4ccda49c Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Sat, 7 Dec 2019 17:19:13 -0500 Subject: [PATCH 23/62] [Task 3.8] Fix move forward and turn tests --- test/turtlebot_test.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/test/turtlebot_test.cpp b/test/turtlebot_test.cpp index 2205300..86d05ac 100644 --- a/test/turtlebot_test.cpp +++ b/test/turtlebot_test.cpp @@ -43,7 +43,7 @@ */ TEST(TurtlebotTest, velocityChangedTest) { Turtlebot turtle; - EXPECT_FALSE(turtle.checkVelocityChanged()); + EXPECT_TRUE(turtle.checkVelocityChanged()); } /** @@ -52,7 +52,8 @@ TEST(TurtlebotTest, velocityChangedTest) { */ TEST(TurtlebotTest, moveForwardTest) { Turtlebot turtle; - EXPECT_EQ(2.0, turtle.moveForward(2.0)); + float linVel = 2.0; + EXPECT_EQ(linVel, turtle.moveForward(linVel)); } /** @@ -61,5 +62,14 @@ TEST(TurtlebotTest, moveForwardTest) { */ TEST(TurtlebotTest, turnTest) { Turtlebot turtle; - EXPECT_EQ(0.52, turtle.turn(0.52)); + float angVel = 0.52; + EXPECT_EQ(angVel, turtle.turn(angVel)); } + +/** + * @brief Test for resetting the bot + */ +TEST(TurtlebotTest, resetTest) { + Turtlebot turtle; + EXPECT_TRUE(turtle.resetBot()); +} \ No newline at end of file From abd0317a79c55046b15ae07f63c2a8a9ad3c1806 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Sat, 7 Dec 2019 17:22:30 -0500 Subject: [PATCH 24/62] [Task 3.6] Update travis file to make test results --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fe0f303..a9b3fb4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -81,7 +81,7 @@ script: - catkin_make # Run the tests, ensuring the path is set correctly. - source devel/setup.bash - - catkin_make run_tests # && catkin_test_results + - catkin_make run_tests && catkin_test_results after_success: - cd ~/catkin_ws/build From c6aee7d34e4497f6f0226c3a39b013df9eef7d69 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Sat, 7 Dec 2019 17:59:30 -0500 Subject: [PATCH 25/62] [Task 3.6] Add test for the 2nd constructor --- test/obstacle_avoidance_test.cpp | 4 +++- test/turtlebot_test.cpp | 12 ++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/test/obstacle_avoidance_test.cpp b/test/obstacle_avoidance_test.cpp index 7f43811..479e464 100644 --- a/test/obstacle_avoidance_test.cpp +++ b/test/obstacle_avoidance_test.cpp @@ -58,6 +58,8 @@ TEST(ObstacleAvoidanceTest, obstacleDetected) { * @brief Test to check obstacle */ TEST(ObstacleAvoidanceTest, checkObstacle) { - ObstacleAvoidance obstacle; + /// Define distance threshold for obstacles + float distThresh = 0.5; + ObstacleAvoidance obstacle(distThresh); EXPECT_FALSE(obstacle.checkObstacle()); } \ No newline at end of file diff --git a/test/turtlebot_test.cpp b/test/turtlebot_test.cpp index 86d05ac..a465622 100644 --- a/test/turtlebot_test.cpp +++ b/test/turtlebot_test.cpp @@ -51,8 +51,10 @@ TEST(TurtlebotTest, velocityChangedTest) { * @detail Test to check linear velocity provided to method */ TEST(TurtlebotTest, moveForwardTest) { - Turtlebot turtle; - float linVel = 2.0; + /// Define angular and linear velocities for the robot + float linVel = 2.0; + float angVel = 0.52; + Turtlebot turtle(linVel, angVel); EXPECT_EQ(linVel, turtle.moveForward(linVel)); } @@ -61,8 +63,10 @@ TEST(TurtlebotTest, moveForwardTest) { * @detail Test to check angular velocity provided to method */ TEST(TurtlebotTest, turnTest) { - Turtlebot turtle; - float angVel = 0.52; + /// Define angular and linear velocities for the robot + float linVel = 2.0; + float angVel = 0.52; + Turtlebot turtle(linVel, angVel); EXPECT_EQ(angVel, turtle.turn(angVel)); } From e8c2a65a87d9000a8bd74d54691e2e93c416362a Mon Sep 17 00:00:00 2001 From: Naman Gupta Date: Sun, 8 Dec 2019 16:30:29 -0500 Subject: [PATCH 26/62] [Task 3.3]Implemented class ObjectDetection --- include/object_detection/object_detection.h | 46 +++++++++++++----- src/object_detection.cpp | 53 +++++++++++++++++++++ 2 files changed, 86 insertions(+), 13 deletions(-) create mode 100644 src/object_detection.cpp diff --git a/include/object_detection/object_detection.h b/include/object_detection/object_detection.h index a9cec3f..93325a6 100644 --- a/include/object_detection/object_detection.h +++ b/include/object_detection/object_detection.h @@ -45,7 +45,7 @@ #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" -class ObjectDectection { +class ObjectDetection { private: /// Define the main access point to communications with the ROS system ros::NodeHandle nh; @@ -59,6 +59,18 @@ class ObjectDectection { cv::Mat convertedImage; /// Define object coordinates cv::Rect objectLocation; + /// Container to store image + cv::Mat image; + /// Container to store template + cv::Mat templ; + /// Define object for Image Transport + image_transport::ImageTransport it; + /// Defining subscriber object + image_transport::Subscriber image_sub; + /// Defining publisher object + image_transport::Publisher image_pub; + /// Source array + cv::Mat result; public: /** @@ -66,14 +78,22 @@ class ObjectDectection { * @param none * @return a constructor has no return */ - ObjectDectection(); + ObjectDetection(); + + /** + * @brief Method to get image file and template file + * @param none + * @return coverted image of type cv::Mat + * @details + */ + cv::Mat readImage(); /** * @brief Destructor for object detection class * @param none - * @return a destrcutor has no return + * @return none */ - ~ObjectDectection(); + ~ObjectDetection(); /** * @brief Callback function for image data @@ -84,17 +104,17 @@ class ObjectDectection { void convertImage(const sensor_msgs::Image::ConstPtr& imageData); /** - * @brief Method to implement template matching - * @param none - * @return void - */ - bool templateMatching(cv::Mat cvImage); + * @brief Method to implement template matching + * @param coverted image of type cv::Mat + * @return image of type bool + */ + void templateMatching(); /** - * @brief Method to get location of object in the turtlebot world - * @param none - * @return void - */ + * @brief Method to get location of object in the turtlebot world + * @param none + * @return location of object of type cv::Rect + */ cv::Rect getObjectLocation(); }; diff --git a/src/object_detection.cpp b/src/object_detection.cpp new file mode 100644 index 0000000..3bd176e --- /dev/null +++ b/src/object_detection.cpp @@ -0,0 +1,53 @@ +#include +#include "ros/ros.h" +#include "sensor_msgs/Image.h" +#include "cv_bridge/cv_bridge.h" +#include "sensor_msgs/image_encodings.h" +#include "image_transport/image_transport.h" +#include "object_detection/object_detection.h" +#include "opencv2/highgui/highgui.hpp" +#include "opencv2/imgproc/imgproc.hpp" + +ObjectDetection::ObjectDetection() { + it(nh); + cv::namedWindow(OPENCV_WINDOW); +} + +cv::Mat ObjectDetection::readImage() { + templ = cv::imread("..data/template.png"); + image_sub = it.subscribe("/camera/rgb/image_raw", 1, + &ObjectDetection::convertImage, this); + image_pub = it.advertise("/image_converter/output_video", 1); + return image_sub; +} + +void ObjectDetection::convertImage(const sensor_msgs::Image::ConstPtr& imageData) { + cv_bridge::CvImagePtr cv_ptr; + try { + cv_ptr = cv_bridge::toCvCopy(imageData, sensor_msgs::image_encodings::BGR8); + } + catch (cv_bridge::Exception& e) { + ROS_ERROR("cv_bridge exception: %s", e.what()); + return; + } +} + +void ObjectDetection::templateMatching() { + int matchMethod; + image = ObjectDetection.readImage(); + cv::matchTemplate(cv_ptr->image, templ, cv_ptr->result, matchMethod); /// result is now our source file which has new image which location of the matching features + cv::normalize( cv_ptr->result, result, 0, 1, NORM_MINMAX, -1, Mat()); + double minVal; double maxVal; cv::Point minLoc; cv::Point maxLoc; cv::Point matchLoc; + cv::minMaxLoc( cv_ptr->result, &minVal, &maxVal, &minLoc, &maxLoc, cv::Mat()); + matchLoc = maxLoc; + cv::rectangle( cv_ptr->result, matchLoc, cv::Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 ); + cv::imshow(OPENCV_WINDOW, cv_ptr->result); + cv::waitKey(3); + + // Output modified video stream + image_pub_.publish(cv_ptr->toImageMsg()); +} + +ObjectDetection::~ObjectDetection() { + cv::destroyWindow(OPENCV_WINDOW); +} From a2747f60f9743abc804d3e9bacc2cd0a27ff4225 Mon Sep 17 00:00:00 2001 From: Naman Gupta Date: Sun, 8 Dec 2019 16:31:12 -0500 Subject: [PATCH 27/62] Added template.jpg for template matching --- data/template.jpg | Bin 0 -> 26508 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 data/template.jpg diff --git a/data/template.jpg b/data/template.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a8a6a1d5023bb1042798600eaa8cdeab940da5df GIT binary patch literal 26508 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 MiYNf0iYNpB*?2O_7XSbN literal 0 HcmV?d00001 From 7266243e45494d4cb1b8d5c5faab65c83a05e378 Mon Sep 17 00:00:00 2001 From: Naman Gupta Date: Sun, 8 Dec 2019 16:32:38 -0500 Subject: [PATCH 28/62] [Task 3.17]Updated CMakeLists.txt Added reference to object_detection.cpp --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 02c4d3a..d5b160d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,7 +28,7 @@ include_directories( ) ## Add executables -add_executable(object_collection src/turtlebot.cpp src/obstacle_avoidance.cpp src/main.cpp) +add_executable(object_collection src/turtlebot.cpp src/obstacle_avoidance.cpp src/object_detection.cpp src/main.cpp) ## Add target link libraries target_link_libraries(object_collection ${catkin_LIBRARIES} ${OpenCV_LIBS}) From 9e1f3eb5cfdc41e293ed98180f9749be7244e608 Mon Sep 17 00:00:00 2001 From: Naman Gupta Date: Sun, 8 Dec 2019 16:33:58 -0500 Subject: [PATCH 29/62] [Task 3.3]Added function and object of class ObjectDetection --- include/turtlebot/turtlebot.h | 2 +- src/main.cpp | 4 ++-- src/turtlebot.cpp | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/include/turtlebot/turtlebot.h b/include/turtlebot/turtlebot.h index 9a423e3..8b0b5aa 100644 --- a/include/turtlebot/turtlebot.h +++ b/include/turtlebot/turtlebot.h @@ -112,7 +112,7 @@ class Turtlebot { * @detail Use obstacle avoidance and go-to-goal strategies * to move towards the object to be collected */ - void moveBot(ObstacleAvoidance& obstacleAvoidance); + void moveBot(ObstacleAvoidance& obstacleAvoidance, ObjectDetection& objectDetection); /** * @brief Reset the velocities of the bot diff --git a/src/main.cpp b/src/main.cpp index 4f9ac49..48ae41a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -51,8 +51,8 @@ int main(int argc, char* argv[]) { ros::init(argc, argv, "object_collection"); ObstacleAvoidance obstacleAvoidance; - /// ObjectDetection objectDetection; + ObjectDetection objectDetection; Turtlebot turtlebot; - turtlebot.moveBot(obstacleAvoidance); + turtlebot.moveBot(obstacleAvoidance, objectDetection); return 0; } diff --git a/src/turtlebot.cpp b/src/turtlebot.cpp index 8d238b3..942a73c 100644 --- a/src/turtlebot.cpp +++ b/src/turtlebot.cpp @@ -92,10 +92,11 @@ bool Turtlebot::collectObject() { return false; } -void Turtlebot::moveBot(ObstacleAvoidance& obstacleAvoidance) { +void Turtlebot::moveBot(ObstacleAvoidance& obstacleAvoidance, ObjectDetection& objectDetection) { // Set the publishing rate ros::Rate loop_rate(publishRate); while (ros::ok()) { + objectDetection.templateMatching(); if (obstacleAvoidance.checkObstacle()) { ROS_DEBUG_STREAM("Inside obstacle detected"); /// Start turning the robot to avoid obstacles From 16006383f360f0d3fa412f77b4be2d0767b57a17 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Sun, 8 Dec 2019 23:21:41 -0500 Subject: [PATCH 30/62] [Task 3.1] Update function definitions --- include/turtlebot/turtlebot.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/turtlebot/turtlebot.h b/include/turtlebot/turtlebot.h index 8b0b5aa..711372b 100644 --- a/include/turtlebot/turtlebot.h +++ b/include/turtlebot/turtlebot.h @@ -60,6 +60,12 @@ class Turtlebot { float prevLinearVelocity, prevAngularVelocity; /// Initialize publishing rate const int publishRate = 500; + /// Obstacle detection and template matching variables + /* + const std::string opencvWindow = "image_window"; + const int maxTrackbar = 5; + int matchMethod; + char* trackbarLabel;*/ public: /** From 5c1551d45032de570353bff628f5539ceded8309 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Sun, 8 Dec 2019 23:23:38 -0500 Subject: [PATCH 31/62] [Task 3.1] Fix move bot for obstacle avoidance --- src/turtlebot.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/turtlebot.cpp b/src/turtlebot.cpp index 942a73c..9b19399 100644 --- a/src/turtlebot.cpp +++ b/src/turtlebot.cpp @@ -96,7 +96,11 @@ void Turtlebot::moveBot(ObstacleAvoidance& obstacleAvoidance, ObjectDetection& o // Set the publishing rate ros::Rate loop_rate(publishRate); while (ros::ok()) { - objectDetection.templateMatching(); + /* + if(objectDetection.templateMatching()) { + objectDetection.getObjectLocation(); + } + */ if (obstacleAvoidance.checkObstacle()) { ROS_DEBUG_STREAM("Inside obstacle detected"); /// Start turning the robot to avoid obstacles From bd9c4527f015b3aa5011d1c62c893c3c16674454 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Sun, 8 Dec 2019 23:37:57 -0500 Subject: [PATCH 32/62] [Task 3.3] Fixed class by adding priate variables --- include/object_detection/object_detection.h | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/include/object_detection/object_detection.h b/include/object_detection/object_detection.h index 93325a6..c845480 100644 --- a/include/object_detection/object_detection.h +++ b/include/object_detection/object_detection.h @@ -37,6 +37,7 @@ #ifndef INCLUDE_OBJECT_DETECTION_OBJECT_DETECTION_H_ #define INCLUDE_OBJECT_DETECTION_OBJECT_DETECTION_H_ +#include "iostream" #include "ros/ros.h" #include "sensor_msgs/Image.h" #include "cv_bridge/cv_bridge.h" @@ -49,18 +50,12 @@ class ObjectDetection { private: /// Define the main access point to communications with the ROS system ros::NodeHandle nh; - /// Define a publisher object to publish velocities for the robot - ros::Publisher publishLocation; /// Define a subscriber object to data of the laser sensor ros::Subscriber subscibeImages; - /// Declare publishing rate - float publishingRate; /// Store copy of the ros image converted into cv image cv::Mat convertedImage; /// Define object coordinates cv::Rect objectLocation; - /// Container to store image - cv::Mat image; /// Container to store template cv::Mat templ; /// Define object for Image Transport @@ -71,6 +66,10 @@ class ObjectDetection { image_transport::Publisher image_pub; /// Source array cv::Mat result; + /// Object bounding box + cv::Rect objectBoundary; + double minVal, maxVal; + cv::Point minLoc, maxLoc,matchLoc; public: /** @@ -86,7 +85,7 @@ class ObjectDetection { * @return coverted image of type cv::Mat * @details */ - cv::Mat readImage(); + cv::Mat readImage(std::string imagePath); /** * @brief Destructor for object detection class @@ -106,9 +105,9 @@ class ObjectDetection { /** * @brief Method to implement template matching * @param coverted image of type cv::Mat - * @return image of type bool + * @return match found */ - void templateMatching(); + bool templateMatching(); /** * @brief Method to get location of object in the turtlebot world From 2ababd0544aa78c97b2bad6eb5a16bd71d28fe49 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Sun, 8 Dec 2019 23:39:50 -0500 Subject: [PATCH 33/62] [Task 3.3] Fix conversion of ros image into opencv image Fixed path to template image --- src/object_detection.cpp | 71 ++++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 31 deletions(-) diff --git a/src/object_detection.cpp b/src/object_detection.cpp index 3bd176e..443d241 100644 --- a/src/object_detection.cpp +++ b/src/object_detection.cpp @@ -8,46 +8,55 @@ #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" -ObjectDetection::ObjectDetection() { - it(nh); - cv::namedWindow(OPENCV_WINDOW); +ObjectDetection::ObjectDetection() + : it(nh) { + image_sub = it.subscribe("/image_raw", 500, + &ObjectDetection::convertImage, this); } -cv::Mat ObjectDetection::readImage() { - templ = cv::imread("..data/template.png"); - image_sub = it.subscribe("/camera/rgb/image_raw", 1, - &ObjectDetection::convertImage, this); - image_pub = it.advertise("/image_converter/output_video", 1); - return image_sub; +cv::Mat ObjectDetection::readImage(std::string imagePath) { + // get mat format of image from image reader + cv::Mat cvImage = cv::imread(imagePath); + // check validity of image + if (cvImage.empty()) { + throw std::runtime_error("Invalid File Path"); + } + return cvImage; } void ObjectDetection::convertImage(const sensor_msgs::Image::ConstPtr& imageData) { - cv_bridge::CvImagePtr cv_ptr; - try { - cv_ptr = cv_bridge::toCvCopy(imageData, sensor_msgs::image_encodings::BGR8); - } - catch (cv_bridge::Exception& e) { - ROS_ERROR("cv_bridge exception: %s", e.what()); - return; - } + try { + convertedImage = cv_bridge::toCvCopy(imageData, "bgr8")->image; + } + catch (cv_bridge::Exception& e) { + ROS_ERROR_STREAM("cv_bridge exception: " << e.what()); + return; + } } -void ObjectDetection::templateMatching() { - int matchMethod; - image = ObjectDetection.readImage(); - cv::matchTemplate(cv_ptr->image, templ, cv_ptr->result, matchMethod); /// result is now our source file which has new image which location of the matching features - cv::normalize( cv_ptr->result, result, 0, 1, NORM_MINMAX, -1, Mat()); - double minVal; double maxVal; cv::Point minLoc; cv::Point maxLoc; cv::Point matchLoc; - cv::minMaxLoc( cv_ptr->result, &minVal, &maxVal, &minLoc, &maxLoc, cv::Mat()); - matchLoc = maxLoc; - cv::rectangle( cv_ptr->result, matchLoc, cv::Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 ); - cv::imshow(OPENCV_WINDOW, cv_ptr->result); - cv::waitKey(3); +bool ObjectDetection::templateMatching() { + templ = readImage("../data/template.jpg"); + /// Result is now our source file + /// It has location of the matching features + // Match Template + cv::matchTemplate(convertedImage, templ, result, cv::TemplateMatchModes(CV_TM_CCORR_NORMED)); + if (result.empty()) { + return false; + } + cv::normalize( result, result, 0, 1, 32, -1, cv::Mat()); + return true; +} - // Output modified video stream - image_pub_.publish(cv_ptr->toImageMsg()); +cv::Rect ObjectDetection::getObjectLocation() { + cv::minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, cv::Mat()); + matchLoc = maxLoc; + objectBoundary.x = matchLoc.x; + objectBoundary.y = matchLoc.y; + objectBoundary.width = templ.cols; + objectBoundary.height = templ.rows; + cv::rectangle(result, objectBoundary, cv::Scalar(255, 0, 0) ); + return objectBoundary; } ObjectDetection::~ObjectDetection() { - cv::destroyWindow(OPENCV_WINDOW); } From e578888637f9728a72029996b940939390b34cba Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Sun, 8 Dec 2019 23:40:57 -0500 Subject: [PATCH 34/62] [Task 3.7] Fix launch file to run object collection --- launch/object_collection.launch | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/launch/object_collection.launch b/launch/object_collection.launch index 3e48768..452e2d7 100644 --- a/launch/object_collection.launch +++ b/launch/object_collection.launch @@ -1,5 +1,4 @@ - - \ No newline at end of file + From 440713749c2d7d9a79321fe8236815cc4acee2b4 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Mon, 9 Dec 2019 04:11:39 -0500 Subject: [PATCH 35/62] [Task 3.3] Change object detection method Swicth from template matching to HSV --- include/object_detection/object_detection.h | 86 ++++++++------ src/object_detection.cpp | 118 ++++++++++++++------ 2 files changed, 136 insertions(+), 68 deletions(-) diff --git a/include/object_detection/object_detection.h b/include/object_detection/object_detection.h index c845480..74cf677 100644 --- a/include/object_detection/object_detection.h +++ b/include/object_detection/object_detection.h @@ -37,14 +37,10 @@ #ifndef INCLUDE_OBJECT_DETECTION_OBJECT_DETECTION_H_ #define INCLUDE_OBJECT_DETECTION_OBJECT_DETECTION_H_ -#include "iostream" #include "ros/ros.h" -#include "sensor_msgs/Image.h" #include "cv_bridge/cv_bridge.h" -#include "sensor_msgs/image_encodings.h" -#include "image_transport/image_transport.h" +#include "opencv2/opencv.hpp" #include "opencv2/highgui/highgui.hpp" -#include "opencv2/imgproc/imgproc.hpp" class ObjectDetection { private: @@ -54,22 +50,18 @@ class ObjectDetection { ros::Subscriber subscibeImages; /// Store copy of the ros image converted into cv image cv::Mat convertedImage; + cv::Mat hsvImage, maskImage; /// Define object coordinates - cv::Rect objectLocation; - /// Container to store template - cv::Mat templ; - /// Define object for Image Transport - image_transport::ImageTransport it; - /// Defining subscriber object - image_transport::Subscriber image_sub; - /// Defining publisher object - image_transport::Publisher image_pub; - /// Source array - cv::Mat result; - /// Object bounding box cv::Rect objectBoundary; - double minVal, maxVal; - cv::Point minLoc, maxLoc,matchLoc; + /// Define upper and lower limit of color + /// Defined red as coca-cola can is red in color + const cv::Scalar colorLowerLimit = {0, 0, 100}; + const cv::Scalar colorUpperLimit = {0, 0, 255}; + /// size of an image + cv::Size imageSize; + /// Define image array for contours + std::vector > imageArray; + bool objectDetected; public: /** @@ -79,14 +71,6 @@ class ObjectDetection { */ ObjectDetection(); - /** - * @brief Method to get image file and template file - * @param none - * @return coverted image of type cv::Mat - * @details - */ - cv::Mat readImage(std::string imagePath); - /** * @brief Destructor for object detection class * @param none @@ -103,18 +87,54 @@ class ObjectDetection { void convertImage(const sensor_msgs::Image::ConstPtr& imageData); /** - * @brief Method to implement template matching - * @param coverted image of type cv::Mat + * @brief Method to detect object using hsv + * @param converted opencv image * @return match found */ - bool templateMatching(); + bool detectObject(); /** - * @brief Method to get location of object in the turtlebot world + * @brief Method to gaussian filter on the image + * @param converted opencv image + * @return image blurred using gaussian filter + */ + cv::Mat applyGaussBlur(); + + /** + * @brief Get boundary of the object in the image * @param none - * @return location of object of type cv::Rect + * @return rectangular box containing the object */ - cv::Rect getObjectLocation(); + cv::Rect getObjectBoundary() const { + return objectBoundary; + } + + /** + * @brief set object boundary + * @param boundingBox reactagular boundary of the object + * @return void + */ + void setObjectBoundary(cv::Rect boundingBox) { + objectBoundary = boundingBox; + } + + /** + * @brief get object detected + * @param none + * @return object detected or not + */ + bool getObjectDetected() const { + return objectDetected; + } + + /** + * @brief set object detected + * @param object detected status + * @return void + */ + void setObjectDetected(bool object) { + objectDetected = object; + } }; #endif // INCLUDE_OBJECT_DETECTION_OBJECT_DETECTION_H_ diff --git a/src/object_detection.cpp b/src/object_detection.cpp index 443d241..3341dab 100644 --- a/src/object_detection.cpp +++ b/src/object_detection.cpp @@ -1,27 +1,53 @@ +/** + * BSD 3-Clause License + * + * @copyright (c) 2019, Umang Rastogi Naman Gupta + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/** + * @file object_detection.h + * @author Umang Rastogi - Driver + * @author Naman Gupta - Navigator + * @brief Library header file to implement object detection + * @detail Implements object detection using HSV + */ + #include +#include #include "ros/ros.h" #include "sensor_msgs/Image.h" #include "cv_bridge/cv_bridge.h" -#include "sensor_msgs/image_encodings.h" -#include "image_transport/image_transport.h" #include "object_detection/object_detection.h" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" -ObjectDetection::ObjectDetection() - : it(nh) { - image_sub = it.subscribe("/image_raw", 500, +ObjectDetection::ObjectDetection() { + subscibeImages = nh.subscribe("/camera/rgb/image_raw", 1, &ObjectDetection::convertImage, this); } -cv::Mat ObjectDetection::readImage(std::string imagePath) { - // get mat format of image from image reader - cv::Mat cvImage = cv::imread(imagePath); - // check validity of image - if (cvImage.empty()) { - throw std::runtime_error("Invalid File Path"); - } - return cvImage; +ObjectDetection::~ObjectDetection() { } void ObjectDetection::convertImage(const sensor_msgs::Image::ConstPtr& imageData) { @@ -34,29 +60,51 @@ void ObjectDetection::convertImage(const sensor_msgs::Image::ConstPtr& imageData } } -bool ObjectDetection::templateMatching() { - templ = readImage("../data/template.jpg"); - /// Result is now our source file - /// It has location of the matching features - // Match Template - cv::matchTemplate(convertedImage, templ, result, cv::TemplateMatchModes(CV_TM_CCORR_NORMED)); - if (result.empty()) { - return false; +bool ObjectDetection::detectObject() { + /// Convert image from bgr to hsv + cv::cvtColor(convertedImage, hsvImage, CV_BGR2HSV); + /// Detect hsv within the set limits + cv::inRange(hsvImage, colorLowerLimit, colorUpperLimit, maskImage); + /// Get image size to modify size of mask image + imageSize = convertedImage.size(); + maskImage(cv::Rect(0, 0, imageSize.width, 0.8*imageSize.height)) = 0; + /// Find contours for better visualization + cv::findContours(maskImage, imageArray, CV_RETR_LIST, CV_CHAIN_APPROX_NONE); + /// Check if contours exist in the image + if (imageArray.size() != 0) { + auto contourSize = 0; + auto maxAreaContour = 0; + auto count = 0; + while (count < imageArray.size()) { + /// Find contour with maximum area + if (contourSize < imageArray[count].size()) { + maxAreaContour = count; + contourSize = imageArray[count].size(); + } + count++; + } + /// Set boundary of the object in the image + setObjectBoundary(cv::boundingRect(imageArray[maxAreaContour])); + /// Draw the rectangle using the bounding box + cv::rectangle(convertedImage, getObjectBoundary(), cv::Scalar(255, 0, 0), 2); } - cv::normalize( result, result, 0, 1, 32, -1, cv::Mat()); - return true; -} + /// Mask image to limit the future turns affecting the output + maskImage(cv::Rect(0.7*imageSize.width, 0, \ + 0.3*imageSize.width, imageSize.height)) = 0; + maskImage(cv::Rect(0, 0, 0.3*imageSize.width, imageSize.height)) = 0; -cv::Rect ObjectDetection::getObjectLocation() { - cv::minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, cv::Mat()); - matchLoc = maxLoc; - objectBoundary.x = matchLoc.x; - objectBoundary.y = matchLoc.y; - objectBoundary.width = templ.cols; - objectBoundary.height = templ.rows; - cv::rectangle(result, objectBoundary, cv::Scalar(255, 0, 0) ); - return objectBoundary; -} + if (cv::countNonZero(maskImage) == 0) { + setObjectDetected(true); + } else { + setObjectDetected(false); + } -ObjectDetection::~ObjectDetection() { + return getObjectDetected(); } + +cv::Mat ObjectDetection::applyGaussBlur() { + cv::Mat output; + /// Apply gaussian filter + cv::GaussianBlur(convertedImage, output, cv::Size(3, 3), 0.1, 0.1); + return output; +} \ No newline at end of file From 3335a0068bbe4899b5641f520623fe7ab5f4e666 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Mon, 9 Dec 2019 04:12:30 -0500 Subject: [PATCH 36/62] [Task 3,1] Update turtlebot with object detection methods --- src/turtlebot.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/turtlebot.cpp b/src/turtlebot.cpp index 9b19399..67fde6b 100644 --- a/src/turtlebot.cpp +++ b/src/turtlebot.cpp @@ -96,11 +96,8 @@ void Turtlebot::moveBot(ObstacleAvoidance& obstacleAvoidance, ObjectDetection& o // Set the publishing rate ros::Rate loop_rate(publishRate); while (ros::ok()) { - /* - if(objectDetection.templateMatching()) { - objectDetection.getObjectLocation(); - } - */ + //objectDetection.applyGaussBlur(); + //objectDetection.detectObject(); if (obstacleAvoidance.checkObstacle()) { ROS_DEBUG_STREAM("Inside obstacle detected"); /// Start turning the robot to avoid obstacles From 758ff9d28bfa2f57184b30e314bb6c3d9a821aaa Mon Sep 17 00:00:00 2001 From: Naman Gupta Date: Mon, 9 Dec 2019 05:55:52 -0500 Subject: [PATCH 37/62] [Task 3.3]Created a new node for object detection Created a new node called detector for object detection implementation. Obstacle Avoidance was not working simultaneously with Object Detection class --- CMakeLists.txt | 6 ++- include/object_detection/object_detection.h | 11 ++-- include/turtlebot/turtlebot.h | 2 +- launch/object_collection.launch | 11 ++-- src/detector.cpp | 56 +++++++++++++++++++++ src/main.cpp | 5 +- src/object_detection.cpp | 26 +++++----- src/turtlebot.cpp | 4 +- 8 files changed, 94 insertions(+), 27 deletions(-) create mode 100644 src/detector.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index d5b160d..9b8701a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,10 +28,13 @@ include_directories( ) ## Add executables -add_executable(object_collection src/turtlebot.cpp src/obstacle_avoidance.cpp src/object_detection.cpp src/main.cpp) +add_executable(object_collection src/turtlebot.cpp src/obstacle_avoidance.cpp src/main.cpp) + +add_executable(detector src/object_detection.cpp src/detector.cpp) ## Add target link libraries target_link_libraries(object_collection ${catkin_LIBRARIES} ${OpenCV_LIBS}) +target_link_libraries(detector ${catkin_LIBRARIES} ${OpenCV_LIBS}) ## Enable catkin test and add files for the same if(CATKIN_ENABLE_TESTING) @@ -56,5 +59,6 @@ if(CATKIN_ENABLE_TESTING) add_dependencies( test_project_x_robot object_collection + detector ${catkin_EXPORTED_TARGETS}) endif() \ No newline at end of file diff --git a/include/object_detection/object_detection.h b/include/object_detection/object_detection.h index 74cf677..9520397 100644 --- a/include/object_detection/object_detection.h +++ b/include/object_detection/object_detection.h @@ -47,9 +47,10 @@ class ObjectDetection { /// Define the main access point to communications with the ROS system ros::NodeHandle nh; /// Define a subscriber object to data of the laser sensor - ros::Subscriber subscibeImages; + ros::Subscriber subscribeImages; /// Store copy of the ros image converted into cv image - cv::Mat convertedImage; + + cv::Mat hsvImage, maskImage; /// Define object coordinates cv::Rect objectBoundary; @@ -69,6 +70,8 @@ class ObjectDetection { * @param none * @return a constructor has no return */ + cv::Mat cvtImage; + cv::Mat img_filt; /// Filtered image in opencv matrix format ObjectDetection(); /** @@ -91,14 +94,14 @@ class ObjectDetection { * @param converted opencv image * @return match found */ - bool detectObject(); + bool detectObject(cv::Mat image); /** * @brief Method to gaussian filter on the image * @param converted opencv image * @return image blurred using gaussian filter */ - cv::Mat applyGaussBlur(); + cv::Mat applyGaussBlur(cv::Mat cvtImage); /** * @brief Get boundary of the object in the image diff --git a/include/turtlebot/turtlebot.h b/include/turtlebot/turtlebot.h index 711372b..5c47fb1 100644 --- a/include/turtlebot/turtlebot.h +++ b/include/turtlebot/turtlebot.h @@ -118,7 +118,7 @@ class Turtlebot { * @detail Use obstacle avoidance and go-to-goal strategies * to move towards the object to be collected */ - void moveBot(ObstacleAvoidance& obstacleAvoidance, ObjectDetection& objectDetection); + void moveBot(ObstacleAvoidance& obstacleAvoidance); /** * @brief Reset the velocities of the bot diff --git a/launch/object_collection.launch b/launch/object_collection.launch index 452e2d7..d81a5d9 100644 --- a/launch/object_collection.launch +++ b/launch/object_collection.launch @@ -1,8 +1,4 @@ - @@ -16,4 +12,11 @@ output = "screen" launch-prefix = "xterm -e" /> + + diff --git a/src/detector.cpp b/src/detector.cpp new file mode 100644 index 0000000..c3f3202 --- /dev/null +++ b/src/detector.cpp @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2019, Naman Gupta + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + *@file listener.cpp + *@author Naman Gupta + *@copyright GNU + *@brief ROS subscriber subscribes to talker.cpp to listen the message + * sent by the publisher node. + */ + +#include +#include "object_detection/object_detection.h" + +int main(int argc, char **argv) { + + ros::init(argc, argv, "detector"); + ObjectDetection objDet; + + while (ros::ok()) { + if (!objDet.cvtImage.empty()) { + objDet.img_filt = objDet.applyGaussBlur(objDet.cvtImage); + } + ros::spinOnce(); + } + return 0; +} diff --git a/src/main.cpp b/src/main.cpp index 48ae41a..987fc17 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -39,7 +39,6 @@ */ #include "ros/ros.h" #include "turtlebot/turtlebot.h" -#include "object_detection/object_detection.h" #include "obstacle_avoidance/obstacle_avoidance.h" /** @@ -51,8 +50,8 @@ int main(int argc, char* argv[]) { ros::init(argc, argv, "object_collection"); ObstacleAvoidance obstacleAvoidance; - ObjectDetection objectDetection; + // ObjectDetection objectDetection; Turtlebot turtlebot; - turtlebot.moveBot(obstacleAvoidance, objectDetection); + turtlebot.moveBot(obstacleAvoidance); return 0; } diff --git a/src/object_detection.cpp b/src/object_detection.cpp index 3341dab..54c2c31 100644 --- a/src/object_detection.cpp +++ b/src/object_detection.cpp @@ -43,16 +43,16 @@ #include "opencv2/imgproc/imgproc.hpp" ObjectDetection::ObjectDetection() { - subscibeImages = nh.subscribe("/camera/rgb/image_raw", 1, + subscribeImages = nh.subscribe("/camera/rgb/image_raw", 1, &ObjectDetection::convertImage, this); } -ObjectDetection::~ObjectDetection() { -} - void ObjectDetection::convertImage(const sensor_msgs::Image::ConstPtr& imageData) { + cv_bridge::CvImagePtr cv_ptr; try { - convertedImage = cv_bridge::toCvCopy(imageData, "bgr8")->image; + cv_ptr = cv_bridge::toCvCopy(imageData, sensor_msgs::image_encodings::BGR8); + cvtImage = cv_ptr->image; + cv::waitKey(30); } catch (cv_bridge::Exception& e) { ROS_ERROR_STREAM("cv_bridge exception: " << e.what()); @@ -60,13 +60,13 @@ void ObjectDetection::convertImage(const sensor_msgs::Image::ConstPtr& imageData } } -bool ObjectDetection::detectObject() { +bool ObjectDetection::detectObject(cv::Mat image) { /// Convert image from bgr to hsv - cv::cvtColor(convertedImage, hsvImage, CV_BGR2HSV); + cv::cvtColor(image, hsvImage, CV_BGR2HSV); /// Detect hsv within the set limits cv::inRange(hsvImage, colorLowerLimit, colorUpperLimit, maskImage); /// Get image size to modify size of mask image - imageSize = convertedImage.size(); + imageSize = image.size(); maskImage(cv::Rect(0, 0, imageSize.width, 0.8*imageSize.height)) = 0; /// Find contours for better visualization cv::findContours(maskImage, imageArray, CV_RETR_LIST, CV_CHAIN_APPROX_NONE); @@ -86,7 +86,7 @@ bool ObjectDetection::detectObject() { /// Set boundary of the object in the image setObjectBoundary(cv::boundingRect(imageArray[maxAreaContour])); /// Draw the rectangle using the bounding box - cv::rectangle(convertedImage, getObjectBoundary(), cv::Scalar(255, 0, 0), 2); + rectangle(image, getObjectBoundary(), cv::Scalar(255, 0, 0), 2); } /// Mask image to limit the future turns affecting the output maskImage(cv::Rect(0.7*imageSize.width, 0, \ @@ -102,9 +102,11 @@ bool ObjectDetection::detectObject() { return getObjectDetected(); } -cv::Mat ObjectDetection::applyGaussBlur() { +cv::Mat ObjectDetection::applyGaussBlur(cv::Mat cvtImage) { cv::Mat output; /// Apply gaussian filter - cv::GaussianBlur(convertedImage, output, cv::Size(3, 3), 0.1, 0.1); + cv::GaussianBlur(cvtImage, output, cv::Size(3, 3), 0.1, 0.1); return output; -} \ No newline at end of file +} + +ObjectDetection::~ObjectDetection() {} diff --git a/src/turtlebot.cpp b/src/turtlebot.cpp index 67fde6b..382b2d3 100644 --- a/src/turtlebot.cpp +++ b/src/turtlebot.cpp @@ -92,12 +92,12 @@ bool Turtlebot::collectObject() { return false; } -void Turtlebot::moveBot(ObstacleAvoidance& obstacleAvoidance, ObjectDetection& objectDetection) { +void Turtlebot::moveBot(ObstacleAvoidance& obstacleAvoidance) { // Set the publishing rate ros::Rate loop_rate(publishRate); while (ros::ok()) { //objectDetection.applyGaussBlur(); - //objectDetection.detectObject(); + //objectDetection.detectObject(objectDetection.applyGaussBlur()); if (obstacleAvoidance.checkObstacle()) { ROS_DEBUG_STREAM("Inside obstacle detected"); /// Start turning the robot to avoid obstacles From 5b589b4d70e3fffa2ab3d502f4f8f9f762f265f5 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Mon, 9 Dec 2019 07:11:33 -0500 Subject: [PATCH 38/62] [Task 3.1] Remove object detection calls from turtlebot Make turtlebot independent of object detection --- src/turtlebot.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/turtlebot.cpp b/src/turtlebot.cpp index 382b2d3..e6fdb0c 100644 --- a/src/turtlebot.cpp +++ b/src/turtlebot.cpp @@ -96,10 +96,7 @@ void Turtlebot::moveBot(ObstacleAvoidance& obstacleAvoidance) { // Set the publishing rate ros::Rate loop_rate(publishRate); while (ros::ok()) { - //objectDetection.applyGaussBlur(); - //objectDetection.detectObject(objectDetection.applyGaussBlur()); if (obstacleAvoidance.checkObstacle()) { - ROS_DEBUG_STREAM("Inside obstacle detected"); /// Start turning the robot to avoid obstacles turn(angularVelocity); /// Check if velocities have changed From e88024cfe2e5f70da763bbe33b1b0ca23f28894a Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Mon, 9 Dec 2019 07:12:48 -0500 Subject: [PATCH 39/62] [Task 3.3] Add separate node for object detection Turtlebot no longer dependent on object detection --- include/object_detection/object_detection.h | 13 +++++++++---- src/detector.cpp | 10 ++++++---- src/object_detection.cpp | 13 ++++++++----- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/include/object_detection/object_detection.h b/include/object_detection/object_detection.h index 9520397..ec863a6 100644 --- a/include/object_detection/object_detection.h +++ b/include/object_detection/object_detection.h @@ -56,8 +56,8 @@ class ObjectDetection { cv::Rect objectBoundary; /// Define upper and lower limit of color /// Defined red as coca-cola can is red in color - const cv::Scalar colorLowerLimit = {0, 0, 100}; - const cv::Scalar colorUpperLimit = {0, 0, 255}; + const cv::Scalar colorLowerLimit = {170, 50, 50}; + const cv::Scalar colorUpperLimit = {255, 200, 90}; /// size of an image cv::Size imageSize; /// Define image array for contours @@ -70,8 +70,6 @@ class ObjectDetection { * @param none * @return a constructor has no return */ - cv::Mat cvtImage; - cv::Mat img_filt; /// Filtered image in opencv matrix format ObjectDetection(); /** @@ -81,6 +79,13 @@ class ObjectDetection { */ ~ObjectDetection(); + /** + * @brief converted image from ros to opencv + * @param none + * @return none + */ + cv::Mat convertedImage; + /** * @brief Callback function for image data * @param image data from camera node diff --git a/src/detector.cpp b/src/detector.cpp index c3f3202..b3b2e43 100644 --- a/src/detector.cpp +++ b/src/detector.cpp @@ -31,9 +31,8 @@ */ /** - *@file listener.cpp + *@file detector.cpp *@author Naman Gupta - *@copyright GNU *@brief ROS subscriber subscribes to talker.cpp to listen the message * sent by the publisher node. */ @@ -47,10 +46,13 @@ int main(int argc, char **argv) { ObjectDetection objDet; while (ros::ok()) { - if (!objDet.cvtImage.empty()) { - objDet.img_filt = objDet.applyGaussBlur(objDet.cvtImage); + if (!objDet.convertedImage.empty()) { + objDet.detectObject(objDet.applyGaussBlur(objDet.convertedImage)); } ros::spinOnce(); } + + cv::destroyWindow("HSVImage"); + cv::destroyWindow("Turtlebot View"); return 0; } diff --git a/src/object_detection.cpp b/src/object_detection.cpp index 54c2c31..4283263 100644 --- a/src/object_detection.cpp +++ b/src/object_detection.cpp @@ -43,15 +43,17 @@ #include "opencv2/imgproc/imgproc.hpp" ObjectDetection::ObjectDetection() { + ROS_INFO_STREAM("Initiliazing obejct detection..."); subscribeImages = nh.subscribe("/camera/rgb/image_raw", 1, &ObjectDetection::convertImage, this); + ROS_INFO_STREAM("Object detection set up complete"); } void ObjectDetection::convertImage(const sensor_msgs::Image::ConstPtr& imageData) { cv_bridge::CvImagePtr cv_ptr; try { cv_ptr = cv_bridge::toCvCopy(imageData, sensor_msgs::image_encodings::BGR8); - cvtImage = cv_ptr->image; + convertedImage = cv_ptr->image; cv::waitKey(30); } catch (cv_bridge::Exception& e) { @@ -86,11 +88,9 @@ bool ObjectDetection::detectObject(cv::Mat image) { /// Set boundary of the object in the image setObjectBoundary(cv::boundingRect(imageArray[maxAreaContour])); /// Draw the rectangle using the bounding box - rectangle(image, getObjectBoundary(), cv::Scalar(255, 0, 0), 2); + rectangle(image, getObjectBoundary(), cv::Scalar(0, 255, 0), 2); } /// Mask image to limit the future turns affecting the output - maskImage(cv::Rect(0.7*imageSize.width, 0, \ - 0.3*imageSize.width, imageSize.height)) = 0; maskImage(cv::Rect(0, 0, 0.3*imageSize.width, imageSize.height)) = 0; if (cv::countNonZero(maskImage) == 0) { @@ -98,7 +98,10 @@ bool ObjectDetection::detectObject(cv::Mat image) { } else { setObjectDetected(false); } - + cv::namedWindow("HSVImage"); + cv::namedWindow("Turtlebot View"); + imshow("HSVImage", hsvImage); + imshow("Turtlebot View", image); return getObjectDetected(); } From 9bd28db2e19a37be28e6761415fdfcd4681862e0 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Mon, 9 Dec 2019 07:18:18 -0500 Subject: [PATCH 40/62] [Task 3.6] Remove object detection dependency from navigator Rename main to navigator --- src/{main.cpp => navigator.cpp} | 1 - 1 file changed, 1 deletion(-) rename src/{main.cpp => navigator.cpp} (98%) diff --git a/src/main.cpp b/src/navigator.cpp similarity index 98% rename from src/main.cpp rename to src/navigator.cpp index 987fc17..6c79713 100644 --- a/src/main.cpp +++ b/src/navigator.cpp @@ -50,7 +50,6 @@ int main(int argc, char* argv[]) { ros::init(argc, argv, "object_collection"); ObstacleAvoidance obstacleAvoidance; - // ObjectDetection objectDetection; Turtlebot turtlebot; turtlebot.moveBot(obstacleAvoidance); return 0; From 5baf92961577bf28c528658cb120824f2f6d3610 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Mon, 9 Dec 2019 07:20:35 -0500 Subject: [PATCH 41/62] [Task 3.12] Increase object population for demo --- data/worlds/supermarket.world | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/data/worlds/supermarket.world b/data/worlds/supermarket.world index 765a01c..9934702 100644 --- a/data/worlds/supermarket.world +++ b/data/worlds/supermarket.world @@ -9474,11 +9474,14 @@ model://coke_can + + Gazebo/Blue + 0 0 0 0 0 0 - 10 10 0.01 + 15 15 0.01 - 20 + 60 random From bd003dc37c03ee32c44e95b93f8de806d19d7eb6 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Mon, 9 Dec 2019 08:33:43 -0500 Subject: [PATCH 42/62] [Task 3.3] Remove unnecessary headers and change doxygen comments --- include/object_detection/object_detection.h | 2 +- src/object_detection.cpp | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/include/object_detection/object_detection.h b/include/object_detection/object_detection.h index ec863a6..5f599f9 100644 --- a/include/object_detection/object_detection.h +++ b/include/object_detection/object_detection.h @@ -96,7 +96,7 @@ class ObjectDetection { /** * @brief Method to detect object using hsv - * @param converted opencv image + * @param image gaussian filtered image * @return match found */ bool detectObject(cv::Mat image); diff --git a/src/object_detection.cpp b/src/object_detection.cpp index 4283263..e8fd565 100644 --- a/src/object_detection.cpp +++ b/src/object_detection.cpp @@ -33,8 +33,6 @@ * @detail Implements object detection using HSV */ -#include -#include #include "ros/ros.h" #include "sensor_msgs/Image.h" #include "cv_bridge/cv_bridge.h" From fb8819fa0dc1ab907b40af88cea695a697ed90f6 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Mon, 9 Dec 2019 08:35:25 -0500 Subject: [PATCH 43/62] [Task 3.15] Add test cases for object detection --- test/object_detection_test.cpp | 81 ++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 test/object_detection_test.cpp diff --git a/test/object_detection_test.cpp b/test/object_detection_test.cpp new file mode 100644 index 0000000..76ae9e5 --- /dev/null +++ b/test/object_detection_test.cpp @@ -0,0 +1,81 @@ +/** + * BSD 3-Clause License + * + * @copyright (c) 2019, Naman Gupta, Umang Rastogi + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file obstacle_detection_test.cpp + * @author Naman Gupta - Navigator + * @author Umang Rastogi - Driver + * @brief Class test implementation of class ObstacleAvoidance + * @details Test the methods of class ObstacleAvoidance + */ +#include +#include +#include +#include "opencv2/opencv.hpp" + +/** + * @brief Test to check getters and setters + */ +TEST(ObjectDetectionTest, objectNotDetected) { + ObjectDetection objectDetection; + objectDetection.setObjectDetected(false); + EXPECT_FALSE(objectDetection.getObjectDetected()); +} + +/** + * @brief Test to check getters and setters + */ +TEST(ObjectDetectionTest, objectDetected) { + ObjectDetection objectDetection; + objectDetection.setObjectDetected(true); + EXPECT_TRUE(objectDetection.getObjectDetected()); +} + +/** + * @brief Test to check setting of object boundary + */ +TEST(ObjectDetectionTest, setBoundary) { + ObjectDetection objectDetection; + /// Define object boundary + cv::Rect boundingBox = {0, 21, 113, 56}; + objectDetection.setObjectBoundary(boundingBox); + EXPECT_EQ(objectDetection.getObjectBoundary(), boundingBox); +} + +/** + * @brief Test to check object detection using hsv + */ +TEST(ObjectDetectionTest, checkObject) { + ObjectDetection objectDetection; + bool objectDetected; + if (!objectDetection.convertedImage.empty()) { + objectDetected = objectDetection.detectObject( + objectDetection.applyGaussBlur(objectDetection.convertedImage)); + } + EXPECT_FALSE(objectDetected); +} \ No newline at end of file From 2fa5a317958b2e50b4269837ee1413654165ad43 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Mon, 9 Dec 2019 08:36:37 -0500 Subject: [PATCH 44/62] [Task 3.6] Update CMakeLists and test launch file to run tests --- CMakeLists.txt | 6 ++++-- test/project_x_test.launch | 24 ++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9b8701a..019e78d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,7 +28,7 @@ include_directories( ) ## Add executables -add_executable(object_collection src/turtlebot.cpp src/obstacle_avoidance.cpp src/main.cpp) +add_executable(object_collection src/turtlebot.cpp src/obstacle_avoidance.cpp src/navigator.cpp) add_executable(detector src/object_detection.cpp src/detector.cpp) @@ -48,8 +48,10 @@ if(CATKIN_ENABLE_TESTING) test/main.cpp test/obstacle_avoidance_test.cpp test/turtlebot_test.cpp + test/object_detection_test.cpp src/obstacle_avoidance.cpp - src/turtlebot.cpp) + src/turtlebot.cpp + src/object_detection.cpp) target_link_libraries( test_project_x_robot diff --git a/test/project_x_test.launch b/test/project_x_test.launch index 73b6663..db61bf4 100644 --- a/test/project_x_test.launch +++ b/test/project_x_test.launch @@ -1,5 +1,25 @@ - \ No newline at end of file + test-name="test_project_x_robot" + /> + + + + + + + + + From a44560d413096952cf52299ac20e69778a60f64b Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Mon, 9 Dec 2019 08:53:48 -0500 Subject: [PATCH 45/62] [Task 3.8] Fix travis issues --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a9b3fb4..19f2446 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,7 +31,8 @@ before_install: # Install ROS-Base: (Bare Bones) ROS package, build, and communication libraries. No GUI tools. - sudo apt-get install -y --allow-unauthenticated ros-$ROS_DISTRO-ros-base # Install package dependencies - - sudo apt-get install -y --allow-unauthenticated ros-$ROS_DISTRO-move-base ros-$ROS_DISTRO-geometry-msgs ros-$ROS_DISTRO-sensor-msgs ros-$ROS_DISTRO-cv-bridge ros-$ROS_DISTRO-image-transport + - sudo apt-get install -y --allow-unauthenticated ros-$ROS_DISTRO-turtlebot ros-$ROS_DISTRO-turtlebot-apps ros-$ROS_DISTRO-turtlebot-interactions ros-$ROS_DISTRO-turtlebot-simulator ros-$ROS_DISTRO-kobuki-ftdi + - sudo apt-get install -y --allow-unauthenticated ros-$ROS_DISTRO-move-base ros-$ROS_DISTRO-geometry-msgs ros-$ROS_DISTRO-sensor-msgs ros-$ROS_DISTRO-cv-bridge # Source ros kinetic setup file - source /opt/ros/$ROS_DISTRO/setup.bash # Prepare rosdep to install dependencies. From 145f4bffb9deac42f9d4d3c05c74501c35eafd95 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Mon, 9 Dec 2019 09:02:12 -0500 Subject: [PATCH 46/62] [Task 3.8] Fix travis issues --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 19f2446..c437ab5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,7 +31,7 @@ before_install: # Install ROS-Base: (Bare Bones) ROS package, build, and communication libraries. No GUI tools. - sudo apt-get install -y --allow-unauthenticated ros-$ROS_DISTRO-ros-base # Install package dependencies - - sudo apt-get install -y --allow-unauthenticated ros-$ROS_DISTRO-turtlebot ros-$ROS_DISTRO-turtlebot-apps ros-$ROS_DISTRO-turtlebot-interactions ros-$ROS_DISTRO-turtlebot-simulator ros-$ROS_DISTRO-kobuki-ftdi + - sudo apt-get install -y --allow-unauthenticated ros-$ROS_DISTRO-turtlebot-gazebo ros-$ROS_DISTRO-turtlebot-apps ros-$ROS_DISTRO-turtlebot-rviz-launchers - sudo apt-get install -y --allow-unauthenticated ros-$ROS_DISTRO-move-base ros-$ROS_DISTRO-geometry-msgs ros-$ROS_DISTRO-sensor-msgs ros-$ROS_DISTRO-cv-bridge # Source ros kinetic setup file - source /opt/ros/$ROS_DISTRO/setup.bash From dcd791e36e448064fa546e4fc6aeb61c6653d780 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Mon, 9 Dec 2019 09:11:22 -0500 Subject: [PATCH 47/62] [Task 3.8] Fix travis issues --- .travis.yml | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index c437ab5..180ac31 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,19 +20,24 @@ before_install: - sudo sh -c "echo \"deb http://packages.ros.org/ros/ubuntu $ROS_CI_DESKTOP main\" > /etc/apt/sources.list.d/ros-latest.list" - sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116 - sudo apt-get update -qq - - sudo apt-get install dpkg + - sudo apt-get install dpkg lcov - sudo apt-get install -y --allow-unauthenticated python-catkin-pkg python-rosdep python-wstool - # Add opencv support in ROS - #- sudo apt-get install libopencv-dev - # install lcov to generate code coverage data - - sudo apt-get install -y lcov # Needed to install coveralls-lcov to upload coverage information generated by LCOV to coveralls.io - gem install coveralls-lcov # Install ROS-Base: (Bare Bones) ROS package, build, and communication libraries. No GUI tools. - sudo apt-get install -y --allow-unauthenticated ros-$ROS_DISTRO-ros-base # Install package dependencies - - sudo apt-get install -y --allow-unauthenticated ros-$ROS_DISTRO-turtlebot-gazebo ros-$ROS_DISTRO-turtlebot-apps ros-$ROS_DISTRO-turtlebot-rviz-launchers - - sudo apt-get install -y --allow-unauthenticated ros-$ROS_DISTRO-move-base ros-$ROS_DISTRO-geometry-msgs ros-$ROS_DISTRO-sensor-msgs ros-$ROS_DISTRO-cv-bridge + - sudo apt-get install -y --allow-unauthenticated libusb-1.0-0-dev dkms linux-headers-generic + - sudo apt-get download ros-kinetic-librealsense + - sudo dpkg --unpack ros-kinetic-librealsense*.deb + - sudo sed -i "s/\"(1,\"/\"(0,\"/g" /var/lib/dpkg/info/ros-kinetic-librealsense.postinst + - sudo dpkg --configure ros-kinetic-librealsense + - sudo apt-get install -yf + # Get matching gazebo + - sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-stable.list' + - wget http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add - + - sudo apt-get update + - sudo apt-get install gazebo7 # Source ros kinetic setup file - source /opt/ros/$ROS_DISTRO/setup.bash # Prepare rosdep to install dependencies. From 13a77cf7bb51c74b0ccc953354d345d55319d5a8 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Mon, 9 Dec 2019 09:15:34 -0500 Subject: [PATCH 48/62] [Task 3.8] Fix travis issues by authenticating librealsense --- .travis.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 180ac31..c1d1a7d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,17 +21,16 @@ before_install: - sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116 - sudo apt-get update -qq - sudo apt-get install dpkg lcov - - sudo apt-get install -y --allow-unauthenticated python-catkin-pkg python-rosdep python-wstool + # Install ROS-Base: (Bare Bones) ROS package, build, and communication libraries. No GUI tools. + - sudo apt-get install -y --allow-unauthenticated python-catkin-pkg python-rosdep python-wstool ros-$ROS_DISTRO-ros-base # Needed to install coveralls-lcov to upload coverage information generated by LCOV to coveralls.io - gem install coveralls-lcov - # Install ROS-Base: (Bare Bones) ROS package, build, and communication libraries. No GUI tools. - - sudo apt-get install -y --allow-unauthenticated ros-$ROS_DISTRO-ros-base # Install package dependencies - sudo apt-get install -y --allow-unauthenticated libusb-1.0-0-dev dkms linux-headers-generic - - sudo apt-get download ros-kinetic-librealsense - - sudo dpkg --unpack ros-kinetic-librealsense*.deb - - sudo sed -i "s/\"(1,\"/\"(0,\"/g" /var/lib/dpkg/info/ros-kinetic-librealsense.postinst - - sudo dpkg --configure ros-kinetic-librealsense + - sudo apt-get download -y --allow-unauthenticated ros-$ROS_DISTRO-librealsense + - sudo dpkg --unpack ros-$ROS_DISTRO-librealsense*.deb + - sudo sed -i "s/\"(1,\"/\"(0,\"/g" /var/lib/dpkg/info/ros-$ROS_DISTRO-librealsense.postinst + - sudo dpkg --configure ros-$ROS_DISTRO-librealsense - sudo apt-get install -yf # Get matching gazebo - sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-stable.list' From dfd94067cecb3e911e6322631d34a94355b3387a Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Mon, 9 Dec 2019 09:21:20 -0500 Subject: [PATCH 49/62] [Task 3.8] Fix travis issues by adding package dependencies --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index c1d1a7d..e700d3d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,6 +32,7 @@ before_install: - sudo sed -i "s/\"(1,\"/\"(0,\"/g" /var/lib/dpkg/info/ros-$ROS_DISTRO-librealsense.postinst - sudo dpkg --configure ros-$ROS_DISTRO-librealsense - sudo apt-get install -yf + - sudo apt-get install -y --allow-unauthenticated ros-$ROS_DISTRO-move-base ros-$ROS_DISTRO-geometry-msgs ros-$ROS_DISTRO-sensor-msgs ros-$ROS_DISTRO-cv-bridge # Get matching gazebo - sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-stable.list' - wget http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add - From ed09c1150c8601637dbf0a195ee3ed7ccdad2200 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Mon, 9 Dec 2019 09:27:19 -0500 Subject: [PATCH 50/62] [Task 3.8] Fix package.xml by removing image transport image-transport library no longer needed --- package.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/package.xml b/package.xml index df3d1ad..c44f77f 100644 --- a/package.xml +++ b/package.xml @@ -57,7 +57,6 @@ sensor_msgs std_msgs cv_bridge - image_transport std_msgs geometry_msgs @@ -66,7 +65,6 @@ sensor_msgs std_msgs cv_bridge - image_transport std_msgs geometry_msgs @@ -75,7 +73,6 @@ sensor_msgs std_msgs cv_bridge - image_transport std_msgs From 52a1fa4ad22eb05635fbd0e4172b1ddff91c2b48 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Mon, 9 Dec 2019 09:35:42 -0500 Subject: [PATCH 51/62] [Task 3.8] Fix travis build --- .travis.yml | 3 ++- package.xml | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index e700d3d..dc349ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,7 +32,8 @@ before_install: - sudo sed -i "s/\"(1,\"/\"(0,\"/g" /var/lib/dpkg/info/ros-$ROS_DISTRO-librealsense.postinst - sudo dpkg --configure ros-$ROS_DISTRO-librealsense - sudo apt-get install -yf - - sudo apt-get install -y --allow-unauthenticated ros-$ROS_DISTRO-move-base ros-$ROS_DISTRO-geometry-msgs ros-$ROS_DISTRO-sensor-msgs ros-$ROS_DISTRO-cv-bridge + # Install package dependencies + - sudo apt-get install -y --allow-unauthenticated ros-$ROS_DISTRO-move-base ros-$ROS_DISTRO-geometry-msgs ros-$ROS_DISTRO-sensor-msgs ros-$ROS_DISTRO-cv-bridge ros-$ROS_DISTRO-image-transport # Get matching gazebo - sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-stable.list' - wget http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add - diff --git a/package.xml b/package.xml index c44f77f..df3d1ad 100644 --- a/package.xml +++ b/package.xml @@ -57,6 +57,7 @@ sensor_msgs std_msgs cv_bridge + image_transport std_msgs geometry_msgs @@ -65,6 +66,7 @@ sensor_msgs std_msgs cv_bridge + image_transport std_msgs geometry_msgs @@ -73,6 +75,7 @@ sensor_msgs std_msgs cv_bridge + image_transport std_msgs From e52ac3fbf4c6494e5479a63e22ceba05b5d2f7f6 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Mon, 9 Dec 2019 09:57:22 -0500 Subject: [PATCH 52/62] [Task 3.8] Do not launch ros nodes for tests Other tests require launch of gazebo --- .travis.yml | 13 ------------- test/object_detection_test.cpp | 13 ------------- test/project_x_test.launch | 19 ------------------- 3 files changed, 45 deletions(-) diff --git a/.travis.yml b/.travis.yml index dc349ee..d8ce17e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,25 +26,12 @@ before_install: # Needed to install coveralls-lcov to upload coverage information generated by LCOV to coveralls.io - gem install coveralls-lcov # Install package dependencies - - sudo apt-get install -y --allow-unauthenticated libusb-1.0-0-dev dkms linux-headers-generic - - sudo apt-get download -y --allow-unauthenticated ros-$ROS_DISTRO-librealsense - - sudo dpkg --unpack ros-$ROS_DISTRO-librealsense*.deb - - sudo sed -i "s/\"(1,\"/\"(0,\"/g" /var/lib/dpkg/info/ros-$ROS_DISTRO-librealsense.postinst - - sudo dpkg --configure ros-$ROS_DISTRO-librealsense - - sudo apt-get install -yf - # Install package dependencies - sudo apt-get install -y --allow-unauthenticated ros-$ROS_DISTRO-move-base ros-$ROS_DISTRO-geometry-msgs ros-$ROS_DISTRO-sensor-msgs ros-$ROS_DISTRO-cv-bridge ros-$ROS_DISTRO-image-transport - # Get matching gazebo - - sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-stable.list' - - wget http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add - - - sudo apt-get update - - sudo apt-get install gazebo7 # Source ros kinetic setup file - source /opt/ros/$ROS_DISTRO/setup.bash # Prepare rosdep to install dependencies. - sudo rosdep init - rosdep update - # Install # Create a catkin workspace with the package under integration. diff --git a/test/object_detection_test.cpp b/test/object_detection_test.cpp index 76ae9e5..cd8d467 100644 --- a/test/object_detection_test.cpp +++ b/test/object_detection_test.cpp @@ -66,16 +66,3 @@ TEST(ObjectDetectionTest, setBoundary) { objectDetection.setObjectBoundary(boundingBox); EXPECT_EQ(objectDetection.getObjectBoundary(), boundingBox); } - -/** - * @brief Test to check object detection using hsv - */ -TEST(ObjectDetectionTest, checkObject) { - ObjectDetection objectDetection; - bool objectDetected; - if (!objectDetection.convertedImage.empty()) { - objectDetected = objectDetection.detectObject( - objectDetection.applyGaussBlur(objectDetection.convertedImage)); - } - EXPECT_FALSE(objectDetected); -} \ No newline at end of file diff --git a/test/project_x_test.launch b/test/project_x_test.launch index db61bf4..d6f8d84 100644 --- a/test/project_x_test.launch +++ b/test/project_x_test.launch @@ -3,23 +3,4 @@ type="test_project_x_robot" test-name="test_project_x_robot" /> - - - - - - - - From 4ac80e60c46aeb95747ce47eec85500e00b7b492 Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Mon, 9 Dec 2019 10:27:08 -0500 Subject: [PATCH 53/62] [Task 3.15] Add tests for 2 more methods objectDetect and applyGaussBlur method --- test/object_detection_test.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/test/object_detection_test.cpp b/test/object_detection_test.cpp index cd8d467..aed70b7 100644 --- a/test/object_detection_test.cpp +++ b/test/object_detection_test.cpp @@ -66,3 +66,33 @@ TEST(ObjectDetectionTest, setBoundary) { objectDetection.setObjectBoundary(boundingBox); EXPECT_EQ(objectDetection.getObjectBoundary(), boundingBox); } + +/** + * @brief Test to check gaussian filtering + */ +TEST(ObjectDetectionTest, gaussFilter) { + ObjectDetection objectDetection; + bool gaussCheck = true; + if (!objectDetection.convertedImage.empty()) { + cv::Mat gaussImg = objectDetection.applyGaussBlur( + objectDetection.convertedImage); + if(gaussImg.size() == objectDetection.convertedImage.size()) { + // These two images do not hace the same size due to smoothening + gaussCheck = false; + } + } + EXPECT_TRUE(gaussCheck); +} + +/** + * @brief Test to check object detection using hsv + */ +TEST(ObjectDetectionTest, checkObject) { + ObjectDetection objectDetection; + bool objectDetected; + if (!objectDetection.convertedImage.empty()) { + objectDetected = objectDetection.detectObject( + objectDetection.applyGaussBlur(objectDetection.convertedImage)); + } + EXPECT_FALSE(objectDetected); +} From 5371ed8c0a642d02f3814d5d6700c319e2b1c361 Mon Sep 17 00:00:00 2001 From: Naman Gupta Date: Mon, 9 Dec 2019 12:30:30 -0500 Subject: [PATCH 54/62] [Task 3.9]Fixed Cppcheck and Cpplint errors Errors such as blank white-space no endline space were fixed to resolve cpplint errors --- data/results/cppcheck_results | 18 +++++++++---- data/results/cpplint_results | 16 ++++++++++- include/object_detection/object_detection.h | 3 +-- src/detector.cpp | 1 - src/object_detection.cpp | 3 ++- src/obstacle_avoidance.cpp | 4 +-- src/turtlebot.cpp | 10 +++---- test/object_detection_test.cpp | 30 ++++++++++----------- test/obstacle_avoidance_test.cpp | 6 ++--- test/turtlebot_test.cpp | 14 +++++----- 10 files changed, 62 insertions(+), 43 deletions(-) diff --git a/data/results/cppcheck_results b/data/results/cppcheck_results index 474c6df..c4ab9df 100644 --- a/data/results/cppcheck_results +++ b/data/results/cppcheck_results @@ -1,10 +1,18 @@ +Checking src/detector.cpp... +1/9 files checked 7% done +Checking src/navigator.cpp... +2/9 files checked 14% done +Checking src/object_detection.cpp... +3/9 files checked 30% done Checking src/obstacle_avoidance.cpp... -1/5 files checked 26% done +4/9 files checked 43% done Checking src/turtlebot.cpp... -2/5 files checked 52% done +5/9 files checked 61% done Checking test/main.cpp... -3/5 files checked 66% done +6/9 files checked 68% done +Checking test/object_detection_test.cpp... +7/9 files checked 81% done Checking test/obstacle_avoidance_test.cpp... -4/5 files checked 82% done +8/9 files checked 90% done Checking test/turtlebot_test.cpp... -5/5 files checked 100% done \ No newline at end of file +9/9 files checked 100% done \ No newline at end of file diff --git a/data/results/cpplint_results b/data/results/cpplint_results index f19b3d2..60fd182 100644 --- a/data/results/cpplint_results +++ b/data/results/cpplint_results @@ -1,8 +1,22 @@ +Done processing ./src/detector.cpp +./src/turtlebot.cpp:141: Use operator && instead of and [readability/alt_tokens] [2] Done processing ./src/turtlebot.cpp +Done processing ./src/object_detection.cpp Done processing ./src/obstacle_avoidance.cpp +Done processing ./src/navigator.cpp Done processing ./test/turtlebot_test.cpp +./test/object_detection_test.cpp:78: Tab found; better to use spaces [whitespace/tab] [1] +./test/object_detection_test.cpp:79: Tab found; better to use spaces [whitespace/tab] [1] +./test/object_detection_test.cpp:80: Tab found; better to use spaces [whitespace/tab] [1] +./test/object_detection_test.cpp:81: Tab found; better to use spaces [whitespace/tab] [1] +./test/object_detection_test.cpp:82: Tab found; better to use spaces [whitespace/tab] [1] +./test/object_detection_test.cpp:94: Tab found; better to use spaces [whitespace/tab] [1] +./test/object_detection_test.cpp:95: Tab found; better to use spaces [whitespace/tab] [1] +Done processing ./test/object_detection_test.cpp Done processing ./test/main.cpp Done processing ./test/obstacle_avoidance_test.cpp Done processing ./include/object_detection/object_detection.h +./include/turtlebot/turtlebot.h:121: Is this a non-const reference? If so, make const or use a pointer: ObstacleAvoidance& obstacleAvoidance [runtime/references] [2] Done processing ./include/turtlebot/turtlebot.h -Done processing ./include/obstacle_avoidance/obstacle_avoidance.h \ No newline at end of file +Done processing ./include/obstacle_avoidance/obstacle_avoidance.h +Total errors found: 9 \ No newline at end of file diff --git a/include/object_detection/object_detection.h b/include/object_detection/object_detection.h index 5f599f9..dd0db5c 100644 --- a/include/object_detection/object_detection.h +++ b/include/object_detection/object_detection.h @@ -37,6 +37,7 @@ #ifndef INCLUDE_OBJECT_DETECTION_OBJECT_DETECTION_H_ #define INCLUDE_OBJECT_DETECTION_OBJECT_DETECTION_H_ +#include #include "ros/ros.h" #include "cv_bridge/cv_bridge.h" #include "opencv2/opencv.hpp" @@ -49,8 +50,6 @@ class ObjectDetection { /// Define a subscriber object to data of the laser sensor ros::Subscriber subscribeImages; /// Store copy of the ros image converted into cv image - - cv::Mat hsvImage, maskImage; /// Define object coordinates cv::Rect objectBoundary; diff --git a/src/detector.cpp b/src/detector.cpp index b3b2e43..24076d0 100644 --- a/src/detector.cpp +++ b/src/detector.cpp @@ -41,7 +41,6 @@ #include "object_detection/object_detection.h" int main(int argc, char **argv) { - ros::init(argc, argv, "detector"); ObjectDetection objDet; diff --git a/src/object_detection.cpp b/src/object_detection.cpp index e8fd565..b2745f8 100644 --- a/src/object_detection.cpp +++ b/src/object_detection.cpp @@ -47,7 +47,8 @@ ObjectDetection::ObjectDetection() { ROS_INFO_STREAM("Object detection set up complete"); } -void ObjectDetection::convertImage(const sensor_msgs::Image::ConstPtr& imageData) { +void ObjectDetection::convertImage(const + sensor_msgs::Image::ConstPtr& imageData) { cv_bridge::CvImagePtr cv_ptr; try { cv_ptr = cv_bridge::toCvCopy(imageData, sensor_msgs::image_encodings::BGR8); diff --git a/src/obstacle_avoidance.cpp b/src/obstacle_avoidance.cpp index 1797fa7..2096218 100644 --- a/src/obstacle_avoidance.cpp +++ b/src/obstacle_avoidance.cpp @@ -62,8 +62,6 @@ ObstacleAvoidance::ObstacleAvoidance(float distThreshold) { ROS_INFO_STREAM("Set up complete"); } -ObstacleAvoidance::~ObstacleAvoidance() {} - void ObstacleAvoidance::laserSensorCallback( const sensor_msgs::LaserScan::ConstPtr& sensorData) { /// Read sensor data to get obstacle distances with respect to the robot @@ -87,3 +85,5 @@ bool ObstacleAvoidance::checkObstacle() { return false; } + +ObstacleAvoidance::~ObstacleAvoidance() {} diff --git a/src/turtlebot.cpp b/src/turtlebot.cpp index e6fdb0c..ae7c149 100644 --- a/src/turtlebot.cpp +++ b/src/turtlebot.cpp @@ -51,7 +51,8 @@ Turtlebot::Turtlebot() { prevLinearVelocity = linearVelocity; prevAngularVelocity = angularVelocity; /// Publish the velocities to the robot on the navigation topic - publishVelocities = nh.advertise("/cmd_vel_mux/input/navi", 1000); + publishVelocities = nh.advertise + ("/cmd_vel_mux/input/navi", 1000); ROS_INFO_STREAM("Set up complete"); } @@ -64,7 +65,8 @@ Turtlebot::Turtlebot(float linVelX, float angVelZ) { prevLinearVelocity = linearVelocity; prevAngularVelocity = angularVelocity; /// Publish the velocities to the robot on the navigation topic - publishVelocities = nh.advertise("/cmd_vel_mux/input/navi", 1000); + publishVelocities = nh.advertise + ("/cmd_vel_mux/input/navi", 1000); ROS_INFO_STREAM("Set up complete"); } @@ -88,10 +90,6 @@ float Turtlebot::turn(float angVelZ) { return velocities.angular.z; } -bool Turtlebot::collectObject() { - return false; -} - void Turtlebot::moveBot(ObstacleAvoidance& obstacleAvoidance) { // Set the publishing rate ros::Rate loop_rate(publishRate); diff --git a/test/object_detection_test.cpp b/test/object_detection_test.cpp index aed70b7..7cc5518 100644 --- a/test/object_detection_test.cpp +++ b/test/object_detection_test.cpp @@ -42,8 +42,8 @@ * @brief Test to check getters and setters */ TEST(ObjectDetectionTest, objectNotDetected) { - ObjectDetection objectDetection; - objectDetection.setObjectDetected(false); + ObjectDetection objectDetection; + objectDetection.setObjectDetected(false); EXPECT_FALSE(objectDetection.getObjectDetected()); } @@ -51,7 +51,7 @@ TEST(ObjectDetectionTest, objectNotDetected) { * @brief Test to check getters and setters */ TEST(ObjectDetectionTest, objectDetected) { - ObjectDetection objectDetection; + ObjectDetection objectDetection; objectDetection.setObjectDetected(true); EXPECT_TRUE(objectDetection.getObjectDetected()); } @@ -60,9 +60,9 @@ TEST(ObjectDetectionTest, objectDetected) { * @brief Test to check setting of object boundary */ TEST(ObjectDetectionTest, setBoundary) { - ObjectDetection objectDetection; - /// Define object boundary - cv::Rect boundingBox = {0, 21, 113, 56}; + ObjectDetection objectDetection; + /// Define object boundary + cv::Rect boundingBox = {0, 21, 113, 56}; objectDetection.setObjectBoundary(boundingBox); EXPECT_EQ(objectDetection.getObjectBoundary(), boundingBox); } @@ -71,16 +71,16 @@ TEST(ObjectDetectionTest, setBoundary) { * @brief Test to check gaussian filtering */ TEST(ObjectDetectionTest, gaussFilter) { - ObjectDetection objectDetection; - bool gaussCheck = true; - if (!objectDetection.convertedImage.empty()) { - cv::Mat gaussImg = objectDetection.applyGaussBlur( + ObjectDetection objectDetection; + bool gaussCheck = true; + if (!objectDetection.convertedImage.empty()) { + cv::Mat gaussImg = objectDetection.applyGaussBlur( objectDetection.convertedImage); if(gaussImg.size() == objectDetection.convertedImage.size()) { // These two images do not hace the same size due to smoothening gaussCheck = false; } - } + } EXPECT_TRUE(gaussCheck); } @@ -88,11 +88,11 @@ TEST(ObjectDetectionTest, gaussFilter) { * @brief Test to check object detection using hsv */ TEST(ObjectDetectionTest, checkObject) { - ObjectDetection objectDetection; - bool objectDetected; - if (!objectDetection.convertedImage.empty()) { + ObjectDetection objectDetection; + bool objectDetected; + if (!objectDetection.convertedImage.empty()) { objectDetected = objectDetection.detectObject( objectDetection.applyGaussBlur(objectDetection.convertedImage)); - } + } EXPECT_FALSE(objectDetected); } diff --git a/test/obstacle_avoidance_test.cpp b/test/obstacle_avoidance_test.cpp index 479e464..6b779a0 100644 --- a/test/obstacle_avoidance_test.cpp +++ b/test/obstacle_avoidance_test.cpp @@ -58,8 +58,8 @@ TEST(ObstacleAvoidanceTest, obstacleDetected) { * @brief Test to check obstacle */ TEST(ObstacleAvoidanceTest, checkObstacle) { - /// Define distance threshold for obstacles - float distThresh = 0.5; + /// Define distance threshold for obstacles + float distThresh = 0.5; ObstacleAvoidance obstacle(distThresh); EXPECT_FALSE(obstacle.checkObstacle()); -} \ No newline at end of file +} diff --git a/test/turtlebot_test.cpp b/test/turtlebot_test.cpp index a465622..73272c1 100644 --- a/test/turtlebot_test.cpp +++ b/test/turtlebot_test.cpp @@ -51,9 +51,9 @@ TEST(TurtlebotTest, velocityChangedTest) { * @detail Test to check linear velocity provided to method */ TEST(TurtlebotTest, moveForwardTest) { - /// Define angular and linear velocities for the robot - float linVel = 2.0; - float angVel = 0.52; + /// Define angular and linear velocities for the robot + float linVel = 2.0; + float angVel = 0.52; Turtlebot turtle(linVel, angVel); EXPECT_EQ(linVel, turtle.moveForward(linVel)); } @@ -63,9 +63,9 @@ TEST(TurtlebotTest, moveForwardTest) { * @detail Test to check angular velocity provided to method */ TEST(TurtlebotTest, turnTest) { - /// Define angular and linear velocities for the robot - float linVel = 2.0; - float angVel = 0.52; + /// Define angular and linear velocities for the robot + float linVel = 2.0; + float angVel = 0.52; Turtlebot turtle(linVel, angVel); EXPECT_EQ(angVel, turtle.turn(angVel)); } @@ -76,4 +76,4 @@ TEST(TurtlebotTest, turnTest) { TEST(TurtlebotTest, resetTest) { Turtlebot turtle; EXPECT_TRUE(turtle.resetBot()); -} \ No newline at end of file +} From 8d7d63c5820b66ef7e20248a7a1e731f19697c20 Mon Sep 17 00:00:00 2001 From: Naman Gupta Date: Mon, 9 Dec 2019 13:58:46 -0500 Subject: [PATCH 55/62] [Task 3.10]Added Doxygen comments and inline comments --- include/object_detection/object_detection.h | 87 +++++++++---------- .../obstacle_avoidance/obstacle_avoidance.h | 55 ++++++------ include/turtlebot/turtlebot.h | 80 ++++++++--------- src/detector.cpp | 72 ++++++++------- src/navigator.cpp | 66 +++++++------- src/object_detection.cpp | 17 ++-- src/obstacle_avoidance.cpp | 20 ++--- src/turtlebot.cpp | 17 ++-- test/object_detection_test.cpp | 8 +- 9 files changed, 213 insertions(+), 209 deletions(-) diff --git a/include/object_detection/object_detection.h b/include/object_detection/object_detection.h index dd0db5c..060be76 100644 --- a/include/object_detection/object_detection.h +++ b/include/object_detection/object_detection.h @@ -1,7 +1,8 @@ /** * BSD 3-Clause License * - * @copyright (c) 2019, Umang Rastogi Naman Gupta + * @copyright (c) 2019, Umang Rastogi, Naman Gupta + * * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -27,7 +28,7 @@ */ /** - * @file object_detection.h + * @file object_detection.h * @author Umang Rastogi - Driver * @author Naman Gupta - Navigator * @brief Library header file to implement object detection @@ -54,91 +55,87 @@ class ObjectDetection { /// Define object coordinates cv::Rect objectBoundary; /// Define upper and lower limit of color - /// Defined red as coca-cola can is red in color + /// Set range as can visible in HSV image const cv::Scalar colorLowerLimit = {170, 50, 50}; const cv::Scalar colorUpperLimit = {255, 200, 90}; - /// size of an image + /// Size of an image cv::Size imageSize; /// Define image array for contours std::vector > imageArray; bool objectDetected; public: - /** - * @brief Constructor for object detection class - * @param none - * @return a constructor has no return - */ +/** + * @brief Constructor for object detection class + * @param none + * @return none + */ ObjectDetection(); - /** - * @brief Destructor for object detection class - * @param none - * @return none - */ +/** + * @brief Destructor for object detection class + * @param none + * @return none + */ ~ObjectDetection(); - /** - * @brief converted image from ros to opencv - * @param none - * @return none - */ + /// Container to store converted image from cv_bridge cv::Mat convertedImage; /** - * @brief Callback function for image data - * @param image data from camera node - * @return void - * @detail Convert ROS image message to CV image - */ + * @brief Callback function for image data + * @param Image data from camera node + * @return none + * @detail Convert ROS image message to CV image + */ void convertImage(const sensor_msgs::Image::ConstPtr& imageData); /** - * @brief Method to detect object using hsv - * @param image gaussian filtered image - * @return match found + * @brief Method to detect object using hsv + * @param Image gaussian filtered image of type cv::Mat + * @return Match found of type bool */ bool detectObject(cv::Mat image); /** - * @brief Method to gaussian filter on the image - * @param converted opencv image - * @return image blurred using gaussian filter + * @brief Method to convert gaussian filter on the image + * @param Converted opencv image of type cv::Mat + * @return Image blurred using gaussian filter of type cv::Mat */ cv::Mat applyGaussBlur(cv::Mat cvtImage); /** - * @brief Get boundary of the object in the image - * @param none - * @return rectangular box containing the object + * @brief Get boundary of the object in the image + * @param none + * @return rectangular box containing the object */ cv::Rect getObjectBoundary() const { return objectBoundary; } /** - * @brief set object boundary - * @param boundingBox reactagular boundary of the object - * @return void - */ + * @brief Set object boundary + * @param BoundingBox reactagular boundary of the object + * @return none + */ void setObjectBoundary(cv::Rect boundingBox) { objectBoundary = boundingBox; } /** - * @brief get object detected - * @param none - * @return object detected or not - */ + * @brief Get object detected + * @param none + * @return Object detected or not of type bool + */ bool getObjectDetected() const { return objectDetected; } /** - * @brief set object detected - * @param object detected status - * @return void - */ + * @brief Set object detected + * @param Object detected status + * @return none + */ void setObjectDetected(bool object) { objectDetected = object; } diff --git a/include/obstacle_avoidance/obstacle_avoidance.h b/include/obstacle_avoidance/obstacle_avoidance.h index d48ee73..0ca99ca 100644 --- a/include/obstacle_avoidance/obstacle_avoidance.h +++ b/include/obstacle_avoidance/obstacle_avoidance.h @@ -1,7 +1,8 @@ /** * BSD 3-Clause License * - * @copyright (c) 2019, Umang Rastogi Naman Gupta + * @copyright (c) 2019, Umang Rastogi, Naman Gupta + * * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -52,55 +53,55 @@ class ObstacleAvoidance { public: /** - * @brief Constructor for obstacle avoidance class - * @param none - * @return a constructor has no return + * @brief Constructor for obstacle avoidance class + * @param none + * @return none */ ObstacleAvoidance(); /** - * @brief Constructor for obstacle avoidance class - * @param safe distance from an obstacle - * @return a constructor has no return + * @brief Constructor for obstacle avoidance class + * @param Safe distance from an obstacle of type float + * @return none */ explicit ObstacleAvoidance(float distThreshold); /** - * @brief Destructor for obstacle avoidance class - * @param none - * @return a destrcutor has no return - */ + * @brief Destructor for obstacle avoidance class + * @param none + * @return none + */ ~ObstacleAvoidance(); /** - * @brief Callback function for subscriber - * @param messsage data from LaserScan node - * @return void - */ + * @brief Callback function for subscriber + * @param messsage data from LaserScan node + * @return none + */ void laserSensorCallback(const sensor_msgs::LaserScan::ConstPtr& \ sensorData); /** - * @brief Checks if obstacle is present within safe distance - * @param none - * @return boolean obstacle found or not - */ + * @brief Checks if obstacle is present within safe distance + * @param none + * @return Obstacle found or not of type bool + */ bool checkObstacle(); /** - * @brief get obstacle detected - * @param none - * @return boolean obstacle detected or not - */ + * @brief Gets obstacle detected + * @param none + * @return Status of obstacle detected or not of type bool + */ bool getObstacleDetected() const { return obstacleDetected; } /** - * @brief set obstacle detected - * @param obstacle detected status - * @return void - */ + * @brief Set obstacle detected + * @param Obstacle detected status + * @return none + */ void setObstacleDetected(bool obstacle) { obstacleDetected = obstacle; } diff --git a/include/turtlebot/turtlebot.h b/include/turtlebot/turtlebot.h index 5c47fb1..65b77fa 100644 --- a/include/turtlebot/turtlebot.h +++ b/include/turtlebot/turtlebot.h @@ -45,7 +45,6 @@ class Turtlebot { private: - // ObjectDetection objectDetection; /// Define the main access point to communications with the ROS system ros::NodeHandle nh; /// Define a publisher object to publish velocities for the robot @@ -61,75 +60,70 @@ class Turtlebot { /// Initialize publishing rate const int publishRate = 500; /// Obstacle detection and template matching variables - /* - const std::string opencvWindow = "image_window"; - const int maxTrackbar = 5; - int matchMethod; - char* trackbarLabel;*/ public: /** - * @brief Constructor for obstacle avoidance class - * @param none - * @return a constructor has no return - */ + * @brief Constructor for obstacle avoidance class + * @param none + * @return none + */ Turtlebot(); /** - * @brief Constructor for obstacle avoidance class - * @param linear velocity in x-axis - * @param angular velocity about z-axis - * @return a constructor has no return - */ + * @brief Constructor for obstacle avoidance class + * @param Linear velocity in x-axis + * @param Angular velocity about z-axis + * @return none + */ Turtlebot(float linVelX, float angVelZ); /** - * @brief Destructor for obstacle avoidance class - * @param none - * @return a destrcutor has no return - */ + * @brief Destructor for obstacle avoidance class + * @param none + * @return none + */ ~Turtlebot(); /** - * @brief Make the bot move forward - * @param linear velocity in x-direction - * @return linear velocity for the bot - */ + * @brief Make the bot move forward + * @param Linear velocity in x-direction + * @return Linear velocity for the bot + */ float moveForward(float linVelX); /** - * @brief Turn the bot - * @param angular velocity about z-axis - * @return angular velocity for the bot - */ + * @brief Turn the bot + * @param Angular velocity about z-axis + * @return Angular velocity for the bot + */ float turn(float angVelZ); /** - * @brief Collect the object - * @param none - * @return void - */ + * @brief Collect the object + * @param none + * @return void + */ bool collectObject(); /** - * @brief Control the motion of the bot - * @param none - * @return void - * @detail Use obstacle avoidance and go-to-goal strategies - * to move towards the object to be collected - */ + * @brief Control the motion of the bot + * @param Reference to Obstacle Avoidance class + * @return none + * @detail Use obstacle avoidance and go-to-goal strategies + * to move towards the object to be collected + */ void moveBot(ObstacleAvoidance& obstacleAvoidance); /** - * @brief Reset the velocities of the bot - * @param none - * @return void - */ + * @brief Reset the velocities of the bot + * @param none + * @return status of type bool + */ bool resetBot(); /** - * @brief Check change in the velocites of the bot - * @param none + * @brief Check change in the velocites of the bot + * @param none * @return boolean velocity changed or not */ bool checkVelocityChanged(); diff --git a/src/detector.cpp b/src/detector.cpp index 24076d0..9d628c5 100644 --- a/src/detector.cpp +++ b/src/detector.cpp @@ -1,56 +1,64 @@ /** - * Copyright (c) 2019, Naman Gupta + * BSD 3-Clause License * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * @copyright (c) 2019, Umang Rastogi, Naman Gupta + * + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** - *@file detector.cpp - *@author Naman Gupta - *@brief ROS subscriber subscribes to talker.cpp to listen the message - * sent by the publisher node. + * @file detector.cpp + * @author Umang Rastogi - Navigator + * @author Naman Gupta - Driver + * @brief Detector node file to implement object detection algorithm + * @detail Implements object detection algorithm using HSV color detection */ #include #include "object_detection/object_detection.h" +/** + * @brief main function + * @param argc + * @param argv + * @return int + */ int main(int argc, char **argv) { + /// Initialized object detection node ros::init(argc, argv, "detector"); + /// Declaring object of class ObjectDetection ObjectDetection objDet; while (ros::ok()) { + /// Checks empty image if (!objDet.convertedImage.empty()) { + /// Apply detectObject method to detect cans in the world objDet.detectObject(objDet.applyGaussBlur(objDet.convertedImage)); } ros::spinOnce(); } - + /// Close both the windows of HSVImage and Turtlebot View cv::destroyWindow("HSVImage"); cv::destroyWindow("Turtlebot View"); return 0; diff --git a/src/navigator.cpp b/src/navigator.cpp index 6c79713..0268569 100644 --- a/src/navigator.cpp +++ b/src/navigator.cpp @@ -1,42 +1,38 @@ /** - * Copyright (c) 2019, Naman Gupta, Umang Rastogi + * BSD 3-Clause License * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * @copyright (c) 2019, Naman Gupta, Umang Rastogi + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** - * @file main.cpp - * @author Naman Gupta - * @author Umang Rastogi - * @copyright GNU - * @brief Implementation of algorithm + * @file turtlebot.cpp + * @author Umang Rastogi - Driver + * @author Naman Gupta - Navigator + * @brief Navigator node to implement obstacle avoidance and move bot algorithm */ + #include "ros/ros.h" #include "turtlebot/turtlebot.h" #include "obstacle_avoidance/obstacle_avoidance.h" @@ -45,12 +41,16 @@ * @brief main function * @param argc * @param argv - * @return none + * @return int */ int main(int argc, char* argv[]) { + /// Initialized object collection node ros::init(argc, argv, "object_collection"); + /// Declaring object of class ObstacleAvoidance ObstacleAvoidance obstacleAvoidance; + /// Declaring object of class Turtlebot Turtlebot turtlebot; + /// Starts moving the bot turtlebot.moveBot(obstacleAvoidance); return 0; } diff --git a/src/object_detection.cpp b/src/object_detection.cpp index b2745f8..a55dae0 100644 --- a/src/object_detection.cpp +++ b/src/object_detection.cpp @@ -25,12 +25,14 @@ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + /** - * @file object_detection.h - * @author Umang Rastogi - Driver - * @author Naman Gupta - Navigator - * @brief Library header file to implement object detection - * @detail Implements object detection using HSV + * @file object_detection.cpp + * @author Umang Rastogi - Driver + * @author Naman Gupta - Navigator + * @brief File to implement ObjectDetection class + * @detail Implements object detection using HSV method which detects color of + * the can in a certain range and creates a bounding box over it. */ #include "ros/ros.h" @@ -42,6 +44,7 @@ ObjectDetection::ObjectDetection() { ROS_INFO_STREAM("Initiliazing obejct detection..."); + /// Subscribe to turtlebot camera to get feed from the camera subscribeImages = nh.subscribe("/camera/rgb/image_raw", 1, &ObjectDetection::convertImage, this); ROS_INFO_STREAM("Object detection set up complete"); @@ -49,10 +52,12 @@ ObjectDetection::ObjectDetection() { void ObjectDetection::convertImage(const sensor_msgs::Image::ConstPtr& imageData) { + /// Create an object cv_ptr that bridges the ROS image and OpenCV image cv_bridge::CvImagePtr cv_ptr; try { cv_ptr = cv_bridge::toCvCopy(imageData, sensor_msgs::image_encodings::BGR8); convertedImage = cv_ptr->image; + /// Wait for 30ms cv::waitKey(30); } catch (cv_bridge::Exception& e) { @@ -62,7 +67,7 @@ void ObjectDetection::convertImage(const } bool ObjectDetection::detectObject(cv::Mat image) { - /// Convert image from bgr to hsv + /// Image conversion from BGR to HSV cv::cvtColor(image, hsvImage, CV_BGR2HSV); /// Detect hsv within the set limits cv::inRange(hsvImage, colorLowerLimit, colorUpperLimit, maskImage); diff --git a/src/obstacle_avoidance.cpp b/src/obstacle_avoidance.cpp index 2096218..9c80934 100644 --- a/src/obstacle_avoidance.cpp +++ b/src/obstacle_avoidance.cpp @@ -1,7 +1,7 @@ /** * BSD 3-Clause License * - * @copyright (c) 2019, Umang Rastogi Naman Gupta + * @copyright (c) 2019, Umang Rastogi, Naman Gupta * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -24,13 +24,15 @@ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @file obstacle_avoidance.h - * @author Umang Rastogi - Driver - * @author Naman Gupta - Navigator - * @brief Library header file to implement obstacle avoidance - * @detail Uses laser sensor for obstacle avoidance - * @detail Publishes velocities for the robot upon obstacle detection + */ + +/** + * @file obstacle_avoidance.cpp + * @author Umang Rastogi - Driver + * @author Naman Gupta - Navigator + * @brief Source file to implement obstacle avoidance class + * @detail Uses laser sensor for obstacle avoidance + * publishes velocities for the robot upon obstacle detection */ #include "ros/ros.h" @@ -72,7 +74,6 @@ void ObstacleAvoidance::laserSensorCallback( return; } } - setObstacleDetected(false); } @@ -82,7 +83,6 @@ bool ObstacleAvoidance::checkObstacle() { ROS_WARN_STREAM("Obstacle ahead!"); return true; } - return false; } diff --git a/src/turtlebot.cpp b/src/turtlebot.cpp index ae7c149..2326fea 100644 --- a/src/turtlebot.cpp +++ b/src/turtlebot.cpp @@ -1,7 +1,7 @@ /** * BSD 3-Clause License * - * @copyright (c) 2019, Umang Rastogi Naman Gupta + * @copyright (c) 2019, Umang Rastogi, Naman Gupta * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -27,11 +27,11 @@ */ /** - * @file turtlebot.cpp - * @author Umang Rastogi - Driver - * @author Naman Gupta - Navigator - * @brief Source file to implement turtlebot class - * @detail Controls the motion of the bot using obstacle avoidance and go-to-goal strategies + * @file turtlebot.cpp + * @author Umang Rastogi - Driver + * @author Naman Gupta - Navigator + * @brief Source file to implement turtlebot class + * @detail Controls the motion of the bot using obstacle avoidance and go-to-goal strategies */ /// Add ROS headers @@ -79,19 +79,17 @@ Turtlebot::~Turtlebot() { float Turtlebot::moveForward(float linVelX) { velocities.linear.x = linVelX; velocities.angular.z = 0.0; - return velocities.linear.x; } float Turtlebot::turn(float angVelZ) { velocities.linear.x = 0.0; velocities.angular.z = angVelZ; - return velocities.angular.z; } void Turtlebot::moveBot(ObstacleAvoidance& obstacleAvoidance) { - // Set the publishing rate + /// Set the publishing rate ros::Rate loop_rate(publishRate); while (ros::ok()) { if (obstacleAvoidance.checkObstacle()) { @@ -132,7 +130,6 @@ bool Turtlebot::resetBot() { } bool Turtlebot::checkVelocityChanged() { - /// Linear and angular change simultaneously /// Check if both the velocities have changed if (velocities.linear.x != prevLinearVelocity and \ velocities.angular.z != prevAngularVelocity) { diff --git a/test/object_detection_test.cpp b/test/object_detection_test.cpp index 7cc5518..0bf2eda 100644 --- a/test/object_detection_test.cpp +++ b/test/object_detection_test.cpp @@ -28,8 +28,8 @@ /** * @file obstacle_detection_test.cpp - * @author Naman Gupta - Navigator - * @author Umang Rastogi - Driver + * @author Naman Gupta - Driver + * @author Umang Rastogi - Navigator * @brief Class test implementation of class ObstacleAvoidance * @details Test the methods of class ObstacleAvoidance */ @@ -73,11 +73,12 @@ TEST(ObjectDetectionTest, setBoundary) { TEST(ObjectDetectionTest, gaussFilter) { ObjectDetection objectDetection; bool gaussCheck = true; + /// Check if file empty or not if (!objectDetection.convertedImage.empty()) { cv::Mat gaussImg = objectDetection.applyGaussBlur( objectDetection.convertedImage); if(gaussImg.size() == objectDetection.convertedImage.size()) { - // These two images do not hace the same size due to smoothening + /// These two images do not hace the same size due to smoothening gaussCheck = false; } } @@ -94,5 +95,6 @@ TEST(ObjectDetectionTest, checkObject) { objectDetected = objectDetection.detectObject( objectDetection.applyGaussBlur(objectDetection.convertedImage)); } + /// Check for condition when obstacle not detected EXPECT_FALSE(objectDetected); } From 71f78fc4bc16c7fd4bd75313edfdd415dd4d1bef Mon Sep 17 00:00:00 2001 From: Umang Rastogi Date: Mon, 9 Dec 2019 14:14:07 -0500 Subject: [PATCH 56/62] [Task 3.10] Update doxygen documentation for the project --- Doxyfile | 2 +- README.md | 4 +- data/readme_images/initial_proposal_setup.jpg | Bin 68520 -> 0 bytes data/readme_images/supermarket_world.jpg | Bin 0 -> 166196 bytes data/template.jpg | Bin 26508 -> 0 bytes docs/html/annotated.html | 2 +- docs/html/classObjectDetection-members.html | 110 +++++ docs/html/classObjectDetection.html | 427 ++++++++++++++++++ docs/html/classObstacleAvoidance.html | 27 +- docs/html/classTurtlebot-members.html | 2 +- docs/html/classTurtlebot.html | 58 ++- docs/html/classes.html | 2 +- docs/html/detector_8cpp.html | 173 +++++++ docs/html/detector_8cpp__incl.map | 3 + docs/html/detector_8cpp__incl.md5 | 1 + docs/html/detector_8cpp__incl.png | Bin 0 -> 15796 bytes docs/html/dir_000003_000001.html | 90 ++++ docs/html/dir_000003_000002.html | 90 ++++ docs/html/dir_000004_000000.html | 2 +- docs/html/dir_000005_000000.html | 2 +- .../dir_13e138d54eb8818da29c3992edef070a.html | 4 +- ...r_13e138d54eb8818da29c3992edef070a_dep.map | 2 +- ...r_13e138d54eb8818da29c3992edef070a_dep.md5 | 2 +- ...r_13e138d54eb8818da29c3992edef070a_dep.png | Bin 2324 -> 2308 bytes .../dir_2f0945c8e09ea06b7906a0ed74b0330b.html | 13 + ...r_2f0945c8e09ea06b7906a0ed74b0330b_dep.map | 8 + ...r_2f0945c8e09ea06b7906a0ed74b0330b_dep.md5 | 1 + ...r_2f0945c8e09ea06b7906a0ed74b0330b_dep.png | Bin 0 -> 5929 bytes .../dir_68267d1309a1af8e8297ef4c3efbcdba.html | 13 +- ...r_68267d1309a1af8e8297ef4c3efbcdba_dep.map | 2 +- ...r_68267d1309a1af8e8297ef4c3efbcdba_dep.md5 | 2 +- ...r_68267d1309a1af8e8297ef4c3efbcdba_dep.png | Bin 2207 -> 2300 bytes .../dir_d44c64559bbebec7f509842c48db8b23.html | 13 + ...r_d44c64559bbebec7f509842c48db8b23_dep.map | 8 + ...r_d44c64559bbebec7f509842c48db8b23_dep.md5 | 1 + ...r_d44c64559bbebec7f509842c48db8b23_dep.png | Bin 0 -> 6123 bytes docs/html/files.html | 16 +- docs/html/functions.html | 40 +- docs/html/functions_func.html | 37 +- docs/html/functions_vars.html | 105 +++++ docs/html/globals.html | 7 +- docs/html/globals_func.html | 7 +- docs/html/main_8cpp.html | 2 - docs/html/md_README.html | 23 +- docs/html/navigator_8cpp.html | 163 +++++++ docs/html/navigator_8cpp__incl.map | 5 + docs/html/navigator_8cpp__incl.md5 | 1 + docs/html/navigator_8cpp__incl.png | Bin 0 -> 30283 bytes docs/html/object__detection_8cpp.html | 125 +++++ docs/html/object__detection_8cpp__incl.map | 3 + docs/html/object__detection_8cpp__incl.md5 | 1 + docs/html/object__detection_8cpp__incl.png | Bin 0 -> 27506 bytes docs/html/object__detection_8h.html | 21 +- docs/html/object__detection_8h__dep__incl.map | 8 +- docs/html/object__detection_8h__dep__incl.md5 | 2 +- docs/html/object__detection_8h__dep__incl.png | Bin 3929 -> 21364 bytes docs/html/object__detection_8h__incl.md5 | 2 +- docs/html/object__detection_8h__incl.png | Bin 22084 -> 12192 bytes docs/html/object__detection_8h_source.html | 17 +- docs/html/object__detection__test_8cpp.html | 278 ++++++++++++ .../object__detection__test_8cpp__incl.map | 3 + .../object__detection__test_8cpp__incl.md5 | 1 + .../object__detection__test_8cpp__incl.png | Bin 0 -> 25734 bytes docs/html/obstacle__avoidance_8cpp.html | 11 + docs/html/obstacle__avoidance_8h.html | 15 +- .../obstacle__avoidance_8h__dep__incl.map | 9 +- .../obstacle__avoidance_8h__dep__incl.md5 | 2 +- .../obstacle__avoidance_8h__dep__incl.png | Bin 9851 -> 21644 bytes docs/html/obstacle__avoidance_8h_source.html | 14 +- docs/html/obstacle__avoidance__test_8cpp.html | 32 ++ docs/html/search/all_0.js | 6 +- docs/html/search/all_1.js | 8 +- docs/html/search/all_2.js | 3 +- docs/html/search/all_3.js | 7 +- docs/html/search/all_4.js | 7 +- docs/html/search/all_5.js | 5 +- docs/html/search/all_6.js | 3 +- docs/html/search/all_7.js | 9 +- docs/html/search/all_8.js | 8 +- docs/html/search/all_9.js | 5 +- docs/html/search/all_a.html | 26 ++ docs/html/search/all_a.js | 6 + docs/html/search/all_b.html | 26 ++ docs/html/search/all_b.js | 9 + docs/html/search/all_c.html | 26 ++ docs/html/search/all_c.js | 6 + docs/html/search/classes_0.js | 2 +- docs/html/search/files_1.js | 2 +- docs/html/search/files_2.js | 5 +- docs/html/search/files_3.js | 2 +- docs/html/search/files_4.js | 9 +- docs/html/search/files_5.html | 26 ++ docs/html/search/files_5.js | 4 + docs/html/search/files_6.html | 26 ++ docs/html/search/files_6.js | 6 + docs/html/search/functions_0.js | 5 +- docs/html/search/functions_1.js | 6 +- docs/html/search/functions_2.js | 2 +- docs/html/search/functions_3.js | 6 +- docs/html/search/functions_4.js | 3 +- docs/html/search/functions_5.js | 4 +- docs/html/search/functions_6.js | 3 +- docs/html/search/functions_7.js | 5 +- docs/html/search/functions_8.js | 6 +- docs/html/search/functions_9.html | 26 ++ docs/html/search/functions_9.js | 6 + docs/html/search/functions_a.html | 26 ++ docs/html/search/functions_a.js | 6 + docs/html/search/searchdata.js | 15 +- docs/html/search/variables_0.html | 26 ++ docs/html/search/variables_0.js | 4 + docs/html/turtlebot_8cpp.html | 19 +- docs/html/turtlebot_8cpp__incl.map | 6 +- docs/html/turtlebot_8cpp__incl.md5 | 2 +- docs/html/turtlebot_8cpp__incl.png | Bin 44080 -> 37866 bytes docs/html/turtlebot_8h.html | 9 +- docs/html/turtlebot_8h__dep__incl.map | 5 +- docs/html/turtlebot_8h__dep__incl.md5 | 2 +- docs/html/turtlebot_8h__dep__incl.png | Bin 6001 -> 6546 bytes docs/html/turtlebot_8h__incl.map | 2 + docs/html/turtlebot_8h__incl.md5 | 2 +- docs/html/turtlebot_8h__incl.png | Bin 5291 -> 25372 bytes docs/html/turtlebot_8h_source.html | 21 +- docs/html/turtlebot__test_8cpp.html | 37 +- docs/html/turtlebot__test_8cpp__incl.map | 4 +- docs/html/turtlebot__test_8cpp__incl.md5 | 2 +- docs/html/turtlebot__test_8cpp__incl.png | Bin 12113 -> 32998 bytes docs/latex/annotated.tex | 2 +- docs/latex/classObjectDetection.tex | 243 ++++++++++ docs/latex/classObstacleAvoidance.tex | 28 +- docs/latex/classTurtlebot.tex | 68 ++- docs/latex/detector_8cpp.tex | 75 +++ docs/latex/detector_8cpp__incl.md5 | 1 + docs/latex/detector_8cpp__incl.pdf | Bin 0 -> 13637 bytes .../dir_13e138d54eb8818da29c3992edef070a.tex | 2 + ...r_13e138d54eb8818da29c3992edef070a_dep.md5 | 2 +- ...r_13e138d54eb8818da29c3992edef070a_dep.pdf | Bin 11264 -> 11354 bytes .../dir_2f0945c8e09ea06b7906a0ed74b0330b.tex | 8 + ...r_2f0945c8e09ea06b7906a0ed74b0330b_dep.md5 | 1 + ...r_2f0945c8e09ea06b7906a0ed74b0330b_dep.pdf | Bin 0 -> 12660 bytes .../dir_68267d1309a1af8e8297ef4c3efbcdba.tex | 10 +- ...r_68267d1309a1af8e8297ef4c3efbcdba_dep.md5 | 2 +- ...r_68267d1309a1af8e8297ef4c3efbcdba_dep.pdf | Bin 11259 -> 11401 bytes .../dir_d44c64559bbebec7f509842c48db8b23.tex | 8 + ...r_d44c64559bbebec7f509842c48db8b23_dep.md5 | 1 + ...r_d44c64559bbebec7f509842c48db8b23_dep.pdf | Bin 0 -> 12650 bytes docs/latex/files.tex | 8 +- docs/latex/main_8cpp.tex | 3 +- docs/latex/md_README.tex | 62 ++- docs/latex/navigator_8cpp.tex | 50 ++ docs/latex/navigator_8cpp__incl.md5 | 1 + docs/latex/navigator_8cpp__incl.pdf | Bin 0 -> 15809 bytes docs/latex/object__detection_8cpp.tex | 38 ++ docs/latex/object__detection_8cpp__incl.md5 | 1 + docs/latex/object__detection_8cpp__incl.pdf | Bin 0 -> 14722 bytes docs/latex/object__detection_8h.tex | 14 +- .../latex/object__detection_8h__dep__incl.md5 | 2 +- .../latex/object__detection_8h__dep__incl.pdf | Bin 12585 -> 14069 bytes docs/latex/object__detection_8h__incl.md5 | 2 +- docs/latex/object__detection_8h__incl.pdf | Bin 14496 -> 13525 bytes docs/latex/object__detection__test_8cpp.tex | 93 ++++ .../object__detection__test_8cpp__incl.md5 | 1 + .../object__detection__test_8cpp__incl.pdf | Bin 0 -> 13836 bytes docs/latex/obstacle__avoidance_8cpp.tex | 25 +- docs/latex/obstacle__avoidance_8h.tex | 9 +- .../obstacle__avoidance_8h__dep__incl.md5 | 2 +- .../obstacle__avoidance_8h__dep__incl.pdf | Bin 13109 -> 13891 bytes docs/latex/obstacle__avoidance__test_8cpp.tex | 20 +- docs/latex/refman.tex | 6 +- docs/latex/turtlebot_8cpp.tex | 20 +- docs/latex/turtlebot_8cpp__incl.md5 | 2 +- docs/latex/turtlebot_8cpp__incl.pdf | Bin 16198 -> 15993 bytes docs/latex/turtlebot_8h.tex | 6 +- docs/latex/turtlebot_8h__dep__incl.md5 | 2 +- docs/latex/turtlebot_8h__dep__incl.pdf | Bin 12505 -> 13386 bytes docs/latex/turtlebot_8h__incl.md5 | 2 +- docs/latex/turtlebot_8h__incl.pdf | Bin 13120 -> 15593 bytes docs/latex/turtlebot__test_8cpp.tex | 20 +- docs/latex/turtlebot__test_8cpp__incl.md5 | 2 +- docs/latex/turtlebot__test_8cpp__incl.pdf | Bin 13184 -> 15855 bytes 180 files changed, 3050 insertions(+), 308 deletions(-) delete mode 100644 data/readme_images/initial_proposal_setup.jpg create mode 100644 data/readme_images/supermarket_world.jpg delete mode 100644 data/template.jpg create mode 100644 docs/html/classObjectDetection-members.html create mode 100644 docs/html/classObjectDetection.html create mode 100644 docs/html/detector_8cpp.html create mode 100644 docs/html/detector_8cpp__incl.map create mode 100644 docs/html/detector_8cpp__incl.md5 create mode 100644 docs/html/detector_8cpp__incl.png create mode 100644 docs/html/dir_000003_000001.html create mode 100644 docs/html/dir_000003_000002.html create mode 100644 docs/html/dir_2f0945c8e09ea06b7906a0ed74b0330b_dep.map create mode 100644 docs/html/dir_2f0945c8e09ea06b7906a0ed74b0330b_dep.md5 create mode 100644 docs/html/dir_2f0945c8e09ea06b7906a0ed74b0330b_dep.png create mode 100644 docs/html/dir_d44c64559bbebec7f509842c48db8b23_dep.map create mode 100644 docs/html/dir_d44c64559bbebec7f509842c48db8b23_dep.md5 create mode 100644 docs/html/dir_d44c64559bbebec7f509842c48db8b23_dep.png create mode 100644 docs/html/functions_vars.html create mode 100644 docs/html/navigator_8cpp.html create mode 100644 docs/html/navigator_8cpp__incl.map create mode 100644 docs/html/navigator_8cpp__incl.md5 create mode 100644 docs/html/navigator_8cpp__incl.png create mode 100644 docs/html/object__detection_8cpp.html create mode 100644 docs/html/object__detection_8cpp__incl.map create mode 100644 docs/html/object__detection_8cpp__incl.md5 create mode 100644 docs/html/object__detection_8cpp__incl.png create mode 100644 docs/html/object__detection__test_8cpp.html create mode 100644 docs/html/object__detection__test_8cpp__incl.map create mode 100644 docs/html/object__detection__test_8cpp__incl.md5 create mode 100644 docs/html/object__detection__test_8cpp__incl.png create mode 100644 docs/html/search/all_a.html create mode 100644 docs/html/search/all_a.js create mode 100644 docs/html/search/all_b.html create mode 100644 docs/html/search/all_b.js create mode 100644 docs/html/search/all_c.html create mode 100644 docs/html/search/all_c.js create mode 100644 docs/html/search/files_5.html create mode 100644 docs/html/search/files_5.js create mode 100644 docs/html/search/files_6.html create mode 100644 docs/html/search/files_6.js create mode 100644 docs/html/search/functions_9.html create mode 100644 docs/html/search/functions_9.js create mode 100644 docs/html/search/functions_a.html create mode 100644 docs/html/search/functions_a.js create mode 100644 docs/html/search/variables_0.html create mode 100644 docs/html/search/variables_0.js create mode 100644 docs/latex/classObjectDetection.tex create mode 100644 docs/latex/detector_8cpp.tex create mode 100644 docs/latex/detector_8cpp__incl.md5 create mode 100644 docs/latex/detector_8cpp__incl.pdf create mode 100644 docs/latex/dir_2f0945c8e09ea06b7906a0ed74b0330b_dep.md5 create mode 100644 docs/latex/dir_2f0945c8e09ea06b7906a0ed74b0330b_dep.pdf create mode 100644 docs/latex/dir_d44c64559bbebec7f509842c48db8b23_dep.md5 create mode 100644 docs/latex/dir_d44c64559bbebec7f509842c48db8b23_dep.pdf create mode 100644 docs/latex/navigator_8cpp.tex create mode 100644 docs/latex/navigator_8cpp__incl.md5 create mode 100644 docs/latex/navigator_8cpp__incl.pdf create mode 100644 docs/latex/object__detection_8cpp.tex create mode 100644 docs/latex/object__detection_8cpp__incl.md5 create mode 100644 docs/latex/object__detection_8cpp__incl.pdf create mode 100644 docs/latex/object__detection__test_8cpp.tex create mode 100644 docs/latex/object__detection__test_8cpp__incl.md5 create mode 100644 docs/latex/object__detection__test_8cpp__incl.pdf diff --git a/Doxyfile b/Doxyfile index 27a4860..717981b 100644 --- a/Doxyfile +++ b/Doxyfile @@ -58,7 +58,7 @@ PROJECT_LOGO = # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. -OUTPUT_DIRECTORY = DOXYGEN/ +OUTPUT_DIRECTORY = docs/ # If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and diff --git a/README.md b/README.md index 82ba17c..1c37fea 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ has an obstacle avoidance feature that is used to prevent the robot from collidi humans, uninteresting items and walls/shelves.

- + Figure 1 - Robot approaching towards the cans lying on the ground to collect them

@@ -152,4 +152,4 @@ firefox docs/html/index.html ## Demo -We will update in the next phase by next week. \ No newline at end of file +We will update in the next phase by next week. diff --git a/data/readme_images/initial_proposal_setup.jpg b/data/readme_images/initial_proposal_setup.jpg deleted file mode 100644 index 5acff19c6ccd6ae119c73021c66e1adb4a215e67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68520 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 diff --git a/data/readme_images/supermarket_world.jpg b/data/readme_images/supermarket_world.jpg new file mode 100644 index 0000000000000000000000000000000000000000..03555a2277042eb3012c5256288c797937df1618 GIT binary patch literal 166196 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 w(*hblzF8~qJ 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 MiYNf0iYNpB*?2O_7XSbN diff --git a/docs/html/annotated.html b/docs/html/annotated.html index d25bd5e..d5b53e8 100644 --- a/docs/html/annotated.html +++ b/docs/html/annotated.html @@ -88,7 +88,7 @@
Here are the classes, structs, unions and interfaces with brief descriptions:
- +
 CObjectDectection
 CObjectDetection
 CObstacleAvoidance
 CTurtlebotAdd ROS headers
diff --git a/docs/html/classObjectDetection-members.html b/docs/html/classObjectDetection-members.html new file mode 100644 index 0000000..20b0c53 --- /dev/null +++ b/docs/html/classObjectDetection-members.html @@ -0,0 +1,110 @@ + + + + + + +Supermarket Cleaning Robot: Member List + + + + + + + + + + +
+
+
+
ObjectDetection Member List
+
+
+ +

This is the complete list of members for ObjectDetection, including all inherited members.

+ + + + + + + + + + + +
applyGaussBlur(cv::Mat cvtImage)ObjectDetection
convertedImageObjectDetection
convertImage(const sensor_msgs::Image::ConstPtr &imageData)ObjectDetection
detectObject(cv::Mat image)ObjectDetection
getObjectBoundary() const ObjectDetectioninline
getObjectDetected() const ObjectDetectioninline
ObjectDetection()ObjectDetection
setObjectBoundary(cv::Rect boundingBox)ObjectDetectioninline
setObjectDetected(bool object)ObjectDetectioninline
~ObjectDetection()ObjectDetection
+ + + + diff --git a/docs/html/classObjectDetection.html b/docs/html/classObjectDetection.html new file mode 100644 index 0000000..9ae8ddf --- /dev/null +++ b/docs/html/classObjectDetection.html @@ -0,0 +1,427 @@ + + + + + + +Supermarket Cleaning Robot: ObjectDetection Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
Supermarket Cleaning Robot +
+
+
+ + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
ObjectDetection Class Reference
+
+
+ +

#include <object_detection.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 ObjectDetection ()
 Constructor for object detection class. More...
 
 ~ObjectDetection ()
 Destructor for object detection class. More...
 
void convertImage (const sensor_msgs::Image::ConstPtr &imageData)
 Callback function for image data. More...
 
bool detectObject (cv::Mat image)
 Method to detect object using hsv. More...
 
cv::Mat applyGaussBlur (cv::Mat cvtImage)
 Method to convert gaussian filter on the image. More...
 
cv::Rect getObjectBoundary () const
 Get boundary of the object in the image. More...
 
void setObjectBoundary (cv::Rect boundingBox)
 Set object boundary. More...
 
bool getObjectDetected () const
 Get object detected. More...
 
void setObjectDetected (bool object)
 Set object detected. More...
 
+ + + + +

+Public Attributes

cv::Mat convertedImage
 Container to store converted image from cv_bridge. More...
 
+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + +
ObjectDetection::ObjectDetection ()
+
+ +

Constructor for object detection class.

+
Parameters
+ + +
none
+
+
+
Returns
none
+

Subscribe to turtlebot camera to get feed from the camera

+ +
+
+ +
+
+ + + + + + + +
ObjectDetection::~ObjectDetection ()
+
+ +

Destructor for object detection class.

+
Parameters
+ + +
none
+
+
+
Returns
none
+ +
+
+

Member Function Documentation

+ +
+
+ + + + + + + + +
cv::Mat ObjectDetection::applyGaussBlur (cv::Mat cvtImage)
+
+ +

Method to convert gaussian filter on the image.

+
Parameters
+ + +
Convertedopencv image of type cv::Mat
+
+
+
Returns
Image blurred using gaussian filter of type cv::Mat
+

Apply gaussian filter

+ +
+
+ +
+
+ + + + + + + + +
void ObjectDetection::convertImage (const sensor_msgs::Image::ConstPtr & imageData)
+
+ +

Callback function for image data.

+
Parameters
+ + +
Imagedata from camera node
+
+
+
Returns
none Convert ROS image message to CV image
+

Create an object cv_ptr that bridges the ROS image and OpenCV image

+

Wait for 30ms

+ +
+
+ +
+
+ + + + + + + + +
bool ObjectDetection::detectObject (cv::Mat image)
+
+ +

Method to detect object using hsv.

+
Parameters
+ + +
Imagegaussian filtered image of type cv::Mat
+
+
+
Returns
Match found of type bool
+

Image conversion from BGR to HSV

+

Detect hsv within the set limits

+

Get image size to modify size of mask image

+

Find contours for better visualization

+

Check if contours exist in the image

+

Find contour with maximum area

+

Set boundary of the object in the image

+

Draw the rectangle using the bounding box

+

Mask image to limit the future turns affecting the output

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
cv::Rect ObjectDetection::getObjectBoundary () const
+
+inline
+
+ +

Get boundary of the object in the image.

+
Parameters
+ + +
none
+
+
+
Returns
rectangular box containing the object
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ObjectDetection::getObjectDetected () const
+
+inline
+
+ +

Get object detected.

+
Parameters
+ + +
none
+
+
+
Returns
Object detected or not of type bool
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ObjectDetection::setObjectBoundary (cv::Rect boundingBox)
+
+inline
+
+ +

Set object boundary.

+
Parameters
+ + +
BoundingBoxreactagular boundary of the object
+
+
+
Returns
none
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ObjectDetection::setObjectDetected (bool object)
+
+inline
+
+ +

Set object detected.

+
Parameters
+ + +
Objectdetected status
+
+
+
Returns
none
+ +
+
+

Member Data Documentation

+ +
+
+ + + + +
cv::Mat ObjectDetection::convertedImage
+
+ +

Container to store converted image from cv_bridge.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/classObstacleAvoidance.html b/docs/html/classObstacleAvoidance.html index caa15d8..e39c319 100644 --- a/docs/html/classObstacleAvoidance.html +++ b/docs/html/classObstacleAvoidance.html @@ -110,10 +110,10 @@  Checks if obstacle is present within safe distance. More...
  bool getObstacleDetected () const - get obstacle detected More...
+ Gets obstacle detected. More...
  void setObstacleDetected (bool obstacle) - set obstacle detected More...
+ Set obstacle detected. More...
 

Constructor & Destructor Documentation

@@ -137,8 +137,7 @@

Constructor & Destructor Documentation

-
Returns
a constructor has no return
-

Initialize the current value of velocities in m/s and rad/s

+
Returns
none

Initialize obstacle detected value with false

Initialize safe distance from an obstacle in meters

Subscribe for data from the laser sensor on the scan topic

@@ -170,11 +169,11 @@

Constructor & Destructor Documentation

Constructor for obstacle avoidance class.

Parameters
- +
safedistance from an obstacle
Safedistance from an obstacle of type float
-
Returns
a constructor has no return
+
Returns
none

Initialize obstacle detected value with false

Initialize safe distance from an obstacle in meters

Subscribe for data from the laser sensor on the scan topic

@@ -201,7 +200,7 @@

Constructor & Destructor Documentation

-
Returns
a destrcutor has no return
+
Returns
none
@@ -226,7 +225,7 @@

Member Function Documentation

-
Returns
boolean obstacle found or not
+
Returns
Obstacle found or not of type bool

Check if obstacle is ahead

@@ -252,14 +251,14 @@

Member Function Documentation

-

get obstacle detected

+

Gets obstacle detected.

Parameters
none
-
Returns
boolean obstacle detected or not
+
Returns
Status of obstacle detected or not of type bool
@@ -284,7 +283,7 @@

Member Function Documentation

-
Returns
void
+
Returns
none

Read sensor data to get obstacle distances with respect to the robot

@@ -311,14 +310,14 @@

Member Function Documentation

-

set obstacle detected

+

Set obstacle detected.

Parameters
- +
obstacledetected status
Obstacledetected status
-
Returns
void
+
Returns
none
diff --git a/docs/html/classTurtlebot-members.html b/docs/html/classTurtlebot-members.html index 459f5f4..581b9f0 100644 --- a/docs/html/classTurtlebot-members.html +++ b/docs/html/classTurtlebot-members.html @@ -91,7 +91,7 @@ - + diff --git a/docs/html/classTurtlebot.html b/docs/html/classTurtlebot.html index c1ec448..1e0008a 100644 --- a/docs/html/classTurtlebot.html +++ b/docs/html/classTurtlebot.html @@ -98,7 +98,7 @@ - + @@ -115,9 +115,9 @@ - - - + + + @@ -141,18 +141,18 @@
checkVelocityChanged()Turtlebot
collectObject()Turtlebot
moveBot()Turtlebot
moveBot(ObstacleAvoidance &obstacleAvoidance)Turtlebot
moveForward(float linVelX)Turtlebot
resetBot()Turtlebot
turn(float angVelZ)Turtlebot

Public Member Functions

 Turtlebot ()
 Constructor for obstacle avoidance class. More...
 Obstacle detection and template matching variables. More...
 
 Turtlebot (float linVelX, float angVelZ)
 Constructor for obstacle avoidance class. More...
bool collectObject ()
 Collect the object. More...
 
void moveBot ()
 Control the motion of the bot. More...
 
void moveBot (ObstacleAvoidance &obstacleAvoidance)
 Control the motion of the bot. More...
 
bool resetBot ()
 Reset the velocities of the bot. More...
 
-

Constructor for obstacle avoidance class.

+

Obstacle detection and template matching variables.

Add ROS headers.

-
Parameters
+

Constructor for obstacle avoidance class

Parameters
none
-
Returns
a constructor has no return
+
Returns
none

Add custom libraries to help control motion of the robot

Initialize the current value of velocities in m/s and rad/s

-

Define the main access point to communications with the ROS system

+

Initialize previous with the current value of velocities

Publish the velocities to the robot on the navigation topic

@@ -184,14 +184,14 @@

Constructor for obstacle avoidance class.

Parameters
- - + +
linearvelocity in x-axis
angularvelocity about z-axis
Linearvelocity in x-axis
Angularvelocity about z-axis
-
Returns
a constructor has no return
+
Returns
none

Initialize the current value of velocities in m/s and rad/s

-

Define the main access point to communications with the ROS system

+

Initialize previous with the current value of velocities

Publish the velocities to the robot on the navigation topic

@@ -216,7 +216,7 @@ -
Returns
a destrcutor has no return
+
Returns
none
@@ -242,6 +242,8 @@

Member Function Documentation

Returns
boolean velocity changed or not
+

Check if both the velocities have changed

+

Update previous velocities

@@ -269,14 +271,15 @@

Member Function Documentation

- +
- + +
void Turtlebot::moveBot ()ObstacleAvoidanceobstacleAvoidance)
@@ -285,11 +288,19 @@

Member Function Documentation

Control the motion of the bot.

Parameters
- +
none
Referenceto Obstacle Avoidance class
-
Returns
void Use obstacle avoidance and go-to-goal strategies to move towards the object to be collected
+
Returns
none Use obstacle avoidance and go-to-goal strategies to move towards the object to be collected
+

Set the publishing rate

+

Start turning the robot to avoid obstacles

+

Check if velocities have changed

+

Start moving the robot once obstacle is avoided

+

Check if velocities have changed

+

Publish the velocities

+

Handle callback

+

Make the system sleep to maintain loop rate

@@ -310,11 +321,11 @@

Member Function Documentation

Make the bot move forward.

Parameters
- +
linearvelocity in x-direction
Linearvelocity in x-direction
-
Returns
linear velocity for the bot
+
Returns
Linear velocity for the bot
@@ -338,7 +349,10 @@

Member Function Documentation

-
Returns
void
+
Returns
status of type bool
+

Reset linear velocities of the both robot

+

Reset angular velocities of the both robot

+

Publish the reset velocities

@@ -359,11 +373,11 @@

Member Function Documentation

Turn the bot.

Parameters
- +
angularvelocity about z-axis
Angularvelocity about z-axis
-
Returns
angular velocity for the bot
+
Returns
Angular velocity for the bot
diff --git a/docs/html/classes.html b/docs/html/classes.html index ef85298..bb77602 100644 --- a/docs/html/classes.html +++ b/docs/html/classes.html @@ -92,7 +92,7 @@ ObstacleAvoidance   
  T  
-ObjectDectection    +ObjectDetection    Turtlebot    diff --git a/docs/html/detector_8cpp.html b/docs/html/detector_8cpp.html new file mode 100644 index 0000000..5118493 --- /dev/null +++ b/docs/html/detector_8cpp.html @@ -0,0 +1,173 @@ + + + + + + +Supermarket Cleaning Robot: src/detector.cpp File Reference + + + + + + + + + + +
+
+ + + + + + +
+
Supermarket Cleaning Robot +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
detector.cpp File Reference
+
+
+ +

Detector node file to implement object detection algorithm Implements object detection algorithm using HSV color detection. +More...

+
#include <ros/ros.h>
+#include "object_detection/object_detection.h"
+
+Include dependency graph for detector.cpp:
+
+
+ + + +
+
+ + + + +

+Functions

int main (int argc, char **argv)
 main function More...
 
+

Detailed Description

+

Detector node file to implement object detection algorithm Implements object detection algorithm using HSV color detection.

+

BSD 3-Clause License

+ +

All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

+

Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+
Author
Umang Rastogi - Navigator
+
+Naman Gupta - Driver
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
int main (int argc,
char ** argv 
)
+
+ +

main function

+
Parameters
+ + + +
argc
argv
+
+
+
Returns
int
+

Initialized object detection node

+

Declaring object of class ObjectDetection

+

Checks empty image

+

Apply detectObject method to detect cans in the world

+

Close both the windows of HSVImage and Turtlebot View

+ +
+
+
+ + + + diff --git a/docs/html/detector_8cpp__incl.map b/docs/html/detector_8cpp__incl.map new file mode 100644 index 0000000..2d4bd7f --- /dev/null +++ b/docs/html/detector_8cpp__incl.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/detector_8cpp__incl.md5 b/docs/html/detector_8cpp__incl.md5 new file mode 100644 index 0000000..f3aa8ea --- /dev/null +++ b/docs/html/detector_8cpp__incl.md5 @@ -0,0 +1 @@ +6cd92cb0ef2c2e757ac0b95f21f22034 \ No newline at end of file diff --git a/docs/html/detector_8cpp__incl.png b/docs/html/detector_8cpp__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..790639d133b62e3ab4eb53043562ef17bff70eec GIT binary patch literal 15796 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 E7n*vK>i_@% literal 0 HcmV?d00001 diff --git a/docs/html/dir_000003_000001.html b/docs/html/dir_000003_000001.html new file mode 100644 index 0000000..d53cf91 --- /dev/null +++ b/docs/html/dir_000003_000001.html @@ -0,0 +1,90 @@ + + + + + + +Supermarket Cleaning Robot: include/turtlebot -> object_detection Relation + + + + + + + + + + +
+
+ + + + + + +
+
Supermarket Cleaning Robot +
+
+
+ + + + + +
+
+ + +
+ +
+ + +
+
+

turtlebot → object_detection Relation

File in include/turtlebotIncludes file in include/object_detection
turtlebot.hobject_detection.h
+ + + + diff --git a/docs/html/dir_000003_000002.html b/docs/html/dir_000003_000002.html new file mode 100644 index 0000000..0b5b1f2 --- /dev/null +++ b/docs/html/dir_000003_000002.html @@ -0,0 +1,90 @@ + + + + + + +Supermarket Cleaning Robot: include/turtlebot -> obstacle_avoidance Relation + + + + + + + + + + +
+
+ + + + + + +
+
Supermarket Cleaning Robot +
+
+
+ + + + + +
+
+ + +
+ +
+ + +
+
+

turtlebot → obstacle_avoidance Relation

File in include/turtlebotIncludes file in include/obstacle_avoidance
turtlebot.hobstacle_avoidance.h
+ + + + diff --git a/docs/html/dir_000004_000000.html b/docs/html/dir_000004_000000.html index d3bbf22..b60fa8a 100644 --- a/docs/html/dir_000004_000000.html +++ b/docs/html/dir_000004_000000.html @@ -79,7 +79,7 @@ +

src → include Relation

File in srcIncludes file in include
detector.cppobject_detection / object_detection.h
navigator.cppobstacle_avoidance / obstacle_avoidance.h
navigator.cppturtlebot / turtlebot.h
object_detection.cppobject_detection / object_detection.h
obstacle_avoidance.cppobstacle_avoidance / obstacle_avoidance.h
turtlebot.cppobject_detection / object_detection.h
turtlebot.cppobstacle_avoidance / obstacle_avoidance.h
turtlebot.cppturtlebot / turtlebot.h