Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions rclpy/rclpy/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -185,3 +185,9 @@ def handle(self):

def destroy(self):
self.__client.destroy_when_not_in_use()

@property
def logger_name(self) -> str:
"""Get the name of the logger associated with the node of the client."""
with self.handle:
return self.__client.get_logger_name()
6 changes: 6 additions & 0 deletions rclpy/rclpy/publisher.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,12 @@ def topic_name(self) -> str:
def handle(self):
return self.__publisher

@property
def logger_name(self) -> str:
"""Get the name of the logger associated with the node of the publisher."""
with self.handle:
return self.__publisher.get_logger_name()

def destroy(self):
for handler in self.event_handlers:
handler.destroy()
Expand Down
6 changes: 6 additions & 0 deletions rclpy/rclpy/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,5 +83,11 @@ def send_response(self, response: SrvTypeResponse, header) -> None:
def handle(self):
return self.__service

@property
def logger_name(self) -> str:
"""Get the name of the logger associated with the node of the service."""
with self.handle:
return self.__service.get_logger_name()

def destroy(self):
self.__service.destroy_when_not_in_use()
5 changes: 5 additions & 0 deletions rclpy/rclpy/subscription.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,8 @@ def destroy(self):
def topic_name(self):
with self.handle:
return self.__subscription.get_topic_name()
@property
def logger_name(self) -> str:
"""Get the name of the logger associated with the node of the subscription."""
with self.handle:
return self.__subscription.get_logger_name()
16 changes: 15 additions & 1 deletion rclpy/src/rclpy/client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,17 @@ Client::take_response(py::object pyresponse_type)
return result_tuple;
}

const char *
Client::get_logger_name() const
{
const char * node_logger_name = rcl_node_get_logger_name(node_.rcl_ptr());
if (!node_logger_name) {
throw RCLError("Node logger name not set");
}

return node_logger_name;
}

void
define_client(py::object module)
{
Expand All @@ -164,6 +175,9 @@ define_client(py::object module)
"Return true if the service server is available")
.def(
"take_response", &Client::take_response,
"Take a received response from an earlier request");
"Take a received response from an earlier request")
.def(
"get_logger_name", &Client::get_logger_name,
"Get the name of the logger associated with the node of the client.");
}
} // namespace rclpy
9 changes: 9 additions & 0 deletions rclpy/src/rclpy/client.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,15 @@ class Client : public Destroyable, public std::enable_shared_from_this<Client>
void
destroy() override;

/// Get the name of the logger associated with the node of the client.
/**
*
* \return logger_name, or
* \return None on failure
*/
const char *
get_logger_name() const;

private:
Node node_;
std::shared_ptr<rcl_client_t> rcl_client_;
Expand Down
16 changes: 15 additions & 1 deletion rclpy/src/rclpy/service.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,17 @@ Service::get_qos_profile()
return rclpy::convert_to_qos_dict(&options->qos);
}

const char *
Service::get_logger_name() const
{
const char * node_logger_name = rcl_node_get_logger_name(node_.rcl_ptr());
if (!node_logger_name) {
throw RCLError("Node logger name not set");
}

return node_logger_name;
}

void
define_service(py::object module)
{
Expand All @@ -174,6 +185,9 @@ define_service(py::object module)
"Send a response")
.def(
"service_take_request", &Service::service_take_request,
"Take a request from a given service");
"Take a request from a given service")
.def(
"get_logger_name", &Service::get_logger_name,
"Get the name of the logger associated with the node of the service.");
}
} // namespace rclpy
9 changes: 9 additions & 0 deletions rclpy/src/rclpy/service.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,15 @@ class Service : public Destroyable, public std::enable_shared_from_this<Service>
const char *
get_service_name();

/// Get the name of the logger associated with the node of the service.
/**
*
* \return logger_name, or
* \return None on failure
*/
const char *
get_logger_name() const;

/// Get the QoS profile for this service.
py::dict
get_qos_profile();
Expand Down
4 changes: 4 additions & 0 deletions rclpy/test/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,10 @@ def test_different_type_raises(self):
self.node.destroy_client(cli)
self.node.destroy_service(srv)

def test_logger_name_is_equal_to_node_name(self) -> None:
with self.node.create_client(GetParameters, 'get/parameters') as cli:
self.assertEqual(cli.logger_name, 'TestClient')


if __name__ == '__main__':
unittest.main()
4 changes: 4 additions & 0 deletions rclpy/test/test_publisher.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,10 @@ def test_wait_for_all_acked(self):
pub.destroy()
sub.destroy()

def test_logger_name_is_equal_to_node_name(self) -> None:
with self.node.create_publisher(BasicTypes, TEST_TOPIC, 10) as pub:
self.assertEqual(pub.logger_name, 'node')


if __name__ == '__main__':
unittest.main()
21 changes: 21 additions & 0 deletions rclpy/test/test_subscription.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,21 @@
from test_msgs.msg import Empty


NODE_NAME = 'test_node'


@pytest.fixture(scope='session', autouse=True)
def setup_ros():
rclpy.init()


@pytest.fixture
def test_node():
node = Node(NODE_NAME)
yield node
node.destroy_node()


@pytest.mark.parametrize('topic_name, namespace, expected', [
# No namespaces
('topic', None, '/topic'),
Expand All @@ -49,6 +59,17 @@ def test_get_subscription_topic_name(topic_name, namespace, expected):
assert sub.topic_name == expected


def test_logger_name_is_equal_to_node_name(test_node):
sub = test_node.create_subscription(
msg_type=Empty,
topic='topic',
callback=lambda _: None,
qos_profile=10,
)

assert sub.logger_name == NODE_NAME


@pytest.mark.parametrize('topic_name, namespace, cli_args, expected', [
('topic', None, ['--ros-args', '--remap', 'topic:=new_topic'], '/new_topic'),
('topic', 'ns', ['--ros-args', '--remap', 'topic:=new_topic'], '/ns/new_topic'),
Expand Down