< >
Home » ROS与Python入门教程 » ROS与Python入门教程-制作Makefile文件

ROS与Python入门教程-制作Makefile文件

ROS与Python入门教程-制作Makefile文件

说明

  • 介绍如果制作Makefile文件

介绍

  • 这两个关于构建包的文件(CMakeLists.txt,Makefile)很简单,但提供非常重要的功能:

    • 自动生成message和service代码
    • 运行测试
  • 测试功能非常重要,因为它可以测试你的包和相关依赖的包(rospack pkg test)

  • 使用catkin, 你只需要一个CMakefile,它在你的build目录可以生成Makefile文件

创建包

  • 在catkin的工作空间,创建新包:
$ cd ~/catkin_ws/src
$ catkin_create_pkg my_pkg message_generation rospy
  • 上面命令创建my_pkg,它依赖rospy包和message_generation包。

  • message_generation包可以定义message(消息)和service(服务)。

  • 在package.xml文件,需包含:

    <buildtool_depend>catkin</buildtool_depend>

  • 在CMakeLists.txt文件,最少包含:
cmake_minimum_required(VERSION 2.8.3)
project(my_pkg)

find_package(catkin REQUIRED COMPONENTS message_generation rospy ...)
catkin_package()

添加message和service

  • 添加message或service 需要更改 package.xml and CMakeLists.txt文件
  • 在package.xml文件,添加:
<build_depend>message_generation</build_depend>
  • 在CMakelists.txt文件, 添加:
cmake_minimum_required(VERSION 2.8.3)
project(my_pkg)

find_package(catkin REQUIRED COMPONENTS message_generation rospy)

add_message_files(
  FILES  # e.g. Floats.msg HeaderString.msg
)
add_service_files(
  DIRECTORY srv 
  FILES AddTwoInts.srv BadTwoInts.srv
)

## Generate services in the 'srv' folder
# add_service_files(
#  FILES  # e.g. Floats.srv HeaderString.srv
#)

## Generate added messages and services with any dependencies
generate_messages()

catkin_package(
  CATKIN_DEPENDS message_runtime
)

安装脚本和导出模块

  • 使用catkin,ROS包有一个安装目标。这使得其他软件包管理器自动创建安装包比apt-get容易得多,也适用于MacOS,拱,BSD,窗户,等。
  • 开发者的责任就是描述需要安装什么,如果在你的源代码树上的每一个文件都安装在其他人的电脑上,这样不是十分好。
  • 所以对于Python项目,我想安装脚本和python模块在其他的电脑上作为库来使用(其他资源目前还没有支持在setup.py声明,可以使用CMakeLists.txt代替)
  • 在教程里,创建一个作为例子的Python包:
$ cd ~/catkin_ws/src/my_pkg    # new catkin package, in the workspace
$ mkdir bin
$ mkdir src
$ mkdir src/tutorial_package
$ touch src/tutorial_package/__init__.py
  • 这里定义一个python包,叫tutorial_package。通常定义一个名称应该跟catkin包相同名称(如my_pkg),为了避免冲突,我们命名为不一样的名称,这样容易辨别。
  • 在my_pkg,新建src/tutorial_package/hello.py文件
def say(name):
    print('Hello ' + name)
  • 再创建bin/hello文件:
#! /usr/bin/env python

import tutorial_package.hello

if __name__ == '__main__':
    tutorial_package.hello.say('my friend!')
  • 设置可执行
$ chmod u+x bin/hello
  • 如果尝试执行,会报错
$ bin/hello 
Traceback (most recent call last):
  File "bin/hello", line 3, in <module>
    import tutorial_package.hello
ImportError: No module named tutorial_package.hello
  • 解决1:更改 PYTHONPATH,但只能在你本地执行
  • 解决2:如果要普遍适用,就要定义一个安装程序,移动文件到PYTHONPATH。
  • 对于python包和脚本,catkin提供cmake macro来提取来自setup.py的相关信息。
  • 在my_pkg根目录下创建setup.py,内容如下:
## ! DO NOT MANUALLY INVOKE THIS setup.py, USE CATKIN INSTEAD

from distutils.core import setup
from catkin_pkg.python_setup import generate_distutils_setup

# fetch values from package.xml
setup_args = generate_distutils_setup(
    packages=['tutorial_package'],
    package_dir={'': 'src'},
)

setup(**setup_args)
  • 记住: setup.py是catkin使用的,而不是用户调用。catkin将确保setup.py文件安装到正确的位置。如果你手动调用setup.py,你可能会破坏你的ROS安装。
  • 第一行,使用distutils (不推荐setuptools,因为它会在src生成文件)
  • 使用generate_distutils_setup函数读取package.xml文件的值,同时也执行一些转换,例如漂亮地列出作者和维护者。
  • 所有我们需要的不在package.xml的信息,如:
    • 想要安装的脚本名称
    • python包的名称
    • 那里可以找到这些包
    • python包的依赖
  • 相比那些在package.xml使用的,以上的会有不同的名称,需要单独列出。
  • 为了catkin能使用到setup.py, 需要去掉在CMakeLists.txt文件注释:
## Uncomment if the package has a setup.py
catkin_python_setup()
  • 最后,如果用户安装你的包,你需要修改CMakeLists.txt这一行:
catkin_install_python(PROGRAMS bin/hello
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
  • 编译包
$ cd ~/catkin_ws
$ catkin_make
  • 让环境包含新的devel空间
$ . devel/setup.bash
  • 现在你的脚本和模块可通过rosrun来运行,其他用户安装你的包,也同样有效。
$ rosrun my_pkg hello 
Hello my friend!

在beginner_tutorials包里测试

  1. 在beginner_tutorials包,新建bin,src,src/tutorial_package目录,新建init.py
$ roscd beginner_tutorials
$ mkdir bin
$ mkdir src
$ mkdir src/tutorial_package
$ touch src/tutorial_package/__init__.py
$ chmod +x src/tutorial_package/__init__.py
  1. 和src/tutorial_package/hello.py文件
$ touch src/tutorial_package/hello.py
$ chmod +x src/tutorial_package/hello.py
  1. 手工输入如下代码:
def say(name):
    print('Hello' + name)
  1. 创建bin/hello文件
$ roscd beginner_tutorials/bin
$ touch hello
$ chmod +x hello
$ rosed beginner_tutorials hello
  1. 手工输入代码:
#! /usr/bin/env python

import tutorial_package.hello

if __name__ == '__main__':
    tutorial_package.hello.say('my friend!')
  1. 在beginner_tutorials目录下,新建setup.py
$ roscd beginner_tutorials
$ touch setup.py
$ chmod +x setup.py
$ rosed beginner_tutorials setup.py
  1. 手工输入代码:
## ! DO NOT MANUALLY INVOKE THIS setup.py, USE CATKIN INSTEAD

from distutils.core import setup
from catkin_pkg.python_setup import generate_distutils_setup

# fetch values from package.xml
setup_args = generate_distutils_setup(
    packages=['tutorial_package'],
    package_dir={'': 'src'},
)

setup(**setup_args)
  1. 在CMakeLists.txt文件找到下面行,并去掉注释。让catkin使用setup.py
## Uncomment if the package has a setup.py
catkin_python_setup()
  1. 在CMakeLists.txt文件找到下面行,并去掉注释。让用户安装到正确目录:
catkin_install_python(PROGRAMS bin/hello
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
  1. 编译代码
$ cd ~/catkin_ws
$ catkin_make
  1. 让环境识别
$ . devel/setup.bash
  1. 测试调用
$ rosrun beginner_tutorials hello 
Hello my friend!

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros与python入门教程