2022年 11月 5日

建立一个python的ROS功能包

介绍

ROS的功能功能包可以用C++来写,也可以用python来写,有的功能通过python实现比较简单,所以就通过python来编写功能包,这里记录一下我编写python版的ROS功能包的方法
参考博客:原文链接

创建功能包

在自己的工作空间下面,创建功能包:

cd catkin_ws/src
catkin_create_pkg pc_connect rospy
cd pc_connect
touch setup.py
mkdir -p src/connect
touch setup.py
cd src/connect
touch __init__.py
touch pc_pub.py pc_sub.py connect.py
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

我这里就着我做的网路通信上位机这个功能来举例子了,ROS功能包叫pc_connect,在这个功能包下面,其中有订阅ROS话题,有发布ROS话题,有网络通信这几个功能,我把这几个功能模块封装成一个python包,叫做connect

配置__init__.py

在__init__.py中加入:

__all__=['pc_pub.py' 'pc_sub.py' 'connect.py']
  • 1

这样其他外部模块就可以通过from pc_connect import*来导入这个python包了

配置ROS编译环境

修改pc_connect功能包的CMakeList.txt文件:

cmake_minimum_required(VERSION 3.0.2)
project(py_pkg_1)
 
find_package(catkin REQUIRED COMPONENTS
  rospy
)
catkin_python_setup()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这里其实就是将功能包创建时生成的默认文件中catkin_python_setup()取消注释而已。这一行是告诉catkin编译工具这里面有python的包要安装,这样catkin在编译时就会在这个功能包的根目录下自动寻找setup.py文件并执行了。

编辑setup.py

setup.py文件用于将python包安装到ROS环境,这个setup.py经过了catkin的一层封装变得更为简洁了,其实它的底层调用的是python的distutils包实现安装的。关于使用distutils进行python包的安装及发布可以参考这篇文章

from distutils.core import setup
from catkin_pkg.python_setup import generate_distutils_setup
 
d = generate_distutils_setup(
    packages=['connect'],
    package_dir={'': 'src'}
)
 
setup(**d)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

packages代表你想要安装的python包
package_dir描述的是python包的存放路径,这个必须得写否则你的python包只能放在setup.py的同级目录
setup(**d)其实就是调用distutils包的setup模块

编译工作空间

catkin_make -j8
  • 1

建一个可执行的python文件,导入模块

在其中加入:

#!/usr/bin/env python
# coding=utf-8
# -*- coding: utf-8 -*-

import rospy
from pc_connect import*
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这样这个pytho程序就可以使用connect中的功能功能了