YARP
Yet Another Robot Platform
 
Loading...
Searching...
No Matches
Rangefinder2D_nwc_ros2.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2023 Istituto Italiano di Tecnologia (IIT)
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5
6#ifndef _USE_MATH_DEFINES
7#define _USE_MATH_DEFINES
8#endif
9
11
13#include <yarp/os/LogStream.h>
14
15
16#include <cmath>
17#include <iostream>
18#include <Ros2Utils.h>
19
20
21using namespace std::chrono_literals;
22using namespace yarp::os;
23using namespace yarp::dev;
24
25
27
28
32
34{
35 parseParams(config);
36 m_verbose = m_verbose_on == 1;
37
40 m_subscriber->subscribe_to_topic(m_topic_name);
41
42 m_spinner = new Ros2Spinner(m_node);
44
45 yCInfo(RANGEFINDER2D_NWC_ROS2) << "opened";
46
47 return true;
48}
49
51{
52 yCInfo(RANGEFINDER2D_NWC_ROS2, "closing...");
53 delete m_subscriber;
54 delete m_spinner;
56 return true;
57}
58
59void Rangefinder2D_nwc_ros2::callback(sensor_msgs::msg::LaserScan::SharedPtr msg, std::string topic)
60{
61 yCTrace(RANGEFINDER2D_NWC_ROS2, "callback LaserScan");
62 std::lock_guard<std::mutex> data_guard(m_mutex);
63
64 if (m_data_valid==false)
65 {
66 m_minAngle = msg->angle_min;
67 m_maxAngle = msg->angle_max;
68 m_minDistance = msg->range_min;
69 m_maxDistance = msg->range_max;
70 m_resolution = msg->angle_increment;
71 m_data.resize(msg->ranges.size());
72 m_data_valid = true;
73 }
74 if (msg->ranges.size() == m_data.size())
75 {
76 for (size_t i=0; i<m_data.size(); i++)
77 {
78 m_data[i] = msg->ranges[i];
79 }
80 }
81 else
82 {
83 yCError(RANGEFINDER2D_NWC_ROS2, "Data vector changed its size?");
84 }
85 m_timestamp = (msg->header.stamp.sec + (msg->header.stamp.nanosec / 1000000000));
86}
87
88ReturnValue Rangefinder2D_nwc_ros2::getLaserMeasurement(std::vector<yarp::sig::LaserMeasurementData> &data, double* timestamp)
89{
90 if (!m_data_valid) {return ReturnValue::return_code::return_value_error_generic;}
91 std::lock_guard<std::mutex> data_guard(m_mutex);
92 *timestamp = m_timestamp;
93 return ReturnValue_ok;
94}
95
97{
98 if (!m_data_valid) {return ReturnValue::return_code::return_value_error_generic;}
99 std::lock_guard<std::mutex> data_guard(m_mutex);
100 data = m_data;
101 *timestamp = m_timestamp;
102 return ReturnValue_ok;
103}
104
106{
107 if (!m_data_valid) {return ReturnValue::return_code::return_value_error_generic;}
108 std::lock_guard<std::mutex> data_guard(m_mutex);
109 return ReturnValue_ok;
110}
111
113{
114 if (!m_data_valid) {return ReturnValue::return_code::return_value_error_generic;}
115 std::lock_guard<std::mutex> data_guard(m_mutex);
116 min = m_minDistance;
117 max = m_maxDistance;
118 return ReturnValue_ok;
119}
120
122{
123 if (!m_data_valid) {return ReturnValue::return_code::return_value_error_generic;}
124 std::lock_guard<std::mutex> data_guard(m_mutex);
125 yCTrace(RANGEFINDER2D_NWC_ROS2, "setDistanceRange not implemented");
127}
128
130{
131 if (!m_data_valid) {return ReturnValue::return_code::return_value_error_generic;}
132 std::lock_guard<std::mutex> data_guard(m_mutex);
133 min = m_minAngle;
134 max = m_maxAngle;
135 return ReturnValue_ok;
136}
137
139{
140 if (!m_data_valid) {return ReturnValue::return_code::return_value_error_generic;}
141 std::lock_guard<std::mutex> data_guard(m_mutex);
142 yCTrace(RANGEFINDER2D_NWC_ROS2, "setScanLimits not implemented");
144}
145
147{
148 if (!m_data_valid) {return ReturnValue::return_code::return_value_error_generic;}
149 std::lock_guard<std::mutex> data_guard(m_mutex);
150 step = m_resolution;
151 return ReturnValue_ok;
152}
153
155{
156 if (!m_data_valid) {return ReturnValue::return_code::return_value_error_generic;}
157 std::lock_guard<std::mutex> data_guard(m_mutex);
158 yCTrace(RANGEFINDER2D_NWC_ROS2, "setHorizontalResolution not implemented");
160}
161
163{
164 if (!m_data_valid) {return ReturnValue::return_code::return_value_error_generic;}
165 std::lock_guard<std::mutex> data_guard(m_mutex);
166 return ReturnValue_ok;
167}
168
170{
171 if (!m_data_valid) {return ReturnValue::return_code::return_value_error_generic;}
172 std::lock_guard<std::mutex> data_guard(m_mutex);
173 yCTrace(RANGEFINDER2D_NWC_ROS2, "setScanRate not implemented");
175}
176
178{
179 if (!m_data_valid) {return ReturnValue::return_code::return_value_error_generic;}
180 std::lock_guard<std::mutex> data_guard(m_mutex);
181 return ReturnValue_ok;
182}
const yarp::os::LogComponent & RANGEFINDER2D_NWC_ROS2()
#define ReturnValue_ok
Definition ReturnValue.h:77
#define YARP_METHOD_NOT_YET_IMPLEMENTED()
Definition ReturnValue.h:96
static rclcpp::Node::SharedPtr createNode(std::string name)
Definition Ros2Utils.cpp:9
bool parseParams(const yarp::os::Searchable &config) override
Parse the DeviceDriver parameters.
yarp::dev::ReturnValue setHorizontalResolution(double step) override
get the angular step between two measurements (if available)
yarp::dev::ReturnValue getScanRate(double &rate) override
get the scan rate (scans per seconds)
bool close() override
Close the DeviceDriver.
yarp::dev::ReturnValue setScanRate(double rate) override
set the scan rate (scans per seconds)
void callback(sensor_msgs::msg::LaserScan::SharedPtr msg, std::string topic)
yarp::dev::ReturnValue getRawData(yarp::sig::Vector &data, double *timestamp=nullptr) override
Get the device measurements.
yarp::dev::ReturnValue setScanLimits(double min, double max) override
set the scan angular range.
yarp::dev::ReturnValue getScanLimits(double &min, double &max) override
get the scan angular range.
yarp::dev::ReturnValue getDeviceStatus(Device_status &status) override
get the device status
yarp::dev::ReturnValue getHorizontalResolution(double &step) override
get the angular step between two measurements.
yarp::dev::ReturnValue getLaserMeasurement(std::vector< yarp::sig::LaserMeasurementData > &data, double *timestamp=nullptr) override
Get the device measurements.
yarp::dev::ReturnValue setDistanceRange(double min, double max) override
set the device detection range.
bool open(yarp::os::Searchable &config) override
Open the DeviceDriver.
yarp::dev::ReturnValue getDistanceRange(double &min, double &max) override
get the device detection range
yarp::dev::ReturnValue getDeviceInfo(std::string &device_info) override
get the device hardware characteristics
void subscribe_to_topic(std::string topic_name)
A mini-server for performing network communication in the background.
@ TraceType
Definition Log.h:92
A base class for nested structures that can be searched.
Definition Searchable.h:31
bool start()
Start the new thread running.
Definition Thread.cpp:93
void resize(size_t size) override
Resize the vector.
Definition Vector.h:221
size_t size() const
Definition Vector.h:341
#define yCInfo(component,...)
#define yCError(component,...)
#define yCTrace(component,...)
#define YARP_LOG_COMPONENT(name,...)
For streams capable of holding different kinds of content, check what they actually have.
An interface to the operating system, including Port based communication.