Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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()
6 changes: 6 additions & 0 deletions rclpy/rclpy/subscription.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,9 @@ 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
5 changes: 5 additions & 0 deletions rclpy/test/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,11 @@ 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:
cli = self.node.create_client(GetParameters, 'get/parameters')
self.assertEqual(cli.logger_name, 'TestClient')
self.node.destroy_client(cli)


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

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


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