1、创建python包
ros2 pkg create --build-type ament_python 'demo' --dependencies rclpy
以上指令为创建一个名为demo
的python功能包。
2、创建可执行文件
在demo/demo
路径下新建demo.py
文件。
3、引用可执行文件
在setup.py
文件的最下放的entry_points
属性,引入可执行文件:
entry_points={
'console_scripts': [
'demo = demo.demo:main' #change
],
},
4、引用msgs
一般来说,在主文件demo.py
的开始引用即可,比如
from nav_msgs.msg import Odometry
如果报错,没有找到该msgs,则到package.xml
文件中,添加
<exec_depend>nav_msgs</exec_depend> #change
<test_depend>ament_copyright</test_depend>
5、sub/pub topic主程序
5.1 sub topic
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class DemoSub(Node):
def __init__(self):
super().__init__('sub_node')
self.subscription = self.create_subscription(String, 'topic', self.listenerCB, 10)
def listenerCB(self, msg):
self.get_logger().info('I heard: "%s"' % msg.data)
def main(args=None):
rclpy.init(args=args)
demo_sub = DemoSub()
rclpy.spin(demo_sub)
demo_sub.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
5.2 pub topic
class DemoPub(Node):
def __init__(self):
super().__init__('pub_node')
self.publisher_ = self.create_publisher(String, 'topic', 10)
timer_period = 0.5 # seconds
self.timer = self.create_timer(timer_period, self.timerLoop)
self.i = 0
def timerLoop(self):
msg = String()
msg.data = 'Hello World: %d' % self.i
self.publisher_.publish(msg)
self.get_logger().info('Publishing: "%s"' % msg.data)
self.i += 1
def main(args=None):
rclpy.init(args=args)
demo_pub = DemoPub()
rclpy.spin(demo_pub)
demo_pub.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
6、tips
有的时候,python中修改了一个数值,重新编译后,可能编译器没有发现修改的地方,有可能不执行修改后的值。所以,为了保险起见,如果比较小的改动,把install和build中相应包的文件删除后再编译,确保编译器一定是按修改后的代码来编译的。