为了验证使用Python能否构建interface包,参照C++构造interface包的方式进行尝试。在尝试过程中,以下几个步骤是与C++的包一致的:
(1) 使用ros2 pkg create命令创建package
ros2 pkg create package_name –build-type ament _python –dependencies rclpy
(2) 创建与上面的例子一致的interface文件,这个步骤中,包括创建文件夹,以及在文件夹中编写interface定义文件;
使用Python构建interface包关键的问题在于编译,一种尝试的思路是沿着Python包编译的方式,结合interface定义对setup.py和package.xml进行设置;另外一种尝试的思路就是在Python包中添加CmakeLists.txt文件,从而为interface的编译提供支持
使用Python构建inferface包的尝试:
package中setup.py文件的编写
from setuptools import find_packages, setup
import os
from glob import glob
package_name = 'pkg_interface_py'
setup(
name=package_name,
version='0.0.0',
packages=find_packages(exclude=['test']),
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
('share/'+ package_name+'/msg',glob(os.path.join('msg','*.msg'))),
('share/'+ package_name+'/srv',glob(os.path.join('srv','*.srv')))
],
install_requires=['setuptools'],
zip_safe=True,
maintainer='sl',
maintainer_email='sl@todo.todo',
description='TODO: Package description',
license='TODO: License declaration',
tests_require=['pytest'],
entry_points={
'console_scripts': [
],
},
)
package.xml文件的编写
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>pkg_interface_py</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="sl@todo.todo">sl</maintainer>
<license>TODO: License declaration</license>
<depend>rclpy</depend>
<depend>learning_interface</depend>
<depend>pkg_test_interface</depend>
<depend>geometry_msgs</depend>
<depend>std_msgs</depend>
<test_depend>ament_copyright</test_depend>
<test_depend>ament_flake8</test_depend>
<test_depend>ament_pep257</test_depend>
<test_depend>python3-pytest</test_depend>
<buildtool_depend>rosidl_default_generators</buildtool_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
<export>
<build_type>ament_python</build_type>
</export>
</package>
编译后的结果
对这个包进行编译,对应包的lib/文件夹如下图所示,

可以看到这里没有.so文件,也就是没有获得相应的共享库文件。
再看对应包的share/文件夹,如下图所示:

这里获得了msg/文件夹和srv/文件夹,文件夹中虽然有对应的interface文件,但是却没有.idl文件。
因为是Python包,所以编译不会出现include/文件夹,自然也就不会得到.hpp和.h文件。因为没有得到头文件,因此可以肯定的是这个包无法提供给C ++的包进行引用。
尝试使用构建的msg
那么能不能被Python的包引用吗?下面采用一个实例进行验证。
在另外一个叫做pkg_test_py的包的节点中调用定义msg,代码如下:
import rclpy
from rclpy.node import Node
from pkg_interface_py.msg import Nummsg
from std_msgs.msg import Int32
class PublisherNode(Node):
def __init__(self, name):
super().__init__(name)
self.pub = self.create_publisher(Nummsg, "chatter1", 10)
self.i=0
self.timer = self.create_timer(0.5, self.timer_callback)
def timer_callback(self):
msg = Nummsg()
msg.num = self.i
self.i+=1
self.pub.publish(msg)
self.get_logger().info('Publishing: "%s"' % msg.num)
def main(args=None):
rclpy.init(args=args)
node = PublisherNode("topic_helloworld_pub")
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
运行的结果如下:

可以看到提示对应的msg。虽然在interface包的share/文件夹中已经存在msg文件,但这里却提示找不到msg,这说明ROS的Python包在调用其他包的interface时,并不是依靠相应的interface定义文件,而是需要依靠.so(共享库文件)和.idl文件(接口文件),而这种编译方式下是不会产生.so和.idl文件,所以在调用时也不可能找到相应的interface了。
第2种构建思路的实现,由于篇幅关系,在这里就不再呈现,经验证,这种方式也是失败的。
关于ROS2构建interfaces的关键要点
ROS构建interface包的过程中,起关键作用的是rosidl_default_generator这个包,目前这个包只能在C++中使用,Python还无法使用,因此使用Python是无法构建interface包。上面提到的使用Python构建interfaces的两种方式都无法使rosidl_generate_interfaces()设置项并没有得到执行,也就是无法实现interfaces的真正构建。因此就目前来讲,使用Python是无法在ROS2中实现interfaces构建。
1103

被折叠的 条评论
为什么被折叠?



