Skip to content

Commit 2df8b1b

Browse files
authored
Add Polygon Info obtained from zbar (#11)
* add polygon info, and publish with Symbol.msg format Signed-off-by: ijnek <[email protected]> * Update barcode_reader_node.cpp Fix print formatting Signed-off-by: ijnek <[email protected]> * add code to deprecate barcode topic Signed-off-by: Kenji Brameld <[email protected]> * update warning message Signed-off-by: Kenji Brameld <[email protected]> * remove .msg Signed-off-by: Kenji Brameld <[email protected]> * bring non-deprecated code before deprecated code Signed-off-by: Kenji Brameld <[email protected]> * use vision_msgs and not geometry_msgs Signed-off-by: Kenji Brameld <[email protected]> --------- Signed-off-by: ijnek <[email protected]> Signed-off-by: Kenji Brameld <[email protected]>
1 parent bfb27f4 commit 2df8b1b

File tree

9 files changed

+108
-10
lines changed

9 files changed

+108
-10
lines changed

README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ Subscriptions:
5656
* `image` (`sensor_msgs/msg/Image`)
5757

5858
Publisher:
59-
* `barcode` (`std_msgs/msg/String`)
59+
* `symbol` (`zbar_ros_interfaces/msg/Symbol`)
60+
* `barcode` (`std_msgs/msg/String`) - **DEPRECATED**
6061

6162

6263
## Debugging the barcode_reader node

CMakeLists.txt zbar_ros/CMakeLists.txt

+3-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ endif()
1919
find_package(ament_cmake REQUIRED)
2020
find_package(rclcpp REQUIRED)
2121
find_package(sensor_msgs REQUIRED)
22-
find_package(std_msgs REQUIRED)
22+
find_package(zbar_ros_interfaces REQUIRED)
2323
find_package(cv_bridge REQUIRED)
2424

2525
# Include header files
@@ -32,7 +32,8 @@ ament_target_dependencies(barcode_reader_node
3232
rclcpp
3333
sensor_msgs
3434
std_msgs
35-
cv_bridge)
35+
cv_bridge
36+
zbar_ros_interfaces)
3637
target_link_libraries(barcode_reader_node zbar)
3738

3839
# Build executable

include/zbar_ros/barcode_reader_node.hpp zbar_ros/include/zbar_ros/barcode_reader_node.hpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include "./zbar.h"
3939
#include "sensor_msgs/msg/image.hpp"
4040
#include "std_msgs/msg/string.hpp"
41+
#include "zbar_ros_interfaces/msg/symbol.hpp"
4142

4243
namespace zbar_ros
4344
{
@@ -52,7 +53,8 @@ class BarcodeReaderNode : public rclcpp::Node
5253
void cleanCb();
5354

5455
rclcpp::Subscription<sensor_msgs::msg::Image>::SharedPtr camera_sub_;
55-
rclcpp::Publisher<std_msgs::msg::String>::SharedPtr barcode_pub_;
56+
rclcpp::Publisher<zbar_ros_interfaces::msg::Symbol>::SharedPtr symbol_pub_;
57+
rclcpp::Publisher<std_msgs::msg::String>::SharedPtr barcode_pub_; // DEPRECATED
5658
zbar::ImageScanner scanner_;
5759

5860
rclcpp::TimerBase::SharedPtr clean_timer_;

package.xml zbar_ros/package.xml

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
<depend>cv_bridge</depend>
1717
<depend>sensor_msgs</depend>
1818
<depend>std_msgs</depend>
19+
<depend>zbar_ros_interfaces</depend>
1920

2021
<test_depend>ament_lint_auto</test_depend>
2122
<test_depend>ament_lint_common</test_depend>
File renamed without changes.

src/barcode_reader_node.cpp zbar_ros/src/barcode_reader_node.cpp

+37-6
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,10 @@ BarcodeReaderNode::BarcodeReaderNode()
4444
{
4545
scanner_.set_config(zbar::ZBAR_NONE, zbar::ZBAR_CFG_ENABLE, 1);
4646

47-
4847
camera_sub_ = this->create_subscription<sensor_msgs::msg::Image>(
4948
"image", 10, std::bind(&BarcodeReaderNode::imageCb, this, std::placeholders::_1));
5049

50+
symbol_pub_ = this->create_publisher<zbar_ros_interfaces::msg::Symbol>("symbol", 10);
5151
barcode_pub_ = this->create_publisher<std_msgs::msg::String>("barcode", 10);
5252

5353
throttle_ = this->declare_parameter<double>("throttle_repeated_barcodes", 0.0);
@@ -74,14 +74,29 @@ void BarcodeReaderNode::imageCb(sensor_msgs::msg::Image::ConstSharedPtr image)
7474
auto it_end = zbar_image.symbol_end();
7575
if (it_start != it_end) {
7676
// If there are barcodes in the image, iterate over all barcode readings from image
77-
for (zbar::Image::SymbolIterator symbol = it_start; symbol != it_end; ++symbol) {
78-
std::string barcode = symbol->get_data();
79-
RCLCPP_DEBUG(get_logger(), "Barcode detected with data: '%s'", barcode.c_str());
77+
for (zbar::Image::SymbolIterator symbol_it = it_start; symbol_it != it_end; ++symbol_it) {
78+
zbar_ros_interfaces::msg::Symbol symbol;
79+
symbol.data = symbol_it->get_data();
80+
RCLCPP_DEBUG(get_logger(), "Barcode detected with data: '%s'", symbol.data.c_str());
81+
82+
RCLCPP_DEBUG(
83+
get_logger(), "Polygon around barcode has %d points", symbol_it->get_location_size());
84+
for (zbar::Symbol::PointIterator point_it = symbol_it->point_begin();
85+
point_it != symbol_it->point_end();
86+
++point_it)
87+
{
88+
vision_msgs::msg::Point2D point;
89+
point.x = (*point_it).x;
90+
point.y = (*point_it).y;
91+
RCLCPP_DEBUG(get_logger(), " Point: %f, %f", point.x, point.y);
92+
symbol.points.push_back(point);
93+
}
8094

8195
// verify if repeated barcode throttling is enabled
8296
if (throttle_ > 0.0) {
8397
const std::lock_guard<std::mutex> lock(memory_mutex_);
8498

99+
const std::string & barcode = symbol.data;
85100
// check if barcode has been recorded as seen, and skip detection
86101
if (barcode_memory_.count(barcode) > 0) {
87102
// check if time reached to forget barcode
@@ -100,16 +115,32 @@ void BarcodeReaderNode::imageCb(sensor_msgs::msg::Image::ConstSharedPtr image)
100115
now() + rclcpp::Duration(std::chrono::duration<double>(throttle_))));
101116
}
102117

103-
// publish barcode
118+
// publish symbol
119+
RCLCPP_DEBUG(get_logger(), "Publishing Symbol");
120+
symbol_pub_->publish(symbol);
121+
122+
// publish on deprecated barcode topic
104123
RCLCPP_DEBUG(get_logger(), "Publishing data as string");
105124
std_msgs::msg::String barcode_string;
106-
barcode_string.data = barcode;
125+
barcode_string.data = symbol.data;
107126
barcode_pub_->publish(barcode_string);
108127
}
109128
} else {
110129
RCLCPP_DEBUG(get_logger(), "No barcode detected in image");
111130
}
112131

132+
// Warn if there are subscriptions on barcode topic, because it's deprecated.
133+
static bool alreadyWarnedDeprecation = false;
134+
if (!alreadyWarnedDeprecation && count_subscribers("barcode") > 0) {
135+
alreadyWarnedDeprecation = true;
136+
RCLCPP_WARN(
137+
get_logger(),
138+
"A subscription was detected on the deprecated topic 'barcode'. Please update the node "
139+
"that is subscribing to use the new topic 'symbol' with type "
140+
"'zbar_ros_interfaces::msg::Symbol' instead. The 'barcode' topic will be removed "
141+
"in the next distribution.");
142+
}
143+
113144
zbar_image.set_data(NULL, 0);
114145
}
115146

zbar_ros_interfaces/CMakeLists.txt

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
cmake_minimum_required(VERSION 3.5)
2+
project(zbar_ros_interfaces)
3+
4+
# Default to C99
5+
if(NOT CMAKE_C_STANDARD)
6+
set(CMAKE_C_STANDARD 99)
7+
endif()
8+
9+
# Default to C++14
10+
if(NOT CMAKE_CXX_STANDARD)
11+
set(CMAKE_CXX_STANDARD 14)
12+
endif()
13+
14+
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
15+
add_compile_options(-Wall -Wextra -Wpedantic)
16+
endif()
17+
18+
# find dependencies
19+
find_package(ament_cmake REQUIRED)
20+
find_package(rosidl_default_generators REQUIRED)
21+
find_package(vision_msgs REQUIRED)
22+
23+
# generate interfaces
24+
rosidl_generate_interfaces(${PROJECT_NAME}
25+
"msg/Symbol.msg"
26+
DEPENDENCIES vision_msgs
27+
)
28+
29+
ament_export_dependencies(rosidl_default_runtime)
30+
31+
if(BUILD_TESTING)
32+
find_package(ament_lint_auto REQUIRED)
33+
ament_lint_auto_find_test_dependencies()
34+
endif()
35+
36+
ament_package()

zbar_ros_interfaces/msg/Symbol.msg

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
string data
2+
vision_msgs/Point2D[] points

zbar_ros_interfaces/package.xml

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?xml version="1.0"?>
2+
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
3+
<package format="3">
4+
<name>zbar_ros_interfaces</name>
5+
<version>0.0.0</version>
6+
<description>Package containing interfaces for zbar_ros to use to publish results</description>
7+
<maintainer email="[email protected]">ijnek</maintainer>
8+
<license>BSD</license>
9+
10+
<buildtool_depend>ament_cmake</buildtool_depend>
11+
12+
<depend>vision_msgs</depend>
13+
14+
<test_depend>ament_lint_auto</test_depend>
15+
<test_depend>ament_lint_common</test_depend>
16+
17+
<build_depend>rosidl_default_generators</build_depend>
18+
<exec_depend>rosidl_default_runtime</exec_depend>
19+
<member_of_group>rosidl_interface_packages</member_of_group>
20+
21+
<export>
22+
<build_type>ament_cmake</build_type>
23+
</export>
24+
</package>

0 commit comments

Comments
 (0)