万物始于Hello World,为了体验ROS,使用Hello World介绍ROS的简单使用。
一、Hello World工程简介
首先需要创建工程,流程为:
- 创建工作空间目录(即工程根目录,注意此时还不是ROS工作空间,只是一个目录)
- 初始化工作空间(即把当前目录初始化为一个ROS工作空间)
- 创建功能包(ROS基本单元,可以理解为一个功能模块,每个工程至少有一个功能包)
- 编辑源文件(写代码实现需求)
- 编辑编译配置文件(ROS1使用CMake编译系统,这里编辑CMakeList.txt文件)
- 编译工程(使用CMake编译ROS工程,生成可执行文件,即ros节点,下文均称作节点)
不只是Hello World,所有ROS工程都是这样的流程。
另外,目前ROS开发主要使用C++和Python语言,这里会分别实现。
1.2 ROS Hello World C++ 版
注:其中ros_learning
是工作空间的自定义名称。
1.2.1 创建工作空间目录
# 递归创建工作空间目录
mkdir -p ros_learning/src
1.2.2 初始化工作空间
这一步有两种方法都可以达到初始化工作空间的目的:
方法一:
# 1.进入src目录
cd ros_learning/src
# 2.初始化工作空间
catkin_init_workspace
方法二:
# 1.进入ros_learning目录
cd ros_learning/src
# 2.编译工作空间
catkin_make
1.2.3 创建功能包
cd ros_learning/src
catkin_create_pkg hello_world std_msgs rospy roscpp
其中,hello_world:自定义功能包名称,
std_msgs rospy roscpp:功能包依赖,roscpp是C++实现的库,而rospy是python实现的库,std_msgs是ROS标准消息库
1.2.4 编辑源文件
在ros_learning/src/hello_world/src
目录下新增hello_world.cpp
文件,文件内容如下:
#include "ros/ros.h"
int main(int argc, char **argv)
{
// 初始化ros节点,"hello_world_cpp"为自定义节点名称
ros::init(argc, argv, "hello_world_cpp");
// 在控制台打印 hello world
ROS_INFO("Hello World!");
return 0;
}
1.2.5 编辑编译配置文件CMakeList.txt
由于新增了源文件hello_world.cpp
,所以要配置该文件的编译规则。
找到ros_learning/src/hello_world/CMakeLists.txt
中的Build
,如下:
修改其中的add_executable
和target_link_libraries
两项,如下:
修改说明如下:
add_executable(${PROJECT_NAME}_node src/hello_world.cpp)
# 生成可执行文件,其中 ${PROJECT_NAME}_node 代表节点的名称(也可以自定义,比如hello_world)
# src/hello_world.cpp 是源文件,也可以有多个。
target_link_libraries(${PROJECT_NAME}_node
${catkin_LIBRARIES}
)
# 链接库文件,因为我们使用了ros的 ros::init 和 ROS_INFO,所以需要链接相应的库才可以编译成功。
# ${PROJECT_NAME}_node 代表要执行链接库的节点名称
# ${catkin_LIBRARIES} 搜索库的路径
1.2.6 编译工程
进入到ros_learning目录,编译该工程
cd ros_learning
catkin_make
编译成功后,会在ros_learning目录下生成build 和devel。
1.2.7 运行节点
生成的节点在 devel/lib/hello_world
中,我们可以直接执行:
不过这样需要知道节点的具体路径,实际中操作较麻烦。
ROS提供了 rosrun
命令,可以根据包名和节点名,在任何目录执行。
但需要具备以下两个条件:
- 启动 roscore
- 进入到工作空间目录中,执行 source ./devel/setup.bash(为了让系统找到节点)
但 source ./devel/setup.bash
只对当前终端有效,新打开终端仍需再执行该命令,为了避免每次执行,可以把该命令加到当前用户的 .bashrc
文件中,该文件在用户的 home
目录下。
方法一:直接打开 ~/.bashrc
文件,在末尾添加 source 你的工作空间目录/devel/setup.bash
,保存。
方法二:使用命令 echo "source 你的工作空间目录/devel/setup.bash" >> ~/.bashrc
最后,使用命令 source ~/.bashrc
使修改生效。
1.3 ROS Hello World Python 版
1到3步骤上面已经做过,这里直接编辑源文件。
1.3.1 编辑源文件
进入到 ros_learning/src/hello_world
目录,新建 scripts
目录,在该目录中新增 hello_world.py
,内容如下:
#! /usr/bin python
import rospy
if __name__ == "__main__":
# 初始化ros节点,"hello_world_py"为自定义节点名称
rospy.init_node("hello_world_py")
# 在控制台打印 Hello World!
rospy.loginfo("Hello World!")
1.3.2 编辑编译配置文件CMakeList.txt
找到ros_learning/src/hello_world/CMakeLists.txt
中的Install
,修改catkin_install_python
如下:
修改说明:
catkin_install_python(PROGRAMS
scripts/hello_world.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
# 将脚本scripts/hello_world.py安装到指定位置
# PROGRAMS 关键字指定脚本程序
# DESTINATION 关键字指定安装位置
# ${CATKIN_PACKAGE_BIN_DESTINATION} 系统环境变量,存储当前功能包可执行文件安装路径
1.3.3 编译工程
进入到ros_learning目录,编译该工程
cd ros_learning
catkin_make
编译成功后,会在ros_learning目录下生成build 和devel。
1.3.4 运行节点
生成的脚本在 devel/lib/hello_world
中,同样可以直接运行,也可以使用 rosrun
命令。
这里注意,无论直接运行还是使用rosrun
命令,都需要先启动roscore
。