ROS1教程 4:Hello World例程


ROS1的Hello World例程

ROS1教程 4:Hello World例程

前面我们讲解了ROS1的编译系统和文件系统,接下来这一节我们将介绍如何实现ROS1中的Hello World例程

ROS1的文件系统

1. 前言

ROS1中涉及的编程语言以C++Python为主,ROS1中的大多数程序两者都可以实现,在本系列教程中,每一个案例也都会分别使用C++Python两种语言分别实现演示,读者可以根据自身情况选择合适的实现方案。

ROS1中的程序即便使用不同的编程语言,实现流程也大致类似,以当前HelloWorld程序为例,实现流程大致如下:

  1. 先创建一个工作空间;
  2. 再创建一个功能包;
  3. 写代码;
  4. 编译并执行。

上述流程中,C++Python只是在步骤3和步骤4的实现细节上存在差异,其他流程基本一致。

注意:虽然说在ROS1中,实现同一功能时,C++Python都能实现,但是具体选择哪种语言,需要视需求而定,因为两种语言相较而言,C++运行效率高但是编码效率低,而Python则反之,基于二者互补的特点,ROS1设计者分别设计了roscpprospy库,前者旨在成为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功能包依赖于 roscpprospystd_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}
)

配置CMakeLists.txt-C++

4.3 编译C++代码

编译工作空间下的所有功能包

cd 自定义空间名称
catkin_make

而后会在工作空间根目录下创建develbuild两个目录

编译C++代码

在编译之后,devel目录下存放着当前功能包的所有可执行文件

C++可执行文件

4.4 运行C++程序

我们上面编译之后,就可以开始运行了

先启动命令行1:

roscore

再启动命令行2:

cd 工作空间
source ./devel/setup.bash                # 如果你是Bash
source ./devel/setup.zsh                # 如果你是Zsh
rosrun 包名 C++节点

注意,新编译的包在第一次rosrun中可能没有补全,这个时候我们可以运行一下rospack命令,来生成所有功能包的profile,即运行:

rospack profile

此后就有补全了

运行C++程序

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!")

编写Python源代码

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}
)

配置CMakeLists.txt-Python

5.4 安装Python代码

Python代码不需要编译,安装即可。不过因为catkin已经统一了安装和编译,因此依旧是运行

cd 自定义空间名称
catkin_make

安装Python代码

同样,在安装之后,devel目录下存放着当前功能包的所有可执行文件中就多了当前的Python文件

Python可执行文件

5.5 运行Python程序

先启动命令行1:

roscore

再启动命令行2:

cd 工作空间
source ./devel/setup.bash
rosrun 包名 自定义文件名.py

输出结果:Hello World!

运行Python程序


文章作者: Jack Wang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jack Wang !
  目录