From 1c4186e672c99b475f9655a91de4769e5bb4bac3 Mon Sep 17 00:00:00 2001 From: 23-yoshikawa Date: Fri, 21 Jun 2024 20:58:53 +0900 Subject: [PATCH 1/3] =?UTF-8?q?camera=5Freader=E3=82=92c++=E3=81=8B?= =?UTF-8?q?=E3=82=89python=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- device/camera_reader/CMakeLists.txt | 42 ------------------- .../camera_reader/camera_reader/__init__.py | 0 device/camera_reader/camera_reader/camera.py | 34 +++++++++++++++ .../include/camera_reader/camera_reader.hpp | 17 -------- device/camera_reader/package.xml | 21 ++++------ device/camera_reader/resource/camera_reader | 0 device/camera_reader/setup.cfg | 4 ++ device/camera_reader/setup.py | 21 ++++++++++ device/camera_reader/src/camera_reader.cpp | 29 ------------- device/camera_reader/src/main.cpp | 10 ----- device/camera_reader/test/test_copyright.py | 25 +++++++++++ device/camera_reader/test/test_flake8.py | 25 +++++++++++ device/camera_reader/test/test_pep257.py | 23 ++++++++++ 13 files changed, 140 insertions(+), 111 deletions(-) delete mode 100644 device/camera_reader/CMakeLists.txt create mode 100644 device/camera_reader/camera_reader/__init__.py create mode 100644 device/camera_reader/camera_reader/camera.py delete mode 100644 device/camera_reader/include/camera_reader/camera_reader.hpp create mode 100644 device/camera_reader/resource/camera_reader create mode 100644 device/camera_reader/setup.cfg create mode 100644 device/camera_reader/setup.py delete mode 100644 device/camera_reader/src/camera_reader.cpp delete mode 100644 device/camera_reader/src/main.cpp create mode 100644 device/camera_reader/test/test_copyright.py create mode 100644 device/camera_reader/test/test_flake8.py create mode 100644 device/camera_reader/test/test_pep257.py diff --git a/device/camera_reader/CMakeLists.txt b/device/camera_reader/CMakeLists.txt deleted file mode 100644 index 042a958..0000000 --- a/device/camera_reader/CMakeLists.txt +++ /dev/null @@ -1,42 +0,0 @@ -cmake_minimum_required(VERSION 3.8) -project(camera_reader) - -if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") - add_compile_options(-Wall -Wextra -Wpedantic) -endif() - -# find dependencies -find_package(ament_cmake REQUIRED) -find_package(rclcpp REQUIRED) -find_package(sensor_msgs REQUIRED) -find_package(cv_bridge REQUIRED) -find_package(image_transport REQUIRED) -find_package(OpenCV REQUIRED) -# uncomment the following section in order to fill in -# further dependencies manually. -# find_package( REQUIRED) - -# Create executable -add_executable(camera_reader src/camera_reader.cpp src/main.cpp) - -target_include_directories(camera_reader - PUBLIC - $ - $ - ${OpenCV_INCLUDE_DIRS} -) - -# Link dependencies -ament_target_dependencies(camera_reader rclcpp sensor_msgs cv_bridge image_transport) - -target_link_libraries(camera_reader ${OpenCV_LIBRARIES}) - -# Install targets -install(TARGETS - camera_reader - DESTINATION lib/${PROJECT_NAME}) - -install(DIRECTORY launch - DESTINATION share/${PROJECT_NAME}) - -ament_package() diff --git a/device/camera_reader/camera_reader/__init__.py b/device/camera_reader/camera_reader/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/device/camera_reader/camera_reader/camera.py b/device/camera_reader/camera_reader/camera.py new file mode 100644 index 0000000..44257fb --- /dev/null +++ b/device/camera_reader/camera_reader/camera.py @@ -0,0 +1,34 @@ +import rclpy +from rclpy.node import Node +from sensor_msgs.msg import Image +import cv2 +from cv_bridge import CvBridge + +class Camera(Node): + def __init__(self): + super().__init__('camera') + self.publisher_=self.create_publisher(Image,'camera_image',10) + self.timer=self.create_timer(0.1,self.timer_callback) + self.cap=cv2.VideoCapture(0) + self.bridge=CvBridge() + if not self.cap.isOpened(): + self.get_logger().error('Failed to open camera') + rclpy.shutdown() + + def timer_callback(self): + ret,frame=self.cap.read() + if ret: + msg=self.bridge.cv2_to_imgmsg(frame,"bgr8") + self.publisher_.publish(msg) + else: + self.get_logger().error('Failed to capture image') + +def main(args=None): + rclpy.init(args=args) + camera=Camera() + rclpy.spin(camera) + camera.destroy_node() + rclpy.shutdown() + +if __name__=="__main__": + main() diff --git a/device/camera_reader/include/camera_reader/camera_reader.hpp b/device/camera_reader/include/camera_reader/camera_reader.hpp deleted file mode 100644 index f206ae6..0000000 --- a/device/camera_reader/include/camera_reader/camera_reader.hpp +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include -#include -#include -#include - -class CameraReader : public rclcpp::Node { -public: - CameraReader(); - -private: - void timer_callback(); - - image_transport::Publisher publisher_; - rclcpp::TimerBase::SharedPtr timer_; - cv::VideoCapture cap_; -}; diff --git a/device/camera_reader/package.xml b/device/camera_reader/package.xml index 4a50296..44b36f2 100644 --- a/device/camera_reader/package.xml +++ b/device/camera_reader/package.xml @@ -3,21 +3,16 @@ camera_reader 0.0.0 - ROS 2 package for receiving images - hiro - MIT License + TODO: Package description + hiro + TODO: License declaration - ament_cmake - rclcpp - sensor_msgs - cv_bridge - image_transport - rclcpp - sensor_msgs - cv_bridge - image_transport + ament_copyright + ament_flake8 + ament_pep257 + python3-pytest - ament_cmake + ament_python diff --git a/device/camera_reader/resource/camera_reader b/device/camera_reader/resource/camera_reader new file mode 100644 index 0000000..e69de29 diff --git a/device/camera_reader/setup.cfg b/device/camera_reader/setup.cfg new file mode 100644 index 0000000..231851f --- /dev/null +++ b/device/camera_reader/setup.cfg @@ -0,0 +1,4 @@ +[develop] +script_dir=$base/lib/camera_reader +[install] +install_scripts=$base/lib/camera_reader diff --git a/device/camera_reader/setup.py b/device/camera_reader/setup.py new file mode 100644 index 0000000..60a3df0 --- /dev/null +++ b/device/camera_reader/setup.py @@ -0,0 +1,21 @@ +from setuptools import find_packages, setup + +package_name = 'camera_reader' + +setup( + name=package_name, + version='0.0.0', + packages=[package_name], + install_requires=['setuptools'], + zip_safe=True, + maintainer='hiro', + maintainer_email='yoshikawa.h.ah@m.titech.ac.jp', + description='Camera for ROS2', + license='MIT license', + tests_require=['pytest'], + entry_points={ + 'console_scripts': [ + 'camera=camera_reader.camera:main', + ], + }, +) \ No newline at end of file diff --git a/device/camera_reader/src/camera_reader.cpp b/device/camera_reader/src/camera_reader.cpp deleted file mode 100644 index deb6345..0000000 --- a/device/camera_reader/src/camera_reader.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "camera_reader/camera_reader.hpp" - -CameraReader::CameraReader() : Node("camera") { - publisher_ = image_transport::create_publisher(this, "camera/image"); - - // Open the default camera - cap_.open(0); // 0 is typically the default camera index - - if (!cap_.isOpened()) { - RCLCPP_ERROR(this->get_logger(), "Failed to open camera"); - return; - } - - timer_ = this->create_wall_timer( - std::chrono::milliseconds(33), std::bind(&CameraReader::timer_callback, this) - ); -} - -void CameraReader::timer_callback() { - cv::Mat frame; - if (!cap_.read(frame)) { - return; - } - if (!frame.empty()) { - const auto msg - = cv_bridge::CvImage(std_msgs::msg::Header(), "bgr8", frame).toImageMsg(); - publisher_.publish(msg); - } -} diff --git a/device/camera_reader/src/main.cpp b/device/camera_reader/src/main.cpp deleted file mode 100644 index 3077468..0000000 --- a/device/camera_reader/src/main.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "camera_reader/camera_reader.hpp" -#include - -int main(int argc, char* argv[]) { - rclcpp::init(argc, argv); - auto node = std::make_shared(); - rclcpp::spin(node); - rclcpp::shutdown(); - return 0; -} diff --git a/device/camera_reader/test/test_copyright.py b/device/camera_reader/test/test_copyright.py new file mode 100644 index 0000000..97a3919 --- /dev/null +++ b/device/camera_reader/test/test_copyright.py @@ -0,0 +1,25 @@ +# Copyright 2015 Open Source Robotics Foundation, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ament_copyright.main import main +import pytest + + +# Remove the `skip` decorator once the source file(s) have a copyright header +@pytest.mark.skip(reason='No copyright header has been placed in the generated source file.') +@pytest.mark.copyright +@pytest.mark.linter +def test_copyright(): + rc = main(argv=['.', 'test']) + assert rc == 0, 'Found errors' diff --git a/device/camera_reader/test/test_flake8.py b/device/camera_reader/test/test_flake8.py new file mode 100644 index 0000000..27ee107 --- /dev/null +++ b/device/camera_reader/test/test_flake8.py @@ -0,0 +1,25 @@ +# Copyright 2017 Open Source Robotics Foundation, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ament_flake8.main import main_with_errors +import pytest + + +@pytest.mark.flake8 +@pytest.mark.linter +def test_flake8(): + rc, errors = main_with_errors(argv=[]) + assert rc == 0, \ + 'Found %d code style errors / warnings:\n' % len(errors) + \ + '\n'.join(errors) diff --git a/device/camera_reader/test/test_pep257.py b/device/camera_reader/test/test_pep257.py new file mode 100644 index 0000000..b234a38 --- /dev/null +++ b/device/camera_reader/test/test_pep257.py @@ -0,0 +1,23 @@ +# Copyright 2015 Open Source Robotics Foundation, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ament_pep257.main import main +import pytest + + +@pytest.mark.linter +@pytest.mark.pep257 +def test_pep257(): + rc = main(argv=['.', 'test']) + assert rc == 0, 'Found code style errors / warnings' From 810ec13c35fe3551c4bb5b6d67fa207bb8979fc3 Mon Sep 17 00:00:00 2001 From: 23-yoshikawa Date: Sun, 23 Jun 2024 20:00:43 +0900 Subject: [PATCH 2/3] =?UTF-8?q?camera=5Freader=E4=BF=AE=E6=AD=A3=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- device/camera_reader/camera_reader/camera.py | 7 +++--- device/camera_reader/package.xml | 11 ++++----- device/camera_reader/setup.py | 8 +++++++ device/camera_reader/test/test_copyright.py | 25 -------------------- device/camera_reader/test/test_flake8.py | 25 -------------------- device/camera_reader/test/test_pep257.py | 23 ------------------ 6 files changed, 17 insertions(+), 82 deletions(-) delete mode 100644 device/camera_reader/test/test_copyright.py delete mode 100644 device/camera_reader/test/test_flake8.py delete mode 100644 device/camera_reader/test/test_pep257.py diff --git a/device/camera_reader/camera_reader/camera.py b/device/camera_reader/camera_reader/camera.py index 44257fb..66d1397 100644 --- a/device/camera_reader/camera_reader/camera.py +++ b/device/camera_reader/camera_reader/camera.py @@ -4,11 +4,12 @@ import cv2 from cv_bridge import CvBridge + class Camera(Node): def __init__(self): super().__init__('camera') - self.publisher_=self.create_publisher(Image,'camera_image',10) - self.timer=self.create_timer(0.1,self.timer_callback) + self.publisher_=self.create_publisher(Image, 'camera_image', 10) + self.timer=self.create_timer(0.1, self.timer_callback) self.cap=cv2.VideoCapture(0) self.bridge=CvBridge() if not self.cap.isOpened(): @@ -18,7 +19,7 @@ def __init__(self): def timer_callback(self): ret,frame=self.cap.read() if ret: - msg=self.bridge.cv2_to_imgmsg(frame,"bgr8") + msg=self.bridge.cv2_to_imgmsg(frame, "bgr8") self.publisher_.publish(msg) else: self.get_logger().error('Failed to capture image') diff --git a/device/camera_reader/package.xml b/device/camera_reader/package.xml index 44b36f2..c0c2180 100644 --- a/device/camera_reader/package.xml +++ b/device/camera_reader/package.xml @@ -3,14 +3,13 @@ camera_reader 0.0.0 - TODO: Package description + Camera hiro - TODO: License declaration + MIT License - ament_copyright - ament_flake8 - ament_pep257 - python3-pytest + rclpy + sensor_msgs + cv_bridge ament_python diff --git a/device/camera_reader/setup.py b/device/camera_reader/setup.py index 60a3df0..b59f5b0 100644 --- a/device/camera_reader/setup.py +++ b/device/camera_reader/setup.py @@ -1,3 +1,6 @@ +import os +from glob import glob + from setuptools import find_packages, setup package_name = 'camera_reader' @@ -6,6 +9,11 @@ name=package_name, version='0.0.0', packages=[package_name], + data_files=[ + ('share/ament_index/resource_index/packages',['resource/' + package_name]), + ('share/' + package_name,['package.xml']), + (os.path.join('share','package_name','launch'),glob(os.path.join('launch','*'))) + ], install_requires=['setuptools'], zip_safe=True, maintainer='hiro', diff --git a/device/camera_reader/test/test_copyright.py b/device/camera_reader/test/test_copyright.py deleted file mode 100644 index 97a3919..0000000 --- a/device/camera_reader/test/test_copyright.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright 2015 Open Source Robotics Foundation, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from ament_copyright.main import main -import pytest - - -# Remove the `skip` decorator once the source file(s) have a copyright header -@pytest.mark.skip(reason='No copyright header has been placed in the generated source file.') -@pytest.mark.copyright -@pytest.mark.linter -def test_copyright(): - rc = main(argv=['.', 'test']) - assert rc == 0, 'Found errors' diff --git a/device/camera_reader/test/test_flake8.py b/device/camera_reader/test/test_flake8.py deleted file mode 100644 index 27ee107..0000000 --- a/device/camera_reader/test/test_flake8.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright 2017 Open Source Robotics Foundation, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from ament_flake8.main import main_with_errors -import pytest - - -@pytest.mark.flake8 -@pytest.mark.linter -def test_flake8(): - rc, errors = main_with_errors(argv=[]) - assert rc == 0, \ - 'Found %d code style errors / warnings:\n' % len(errors) + \ - '\n'.join(errors) diff --git a/device/camera_reader/test/test_pep257.py b/device/camera_reader/test/test_pep257.py deleted file mode 100644 index b234a38..0000000 --- a/device/camera_reader/test/test_pep257.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright 2015 Open Source Robotics Foundation, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from ament_pep257.main import main -import pytest - - -@pytest.mark.linter -@pytest.mark.pep257 -def test_pep257(): - rc = main(argv=['.', 'test']) - assert rc == 0, 'Found code style errors / warnings' From a3070f8e6746d9340f45e6935501a39d216003e5 Mon Sep 17 00:00:00 2001 From: 23-yoshikawa Date: Mon, 24 Jun 2024 00:49:01 +0900 Subject: [PATCH 3/3] =?UTF-8?q?test=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- device/camera_reader/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device/camera_reader/setup.py b/device/camera_reader/setup.py index b59f5b0..c7dc50c 100644 --- a/device/camera_reader/setup.py +++ b/device/camera_reader/setup.py @@ -20,7 +20,7 @@ maintainer_email='yoshikawa.h.ah@m.titech.ac.jp', description='Camera for ROS2', license='MIT license', - tests_require=['pytest'], + tests_require=[], entry_points={ 'console_scripts': [ 'camera=camera_reader.camera:main',