ROS基础——自定义话题消息

本文记录了ROS初学者在创建自定义消息时遇到的问题,包括在.msg文件中定义错误的geometry_msgs/Point类型,CMakeLists.txt配置错误,以及依赖消息未正确指定。通过错误提示逐步定位问题,最终成功解决并完成配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录自己的BUG,BUG心路历程。

(base) warmtree@warmtree-HP-Pavilion-Laptop-15-cc5xx:~$ cd ros
(base) warmtree@warmtree-HP-Pavilion-Laptop-15-cc5xx:~/ros$ catkin build
-------------------------------------------------------
Profile:                     default
Extending:          [cached] /opt/ros/melodic
Workspace:                   /home/warmtree/ros
-------------------------------------------------------
Build Space:        [exists] /home/warmtree/ros/build
Devel Space:        [exists] /home/warmtree/ros/devel
Install Space:      [unused] /home/warmtree/ros/install
Log Space:          [exists] /home/warmtree/ros/logs
Source Space:       [exists] /home/warmtree/ros/src
DESTDIR:            [unused] None
-------------------------------------------------------
Devel Space Layout:          linked
Install Space Layout:        None
-------------------------------------------------------
Additional CMake Args:       None
Additional Make Args:        None
Additional catkin Make Args: None
Internal Make Job Server:    True
Cache Job Environments:      False
-------------------------------------------------------
Whitelisted Packages:        None
Blacklisted Packages:        None
-------------------------------------------------------
Workspace configuration appears valid.
-------------------------------------------------------
Traceback (most recent call last):
  File "/home/warmtree/anaconda3/bin/catkin", line 11, in <module>
    load_entry_point('catkin-tools', 'console_scripts', 'catkin')()
  File "/home/warmtree/anaconda3/lib/python3.7/site-packages/catkin_tools/commands/catkin.py", line 272, in main
    catkin_main(sysargs)
  File "/home/warmtree/anaconda3/lib/python3.7/site-packages/catkin_tools/commands/catkin.py", line 267, in catkin_main
    sys.exit(args.main(args) or 0)
  File "/home/warmtree/anaconda3/lib/python3.7/site-packages/catkin_tools/verbs/catkin_build/cli.py", line 422, in main
    summarize_build=opts.summarize  # Can be True, False, or None
  File "/home/warmtree/anaconda3/lib/python3.7/site-packages/catkin_tools/verbs/catkin_build/build.py", line 296, in build_isolated_workspace
    workspace_packages = find_packages(context.source_space_abs, exclude_subspaces=True, warnings=[])
  File "/home/warmtree/anaconda3/lib/python3.7/site-packages/catkin_pkg/packages.py", line 89, in find_packages
    packages = find_packages_allowing_duplicates(basepath, exclude_paths=exclude_paths, exclude_subspaces=exclude_subspaces, warnings=warnings)
  File "/home/warmtree/anaconda3/lib/python3.7/site-packages/catkin_pkg/packages.py", line 150, in find_packages_allowing_duplicates
    xml, filename=filename, warnings=warnings)
  File "/home/warmtree/anaconda3/lib/python3.7/site-packages/catkin_pkg/package.py", line 771, in parse_package_string
    raise InvalidPackage('Error(s):%s' % (''.join(['\n- %s' % e for e in errors])), filename)
catkin_pkg.package.InvalidPackage: Error(s) in package '/home/warmtree/ros/src/swarm/package.xml':
Error(s):
- The manifest of package "swarm" (with format version 1) must not contain the following tags: exec_depend
- Either update to a newer format or replace <exec_depend> tags with <run_depend> tags.
(base) warmtree@warmtree-HP-Pavilion-Laptop-15-cc5xx:~/ros$ catkin build
-------------------------------------------------------
Profile:                     default
Extending:          [cached] /opt/ros/melodic
Workspace:                   /home/warmtree/ros
-------------------------------------------------------
Build Space:        [exists] /home/warmtree/ros/build
Devel Space:        [exists] /home/warmtree/ros/devel
Install Space:      [unused] /home/warmtree/ros/install
Log Space:          [exists] /home/warmtree/ros/logs
Source Space:       [exists] /home/warmtree/ros/src
DESTDIR:            [unused] None
-------------------------------------------------------
Devel Space Layout:          linked
Install Space Layout:        None
-------------------------------------------------------
Additional CMake Args:       None
Additional Make Args:        None
Additional catkin Make Args: None
Internal Make Job Server:    True
Cache Job Environments:      False
-------------------------------------------------------
Whitelisted Packages:        None
Blacklisted Packages:        None
-------------------------------------------------------
Workspace configuration appears valid.
-------------------------------------------------------
Traceback (most recent call last):
  File "/home/warmtree/anaconda3/lib/python3.7/site-packages/catkin_pkg/package.py", line 596, in parse_package_string
    root = dom.parseString(data)
  File "/home/warmtree/anaconda3/lib/python3.7/xml/dom/minidom.py", line 1968, in parseString
    return expatbuilder.parseString(string)
  File "/home/warmtree/anaconda3/lib/python3.7/xml/dom/expatbuilder.py", line 925, in parseString
    return builder.parseString(string)
  File "/home/warmtree/anaconda3/lib/python3.7/xml/dom/expatbuilder.py", line 223, in parseString
    parser.Parse(string, True)
xml.parsers.expat.ExpatError: mismatched tag: line 48, column 31

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/warmtree/anaconda3/bin/catkin", line 11, in <module>
    load_entry_point('catkin-tools', 'console_scripts', 'catkin')()
  File "/home/warmtree/anaconda3/lib/python3.7/site-packages/catkin_tools/commands/catkin.py", line 272, in main
    catkin_main(sysargs)
  File "/home/warmtree/anaconda3/lib/python3.7/site-packages/catkin_tools/commands/catkin.py", line 267, in catkin_main
    sys.exit(args.main(args) or 0)
  File "/home/warmtree/anaconda3/lib/python3.7/site-packages/catkin_tools/verbs/catkin_build/cli.py", line 422, in main
    summarize_build=opts.summarize  # Can be True, False, or None
  File "/home/warmtree/anaconda3/lib/python3.7/site-packages/catkin_tools/verbs/catkin_build/build.py", line 296, in build_isolated_workspace
    workspace_packages = find_packages(context.source_space_abs, exclude_subspaces=True, warnings=[])
  File "/home/warmtree/anaconda3/lib/python3.7/site-packages/catkin_pkg/packages.py", line 89, in find_packages
    packages = find_packages_allowing_duplicates(basepath, exclude_paths=exclude_paths, exclude_subspaces=exclude_subspaces, warnings=warnings)
  File "/home/warmtree/anaconda3/lib/python3.7/site-packages/catkin_pkg/packages.py", line 150, in find_packages_allowing_duplicates
    xml, filename=filename, warnings=warnings)
  File "/home/warmtree/anaconda3/lib/python3.7/site-packages/catkin_pkg/package.py", line 598, in parse_package_string
    raise InvalidPackage('The manifest contains invalid XML:\n%s' % ex, filename)
catkin_pkg.package.InvalidPackage: Error(s) in package '/home/warmtree/ros/src/swarm/package.xml':
The manifest contains invalid XML:
mismatched tag: line 48, column 31
(base) warmtree@warmtree-HP-Pavilion-Laptop-15-cc5xx:~/ros$ catkin build
-------------------------------------------------------
Profile:                     default
Extending:          [cached] /opt/ros/melodic
Workspace:                   /home/warmtree/ros
-------------------------------------------------------
Build Space:        [exists] /home/warmtree/ros/build
Devel Space:        [exists] /home/warmtree/ros/devel
Install Space:      [unused] /home/warmtree/ros/install
Log Space:          [exists] /home/warmtree/ros/logs
Source Space:       [exists] /home/warmtree/ros/src
DESTDIR:            [unused] None
-------------------------------------------------------
Devel Space Layout:          linked
Install Space Layout:        None
-------------------------------------------------------
Additional CMake Args:       None
Additional Make Args:        None
Additional catkin Make Args: None
Internal Make Job Server:    True
Cache Job Environments:      False
-------------------------------------------------------
Whitelisted Packages:        None
Blacklisted Packages:        None
-------------------------------------------------------
Workspace configuration appears valid.
-------------------------------------------------------
[build] Found '2' packages in 0.0 seconds.                                     
[build] Package table is up to date.                                           
Starting  >>> capture_key                                                      
Starting  >>> swarm                                                            
Finished  <<< capture_key                [ 1.3 seconds ]                       
_______________________________________________________________________________
Errors     << swarm:check /home/warmtree/ros/logs/swarm/build.check.009.log    
/opt/ros/melodic/share/genmsg/cmake/pkg-genmsg.cmake.em:56: error: <class 'genmsg.base.InvalidMsgSpec'>: /home/warmtree/ros/src/swarm/msg/NameAndPose.msg: Invalid declaration: geometry_msgs/Point
Traceback (most recent call last):
  File "/usr/bin/empy", line 3302, in <module>
    if __name__ == '__main__': main()
  File "/usr/bin/empy", line 3300, in main
    invoke(sys.argv[1:])
  File "/usr/bin/empy", line 3283, in invoke
    interpreter.wrap(interpreter.file, (file, name))
  File "/usr/bin/empy", line 2295, in wrap
    self.fail(e)
  File "/usr/bin/empy", line 2284, in wrap
    callable(*args)
  File "/usr/bin/empy", line 2359, in file
    self.safe(scanner, done, locals)
  File "/usr/bin/empy", line 2401, in safe
    self.parse(scanner, locals)
  File "/usr/bin/empy", line 2421, in parse
    token.run(self, locals)
  File "/usr/bin/empy", line 1425, in run
    interpreter.execute(self.code, locals)
  File "/usr/bin/empy", line 2595, in execute
    _exec(statements, self.globals, locals)
  File "/usr/bin/empy", line 42, in _exec
    exec("""exec code in globals""")
  File "<string>", line 1, in <module>
  File "<string>", line 38, in <module>
  File "/opt/ros/melodic/lib/python2.7/dist-packages/genmsg/deps.py", line 45, in find_msg_dependencies_with_type
    spec = genmsg.msg_loader.load_msg_from_file(msg_context, msg_file, full_type_name)
  File "/opt/ros/melodic/lib/python2.7/dist-packages/genmsg/msg_loader.py", line 289, in load_msg_from_file
    raise InvalidMsgSpec('%s: %s'%(file_path, e))
genmsg.base.InvalidMsgSpec: /home/warmtree/ros/src/swarm/msg/NameAndPose.msg: Invalid declaration: geometry_msgs/Point
CMake Error at /opt/ros/melodic/share/catkin/cmake/safe_execute_process.cmake:11 (message):

  execute_process(/home/warmtree/ros/build/swarm/catkin_generated/env_cached.sh
  "/usr/bin/python2" "/usr/bin/empy" "--raw-errors" "-F"
  "/home/warmtree/ros/build/swarm/cmake/swarm-genmsg-context.py" "-o"
  "/home/warmtree/ros/build/swarm/cmake/swarm-genmsg.cmake"
  "/opt/ros/melodic/share/genmsg/cmake/pkg-genmsg.cmake.em") returned error
  code 1
Call Stack (most recent call first):
  /opt/ros/melodic/share/catkin/cmake/em_expand.cmake:25 (safe_execute_process)
  /opt/ros/melodic/share/genmsg/cmake/genmsg-extras.cmake:303 (em_expand)
  CMakeLists.txt:69 (generate_messages)


make: *** [cmake_check_build_system] Error 1
cd /home/warmtree/ros/build/swarm; catkin build --get-env swarm | catkin env -si  /usr/bin/make cmake_check_build_system; cd -
...............................................................................
Failed     << swarm:check                [ Exited with code 2 ]                
Failed    <<< swarm                      [ 3.7 seconds ]                       
[build] Summary: 1 of 2 packages succeeded.                                    
[build]   Ignored:   None.                                                     
[build]   Warnings:  None.                                                     
[build]   Abandoned: None.                                                     
[build]   Failed:    1 packages failed.                                        
[build] Runtime: 3.8 seconds total.   

第一次,几何类型Pose在.msg 文件中定义Invalid declaration: geometry_msgs/Point出错,然而当时我没有发现,我以为是在CMakeLists.txt 文件中出错了,BUG在查找中

(base) warmtree@warmtree-HP-Pavilion-Laptop-15-cc5xx:~/ros$ source devel/setup.bash
(base) warmtree@warmtree-HP-Pavilion-Laptop-15-cc5xx:~/ros$ catkin build
-------------------------------------------------------
Profile:                     default
Extending:          [cached] /opt/ros/melodic
Workspace:                   /home/warmtree/ros
-------------------------------------------------------
Build Space:        [exists] /home/warmtree/ros/build
Devel Space:        [exists] /home/warmtree/ros/devel
Install Space:      [unused] /home/warmtree/ros/install
Log Space:          [exists] /home/warmtree/ros/logs
Source Space:       [exists] /home/warmtree/ros/src
DESTDIR:            [unused] Non
### 创建和使用ROS2自定义消息接口进行话题通信 #### 定义自定义消息类型 为了在ROS2中创建自定义消息接口,首先需要在一个功能包内定义新的消息类型。这通常是在`msg`目录下完成的。对于每一个新消息类型,都需要编写一个`.msg`文件来描述该消息的数据结构。 例如,在名为`tutorial_interfaces`的功能包里可以创建一个新的消息类型叫做`Num.msg`: ```plaintext int64 num string name ``` 此段代码表示这个消息由一个整数类型的成员变量`num`和字符串类型的成员变量`name`组成[^1]。 #### 编译消息文件 一旦定义好了消息的内容格式之后,则需编译这些消息文件以便它们能够被其他部分所识别并利用。确保已经安装了必要的依赖项,并且更新了`package.xml`中的构建工具配置。接着修改`CMakeLists.txt`以包含如下指令用于处理消息生成过程: ```cmake find_package(rosidl_default_generators REQUIRED) rosidl_generate_interfaces(${PROJECT_NAME} "msg/Num.msg" ) ``` 上述命令会告诉ROS2去查找项目根目录下的`msg`子文件夹内的所有`.msg`文件并将之转换成多种编程语言可用的形式[^3]。 #### 发布者端实现 当完成了消息类型的定义及其编译工作后就可以着手于开发具体的程序逻辑了。下面给出的是基于Python的一个简单的发布者的例子,它将会发送之前提到过的`Num`消息给订阅者们。 ```python import rclpy from rclpy.node import Node from tutorial_interfaces.msg import Num class MinimalPublisher(Node): def __init__(self): super().__init__('minimal_publisher') self.publisher_ = self.create_publisher(Num, 'topic', 10) timer_period = 0.5 # seconds self.timer = self.create_timer(timer_period, self.timer_callback) self.i = 0 def timer_callback(self): msg = Num() msg.num = self.i msg.name = f'Number {self.i}' self.publisher_.publish(msg) self.get_logger().info(f'Sending: "{msg}"') self.i += 1 def main(args=None): rclpy.init(args=args) minimal_publisher = MinimalPublisher() rclpy.spin(minimal_publisher) minimal_publisher.destroy_node() rclpy.shutdown() if __name__ == '__main__': main() ``` 这段脚本展示了怎样导入特定的消息类(`tutorial_interfaces.msg.Num`)并通过调用`create_publisher()`方法指定要发布的主题名称以及队列长度等参数来初始化一个发布对象;随后设置了一个定时器周期性地向网络广播带有计数值的信息[^4]。 #### 订阅者端接收 同样地,这里也给出了相应的订阅方样例代码片段用来展示如何监听来自同一主题上的数据流并对收到的新鲜样本作出响应。 ```python import rclpy from rclpy.node import Node from tutorial_interfaces.msg import Num class MinimalSubscriber(Node): def __init__(self): super().__init__('minimal_subscriber') self.subscription = self.create_subscription( Num, 'topic', self.listener_callback, 10) self.subscription # prevent unused variable warning def listener_callback(self, msg): self.get_logger().info('I heard: "%s"' % msg) def main(args=None): rclpy.init(args=args) minimal_subscriber = MinimalSubscriber() rclpy.spin(minimal_subscriber) minimal_subscriber.destroy_node() rclpy.shutdown() if __name__ == '__main__': main() ``` 在这个版本中,通过`create_subscription()`函数指定了想要关注的主题名还有每当接收到一条新信息时应该执行的动作——即回调函数`listener_callback()`, 这个函数负责打印出实际获取到的具体内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥鼠路易

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值