3
$\begingroup$

My problem is that I cannot see or access the full extent of the custom message in ROS 2 Foxy. My custom message is named "Logitechjoy.msg":

# Logitechjoy.msg
std_msgs/Header header
Joyaxisbuttons buttons

The structure for "Joyaxisbuttons.msg" is:

uint8 green
uint8 yellow
uint8 red
uint8 blue
uint8 lb
uint8 lr

When I build this message using "colcon build" , I receive no errors. However, when I inspect the message using "ros2 interface show control_main_msg/msg/Logitechjoy", I see:

# Logitechjoy.msg
std_msgs/Header header
Joyaxisbuttons buttons

However, there's no extent shown below the "Joyaxisbuttons buttons" line. If I understand correctly, there should have been a display of the Joyaxisbuttons.msg structure following the "Joyaxisbuttons buttons" line.

The message is successfully imported into Python. I can access the header and buttons attributes, but not attributes like header.stamp or buttons.green. Here's an example of my Python code:

from control_main_msg.msg import Logitechjoy

joy_msg = Logitechjoy
joy_msg.header  # This works
joy_msg.header.stamp  # This causes an error

Error:

Traceback (most recent call last):
File "<string>", line 1, in <module>
AttributeError: 'property' object has no attribute 'stamp'

I do not understand why I cannot see or access the extent of the custom message. Am I forgetting something?

PS: Here's the content of my CMakeLists.txt:

cmake_minimum_required(VERSION 3.5)

project(control_main_msg)

# Default to C++17
if(NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 17)
  set(CMAKE_CXX_STANDARD_REQUIRED ON)
endif()
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

find_package(ament_cmake REQUIRED)
find_package(builtin_interfaces REQUIRED)
find_package(geometry_msgs REQUIRED)
find_package(rosidl_default_generators REQUIRED)
find_package(std_msgs REQUIRED)

set(msg_files
  "msg/Joyaxisbuttons.msg"
  "msg/Logitechjoy.msg"
)

rosidl_generate_interfaces(${PROJECT_NAME}
      ${msg_files}
      DEPENDENCIES builtin_interfaces geometry_msgs std_msgs
      ADD_LINTER_TESTS
)

ament_export_dependencies(rosidl_default_runtime)
ament_package()
$\endgroup$

1 Answer 1

3
$\begingroup$

Your problem can be found in this chunk of code you've shared:

from control_main_msg.msg import Logitechjoy

joy_msg = Logitechjoy
joy_msg.header  # This works
joy_msg.header.stamp  # This causes an error

You're calling joy_msg = LogitechJoy when you should be calling joy_msg = LogitechJoy(). Notice the difference: in Python, it's perfectly valid to provide a class, function, etc to a variable without providing parentheses. But when you do that, you don't create an instance of the class (which in this case, is what you need). By adding the parentheses you construct the message class, provide it to the variable, and will be able to use the message correctly.

A similar error can sometimes be produced if the build process was interrupted somehow. In that case the easiest solution is to simply delete your build directory and re-build.

$\endgroup$
2
  • $\begingroup$ Thank you for the answer and explanation. Now it's working correctly. I cannot believe that in my testing, I didn't even try this. $\endgroup$
    – Frenki221
    Aug 11, 2023 at 18:01
  • $\begingroup$ @Frenki221 it's a tiny difference. It is not easy to detect if you don't know what to look for / haven't seen it before. $\endgroup$
    – Ángel
    Aug 12, 2023 at 1:16

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.