ROS1教程 4:Hello World例程
前面我们讲解了ROS1
的编译系统和文件系统,接下来这一节我们将介绍如何实现ROS1
中的Hello World
例程
1. 前言
ROS1
中涉及的编程语言以C++
和Python
为主,ROS1
中的大多数程序两者都可以实现,在本系列教程中,每一个案例也都会分别使用C++
和Python
两种语言分别实现演示,读者可以根据自身情况选择合适的实现方案。
ROS1
中的程序即便使用不同的编程语言,实现流程也大致类似,以当前HelloWorld
程序为例,实现流程大致如下:
- 先创建一个工作空间;
- 再创建一个功能包;
- 写代码;
- 编译并执行。
上述流程中,C++
和Python
只是在步骤3和步骤4的实现细节上存在差异,其他流程基本一致。
注意:虽然说在ROS1
中,实现同一功能时,C++
和Python
都能实现,但是具体选择哪种语言,需要视需求而定,因为两种语言相较而言,C++
运行效率高但是编码效率低,而Python
则反之,基于二者互补的特点,ROS1
设计者分别设计了roscpp
与rospy
库,前者旨在成为ROS1
的高性能库,而后者则一般用于对性能无要求的场景,旨在提高开发效率。
2. 创建工作空间
我们首先创建一个名为jack_ws
的工作空间
mkdir -p 自定义空间名称/src
cd 自定义空间名称
catkin_make
上述命令,首先会创建一个工作空间以及一个src
子目录,然后再进入工作空间调用catkin_make
命令编译。在我这里工作空间名就是jack_ws
3. 创建功能包
接下来我们进入src
目录创建ROS1
功能包
cd src
catkin_create_pkg 自定义ROS1包名 依赖的ROS1功能包1 依赖的ROS1功能包2 依赖的功能包3
上述命令,会在工作空间下生成一个依赖了三个功能包的功能包,例如
catkin_create_pkg hello_world roscpp rospy std_msgs
创建出的HelloWorld
功能包依赖于 roscpp
、rospy
与 std_msgs
,其中roscpp
是使用C++
实现的ROS1
基础功能库,而rospy
则是使用python
实现的ROS1
基础功能库,std_msgs
是标准消息库,创建ROS1
功能包时,一般都会依赖这三个库实现。
4. 编写C++代码
上面创建工作空间和功能包都是准备阶段,接下来写代码才是核心。写代码的步骤Python又和C++有些不懂,因此我们下面分开讲
4.1 编辑C++源文件
cd 自定义的包
touch src/源文件名.cpp
然后接下来输入下面的测试代码
#include "ROS1/ROS1.h"
int main(int argc, char *argv[]){
// 初始化ROS1节点
ROS1::init(argc, argv, "hello");
// 创建节点句柄,非必要
ROS1::NodeHandle n;
// 命令行输出hello world
ROS_INFO("Hello World\n");
return 0;
}
4.2 配置功能包下的CMakeLists.txt
因为C++
的程序是需要编译的,因此需要需要编辑功能包的CMakeLists.txt
。而编译的时候,主要就是添加需要当前编译的C++
源代码
在工作目录/src/功能包名/CMakeLists.txt
中添加下述内容
add_executable(源文件名
src/源文件名.cpp
)
target_link_libraries(源文件名
${catkin_LIBRARIES}
)
4.3 编译C++代码
编译工作空间下的所有功能包
cd 自定义空间名称
catkin_make
而后会在工作空间根目录下创建devel
和build
两个目录
在编译之后,devel
目录下存放着当前功能包的所有可执行文件
4.4 运行C++程序
我们上面编译之后,就可以开始运行了
先启动命令行1:
roscore
再启动命令行2:
cd 工作空间
source ./devel/setup.bash # 如果你是Bash
source ./devel/setup.zsh # 如果你是Zsh
rosrun 包名 C++节点
注意,新编译的包在第一次rosrun
中可能没有补全,这个时候我们可以运行一下rospack
命令,来生成所有功能包的profile
,即运行:
rospack profile
此后就有补全了
5. 编写Python代码
5.1 编写Python源代码
cd ROS1包
mkdir scripts
新建Python
文件,文件名自定义
"""
Python 版 HelloWorld
"""
import rospy
if __name__ == "__main__":
rospy.init_node("Hello")
rospy.loginfo("Hello World!")
5.2 添加可执行权限
因为Python
代码不需要编译,直接用Python解释器运行即可,但在此之前需要为其添加可执行权限
chmod +x 自定义文件名.py
5.3 配置功能包下的CMakeLists.txt
虽然说Python
的程序不需要编译,但Python
程序依旧是需要安装的,因此需要需要编辑功能包的CMakeLists.txt
。而编译的时候,主要就是添加当前的Python
程序的安装位置
在工作目录/src/功能包名/CMakeLists.txt
中添加下述内容
catkin_install_python(PROGRAMS scripts/自定义文件名.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
5.4 安装Python代码
Python
代码不需要编译,安装即可。不过因为catkin
已经统一了安装和编译,因此依旧是运行
cd 自定义空间名称
catkin_make
同样,在安装之后,devel
目录下存放着当前功能包的所有可执行文件中就多了当前的Python
文件
5.5 运行Python程序
先启动命令行1:
roscore
再启动命令行2:
cd 工作空间
source ./devel/setup.bash
rosrun 包名 自定义文件名.py
输出结果:Hello World!