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包里测试
- 在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
- 和src/tutorial_package/hello.py文件
$ touch src/tutorial_package/hello.py
$ chmod +x src/tutorial_package/hello.py
- 手工输入如下代码:
def say(name):
print('Hello' + name)
- 创建bin/hello文件
$ roscd beginner_tutorials/bin
$ touch hello
$ chmod +x hello
$ rosed beginner_tutorials hello
- 手工输入代码:
#! /usr/bin/env python
import tutorial_package.hello
if __name__ == '__main__':
tutorial_package.hello.say('my friend!')
- 在beginner_tutorials目录下,新建setup.py
$ roscd beginner_tutorials
$ touch setup.py
$ chmod +x setup.py
$ rosed beginner_tutorials 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)
- 在CMakeLists.txt文件找到下面行,并去掉注释。让catkin使用setup.py
## 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/setup.bash
- 测试调用
$ rosrun beginner_tutorials hello
Hello my friend!
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号