按照官方文档步骤创建自定义消息时,在编译生成头文件这步时,一直报错,反复查看CMakeList.txt和Package.xml文件,跟官方知道文件一模一样,但是就是报错。报错内容如下:
CMake Error at /opt/ros/dashing/share/rosidl_adapter/cmake/rosidl_adapt_interfaces.cmake:60 (message):
execute_process(/usr/bin/python3 -m rosidl_adapter --package-name
person_interface --arguments-file
/home/xs_sjw/ros2_interface/build/person_interface/rosidl_adapter__arguments__person_interface.json
--output-dir
/home/xs_sjw/ros2_interface/build/person_interface/rosidl_adapter/person_interface
--output-file
/home/xs_sjw/ros2_interface/build/person_interface/rosidl_adapter/person_interface.idls)
returned error code 1:
Traceback (most recent call last):
File "/usr/lib/python3.6/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.6/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/opt/ros/dashing/lib/python3.6/site-packages/rosidl_adapter/__main__.py", line 19, in <module>
sys.exit(main())
File "/opt/ros/dashing/lib/python3.6/site-packages/rosidl_adapter/main.py", line 55, in main
pathlib.Path(relative_path), output_dir)
File "/opt/ros/dashing/lib/python3.6/site-packages/rosidl_adapter/__init__.py", line 20, in convert_to_idl
package_dir, package_name, interface_file, output_dir / 'msg')
File "/opt/ros/dashing/lib/python3.6/site-packages/rosidl_adapter/msg/__init__.py", line 28, in convert_msg_to_idl
msg = parse_message_string(package_name, input_file.stem, content)
File "/opt/ros/dashing/lib/python3.6/site-packages/rosidl_adapter/parser.py", line 519, in parse_message_string
constants.append(Constant(type_string, name, value))
File "/opt/ros/dashing/lib/python3.6/site-packages/rosidl_adapter/parser.py", line 314, in __init__
raise NameError("the constant name '%s' is not valid" % name)
NameError: the constant name 'name' is not valid
Call Stack (most recent call first):
/opt/ros/dashing/share/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake:130 (rosidl_adapt_interfaces)
CMakeLists.txt:36 (rosidl_generate_interfaces)
最后发现.msg文件在定义消息类型时,在文件中进行赋值操作的变量必须是大写,否则就会报错。
错误例子:
bool female=true #赋值操作时,变量字母必须是大写,否则编译会报错
bool male=false
string name
int64 age
float64 height
string address
正确写法:
bool FEMALE=true #赋值操作时,变量字母必须是大写,否则编译会报错
bool MALE=false
string name
int64 age
float64 height
string address
将小写改为大写后再编译就不再报错了。