
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!
