起因

最近在做人体姿态估计的项目,需要用到ROS2,但是ROS2的消息类型不够用,所以需要自定义消息类型,这里记录一下自定义消息类型的过程.

使用的工具如下

  • ROS2 Humble
  • VSCode
  • Alphapose

之前跟着官方文档做过一次,但是学会了,但又没学会.这次是真的要用,反而出问题了.

自定义消息类型

之前以为每个包里面都可以自定义消息,但是想多了,需要独立的包来存放自定义消息.

创建包

1
ros2 pkg create --build-type ament_python --node-name people_msgs people_msgs

创建消息

1
2
3
4
# Point.msg
float32 x
float32 y
float32 z
1
2
# People.msg 以为人体关键点是26个,所以这里就写26个,但是后面发现出了问题
Point[26] keypoints

记住这个26,问题就出在这里.

1
2
# PeopleArray.msg
People[] people

编译

1
colcon build --packages-select people_msgs

使用

待完成

[

](https://oss.xljsci.com//download/%E5%B0%8F%E7%BB%BF%E9%B2%B8%E8%8B%B1%E6%96%87%E6%96%87%E7%8C%AE%E9%98%85%E8%AF%BB%E5%99%A8_setup_2.3.6.exe)

[

下载pad端

](https://oss.xljsci.com//download/%E5%B0%8F%E7%BB%BF%E9%B2%B8%E8%8B%B1%E6%96%87%E6%96%87%E7%8C%AE%E9%98%85%E8%AF%BB%E5%99%A8_setup_2.3.6.exe)

帮助

0.1M/2.32G

开通鲸会员

首页

20231219-2023年度学生党支部书记抓党建述职暨推优工作通知20231219-2023年度学生党支部书记抓党建述职暨推优工作通知

鲸译AI通用版

鲸译AI机械工程版

跟随

译文

锁定

连翻

复制

14

23 years

原文

选中下方词组添加为术语和单词

复制

修改

23 年度

反馈

笔记

信息

写作

单词

速读

解析

汇报

暂无数据

上传完成(1/1)

20231219-2023年度学生党支部书记抓党建述职暨推优工作通知.pdf

去阅读```bash
source install/setup.bash

1
2
3
4
5
6
7

## 使用自定义消息

### 创建包

```bash
ros2 pkg create --build-type ament_python --node-name people_sub people_sub

编写代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# people_sub.py
import rclpy
from rclpy.node import Node
from people_msgs.msg import PeopleArray

class PeopleSub(Node):
def __init__(self):
super().__init__('people_sub')
self.sub = self.create_subscription(PeopleArray, 'people', self.people_callback, 10)

def people_callback(self, msg):
self.get_logger().info('I heard: %s' % msg)

def getnode(self): # 假如说这是识别后处理关键点的函数
peoplearray = PeopleArray()
for i in peoplelist: # 假如说这是识别后所有人的列表
people = People()
# people.keypoints.clear() # 这里是关键,不然会出问题
for j in i: #每个人身上的关键点
point = Point()
point.x = j[0]
point.y = j[1]
point.z = j[2]
people.keypoints.append(point)
peoplearray.people.append(people)
return peoplearray




return self

def main(args=None):
rclpy.init(args=args)
people_sub = PeopleSub()
rclpy.spin(people_sub)
people_sub.destroy_node()
rclpy.shutdown()

if __name__ == '__main__':
main()

编译

1
colcon build --packages-select people_sub

使用

1
2
source install/setup.bash
ros2 run people_sub people_sub

问题

我使用自定义消息进行接收,发现接收到的消息是空的,后来发现是因为我在创建消息的时候,它会默认创建一个空的消息(26个数据都是0),所以我在创建消息的时候,需要先清空消息,然后再添加数据.

感悟

果然实践是检验真理的唯一标准

这次的问题是单步调试出来的,调试之前处理了python路径的问题,不然无法使用VSCode调试.

python扩展路径问题

1
2
# 1.通过脚本查看python路径
python -c "import sys; print(sys.path)"

设置环境vscode路径

Python扩展 设置 -> Pythoninterpreter Path -> (/usr/bin/python3)换成上一步的路径即可解决

还有个问题我问了下GPT

ROS2使用自定义Python解释器

要指定ROS 2使用的Python解释器,您可以设置环境变量PYTHON_EXECUTABLE,将其设置为要使用的Python解释器的路径。例如,假设您的自定义Python解释器位于/path/to/my/python,则可以使用以下命令在终端中设置环境变量:

export PYTHON_EXECUTABLE=/path/to/my/python

设置环境变量后,ROS 2将使用指定的Python解释器。您可以在启动ROS 2节点时验证Python解释器是否正确设置,例如:

ros2 run my_package my_node --ros-args --log-level debug

这将在终端输出ROS 2节点的日志信息,其中包括使用的Python解释器。如果您看到的输出中包含您自定义的Python解释器路径,则表示ROS 2正在使用指定的Python解释器。

注意,设置自定义Python解释器可能会导致ROS 2某些功能无法正常工作,因为ROS 2可能依赖于特定版本的Python和Python库。如果您遇到问题,请尝试使用ROS 2默认的Python解释器,或者确保您的自定义Python解释器与ROS 2所需的Python版本和库兼容。