一、创建一个工作空间
1、创建目录和子目录
#创建工作空间rosdemo的同时创建子目录src用于存放功能包
rostest@ubuntu:~$ mkdir -p rosdemo/src
2、切换到子目录下
rostest@ubuntu:~$ cd rosdemo/src
3、初始化 CMakeLists
rostest@ubuntu:~/ros_demo/src$ catkin_init_workspace
初始化之后工作空间子目录src下自动创建了一个CMakeLists.txt文件
4、编译工作空间
#返回工作空间主目录
rostest@ubuntu:~/ros_demo/src$ cd ../
#编译工作空间
rostest@ubuntu:~/ros_demo$ catkin_make
编译之后主目录下自动生成了build、devel目录及其子文件,其中在devel目录中已经产生了几个setup.*sh形式的环境变量设置脚本。
rostest@ubuntu:~/ros_demo$ ls
build devel src
5、把工作空间在bash中注册使其环境变量生效并查看是否注册成功
#注册bash
rostest@ubuntu:~/ros_demo$ source devel/setup.bash
#验证是否注册成功
rostest@ubuntu:~/ros_demo$ echo $ROS_PACKAGE_PATH
#打印出了当前工作空间的路径,则说明环境变量注册成功
/home/rostest/ros_demo/src:/opt/ros/melodic/share
二、创建ROS功能包
1、进入工作区主目录的src子目录下并创建功能包hellowrod_pak
#进入工作区主目录的src子目录下
rostest@ubuntu:~/ros_demo$ cd src/
#创建功能包
rostest@ubuntu:~/ros_demo/src$ catkin_create_pkg hellowrod_pak roscpp rospy std_msgs
三、编写cpp文件
#进入功能包存放源代码的src目录
rostest@ubuntu:~/ros_demo/src$ cd hellowrod_pak/src
#创建cpp文件
rostest@ubuntu:~/ros_demo/src/hellowrod_pak/src$ touch helloword.cpp
#编写代码
rostest@ubuntu:~/ros_demo/src/hellowrod_pak/src$ vim helloword.cpp
#include <ros/ros.h>
int main(int argc, char **argv)
{
ros::init(argc,argv,"hello");//初始化ROS节点
ros::NodeHandle n;//创建节点句柄
ROS_INFO("Hello ROS!");//打印日志信息
ros::spinOnce();//用于处理节点订阅话题和所有回调函数
}
ros::init(argc,argv,"hello");用于初始化ROS节点,括号中前两个参数是用来完成命名重映射等功能的,第三个参数是Publisher(发布者)节点的名称,该名称在ROS节点中是独一无二的,不允许同时存在两个相同名称的节点。
ros::NodeHandle n 是用于和ROS系统交互的主要机制,创建此对象会使当前程序成为节点管理器的节点。
ROS_INFO("Hello ROS!") 类似于C/C++中的printf/cout函数,用于打印日志信息ros::spinOnce() 用于处理节点订阅话题和所有回调函数,当前发布的节点没有订阅任何消息,spinOnce()函数并不是必须的,但是为了保证功能无误,所以建议所有节点都默认加入该函数。
四、编译功能包和工作空间
1、编译功能包
#返回到功能包中主目录:ros_demo/src/hellowrod_pak
rostest@ubuntu:~/ros_demo/src/hellowrod_pak/src$ cd ../
#编辑CMakeLists.txt文件
rostest@ubuntu:~/ros_demo/src/hellowrod_pak$ vim CMakeLists.txt
cmake_minimum_required(VERSION 3.0.2)
project(hellowrod_pak)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
)
catkin_package()
include_directories(include ${catkin_INCLUDE_DIRS})
add_executable(hello src/helloword.cpp)
target_link_libraries(hello ${catkin_LIBRARIES})
#添加依赖的功能包,其中roscpp提供了ROS的C++客户端,rospy提供了Python客户端,std_msgs包含了常见的数据类型
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
)#编译功能包,用于生成文件
catkin_package()#用于设置头文件的相对路径,该配置项还包含了catkin编译器默认包含的其他头文件路径
include_directories(include ${catkin_INCLUDE_DIRS})#设置需要编译的代码和生成可执行的文件,第一个参数为可执行文件的名称,第二个参数是编译的cpp文件路径
add_executable(hello src/helloword.cpp)#用于设置链接库,第一个参数为链接可执行的文件,后面依次列出需要链接的库
target_link_libraries(hello ${catkin_LIBRARIES})
2、编译工作空间
#返回工作空间主目录
rostest@ubuntu:~/ros_demo/src/hellowrod_pak$ cd ../../
#编译工作空间
rostest@ubuntu:~/ros_demo$ catkin_make
五、执行程序
1、设置环境变量
如果环境变量没设置好,发布节点的时候会报错:[rospack] Error: package 'hellowrod_pak' not found,提示说找不到包,所以设置好之后最好要使用$ROS_PACKAGE_PATH验证以下
#注册bash
rostest@ubuntu:~/ros_demo$ source ~/ros_demo/devel/setup.bash
#验证是否注册成功
rostest@ubuntu:~/ros_demo$ echo $ROS_PACKAGE_PATH
#打印出了当前工作空间的路径,则说明环境变量注册成功
/home/rostest/ros_demo/src:/opt/ros/melodic/share
2、执行程序
#启动节点管理器(ROS Master)
rostest@ubuntu:~$ roscore
#新打开一个窗口,发布节点,其中hellowrod_pak是功能包的名称 ,hello是节点的名称是在helloword.cpp文件中创建的
rostest@ubuntu:~$ rosrun hellowrod_pak hello
[ INFO] [1655038902.167104193]: Hello ROS!