ROS 工作空间与功能包的创建(三)

执行命令: 

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src/
catkin_init_workspace 
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc 

效果:

ROS 工作空间与功能包的创建(三)_第1张图片

 输入命令查看添加成功了没有

tail ~/.bashrc 

ROS 工作空间与功能包的创建(三)_第2张图片

编译工程:执行命令

cd ~/catkin_ws/
catkin_make

ROS 工作空间与功能包的创建(三)_第3张图片

 ROS 工作空间与功能包的创建(三)_第4张图片

好了,现在开始建立工程包

cd ~/catkin_ws/src/
catkin_create_pkg helloworld std_msgs rospy roscpp

然后编译包

 cd ~/catkin_ws/
catkin_make

ROS 工作空间与功能包的创建(三)_第5张图片

 执行:可以按Tab 键来补全。

roscd helloworld/

ROS 工作空间与功能包的创建(三)_第6张图片

 我们安装一个vim的工具来编写文件 ,后面输入Y

apt install vim 

然后进入src目录

vim helloworld.cpp

ROS 工作空间与功能包的创建(三)_第7张图片

复制代码 然后 shift+insert 粘贴进去

#include 
int main(int argc,char **argv){
    ros::init(argc,argv,"hello_node");
    ros::NodeHandle nh;
    ROS_INFO_STREAM("hello world!!!");
    ros::spinOnce();
}

代码解释:

这是一个 ROS 节点的 C++ 代码,用于在 ROS 中输出 "hello world!!!" 消息。以下是代码的详细说明:

  1. #include

    在代码的开头,我们包含了 ROS C++ 客户端库的头文件 ros/ros.h。这个头文件包含了一些 ROS 节点开发所需的基本函数和类。

  2. int main(int argc,char **argv){}

    这是 C++ 程序的主函数。在 ROS 中,每个节点都必须包含一个 main 函数,用于初始化 ROS 节点并执行节点的主要逻辑。

    ``argcargv 参数是传递给节点的命令行参数。在 ROS 中,argc 参数表示命令行参数的数量,argv` 参数是一个字符串数组,包含所有命令行参数的值。

  3. ros::init(argc,argv,"hello_node");

    ``ros::init函数用于初始化 ROS 节点。在此示例中,我们将argcargv参数传递给ros::init` 函数,以便 ROS 节点可以解析命令行参数并进行必要的初始化。另外,我们将节点的名称设置为 "hello_node"。

  4. ros::NodeHandle nh;

    ``ros::NodeHandle类用于创建一个节点句柄,以便节点可以与 ROS 系统进行通信。在此示例中,我们创建了一个名为nh` 的节点句柄,用于向 ROS 发布和接收消息,以及订阅 ROS 主题。

  5. ROS_INFO_STREAM("hello world!!!");

    ``ROS_INFO_STREAM` 函数用于在 ROS 中输出日志消息。在此示例中,我们输出了一个 "hello world!!!" 的消息。这个消息将显示在 ROS 的日志窗口中。

  6. ros::spinOnce();

    ``ros::spinOnce()函数用于让节点处理等待中的回调函数,例如订阅 ROS 主题时的回调函数。在此示例中,我们没有订阅任何主题,因此ros::spinOnce()` 函数没有任何作用。但是,如果节点需要订阅主题或接收服务请求,则需要在主循环中调用此函数来处理回调函数。

综上所述,这个 ROS 节点的主要逻辑是输出一个 "hello world!!!" 的消息。在节点的 main 函数中,我们首先使用 ros::init 函数初始化 ROS 节点,并将节点的名称设置为 "hello_node"。然后,我们创建了一个名为 nh 的节点句柄,以便节点可以与 ROS 系统进行通信。接下来,我们使用 ROS_INFO_STREAM 函数输出一个 "hello world!!!" 的消息。最后,我们调用 ros::spinOnce() 函数,以便节点可以处理等待中的回调函数。

 输入按esc 然后 :wq  就是保存退出的意思  ROS 工作空间与功能包的创建(三)_第8张图片

 我们就有文件了

ROS 工作空间与功能包的创建(三)_第9张图片

然后再进入

ROS 工作空间与功能包的创建(三)_第10张图片

ROS 工作空间与功能包的创建(三)_第11张图片

 添加如下内容:

add_executable(helloworld ./src/helloworld.cpp)
target_link_libraries(helloworld ${catkin_LIBRARIES})

参数解释:两个版本

这两行代码是用于在 CMakeLists.txt 文件中定义 ROS 软件包的可执行文件的,具体含义如下:

  1. add_executable(helloworld ./src/helloworld.cpp)

    ``add_executable函数用于定义可执行文件,并将其与指定的源文件进行链接。在此示例中,我们定义了一个名为helloworld的可执行文件,并将其链接到./src/helloworld.cpp` 源文件。

  2. target_link_libraries(helloworld ${catkin_LIBRARIES})

    ``target_link_libraries函数用于将可执行文件链接到指定的库。在此示例中,我们将helloworld可执行文件链接到catkin_LIBRARIES变量所包含的 ROS 库。这些库包括 ROS C++ 客户端库roscpp` 和其他依赖项。

这两行代码一起定义了一个 ROS 软件包的可执行文件,该可执行文件名为 helloworld,源文件为 ./src/helloworld.cpp,并链接到 ROS C++ 客户端库和其他依赖项。在构建软件包时,CMake 会使用这些定义来编译可执行文件,并将其安装到运行目录中,以便在 ROS 节点中使用。

这两行代码是用于在 ROS 软件包中定义可执行文件的,具体含义如下:

  1. add_executable(helloworld ./src/helloworld.cpp)

    ``add_executable()函数用于定义可执行文件,并将其与指定的源文件进行链接。在此示例中,我们定义了一个名为helloworld的可执行文件,并将其链接到./src/helloworld.cpp` 源文件。

    在 ROS 中,每个节点都是一个可执行文件。因此,在 ROS 软件包中定义一个可执行文件实际上是定义一个 ROS 节点。在此示例中,我们定义了一个名为 helloworld 的节点,用于输出 "Hello, world!" 消息。

  2. target_link_libraries(helloworld ${catkin_LIBRARIES})

    ``target_link_libraries()函数用于将可执行文件链接到指定的库。在此示例中,我们将helloworld可执行文件链接到catkin_LIBRARIES变量所包含的 ROS 库。这些库包括 ROS C++ 客户端库roscpp` 和其他依赖项。

    在 ROS 中,节点需要使用 ROS 的客户端库来与其他节点进行通信。在 C++ 中,我们可以使用 roscpp 库来编写 ROS 节点的客户端代码。因此,将 helloworld 可执行文件链接到 roscpp 库是为了让节点能够使用 roscpp 库中的函数和类来与其他节点进行通信。

    此外,catkin_LIBRARIES 变量包含了其他 ROS 依赖项的库,如消息传输库 roslib。将 helloworld 可执行文件链接到 catkin_LIBRARIES 变量中的库可以确保节点能够使用这些库中的函数和类来实现其功能。

综上所述,将 helloworld 可执行文件链接到 roscpp 和其他 ROS 依赖项的库中是为了让节点能够使用 ROS 客户端库和其他 ROS 依赖项来实现其功能,并与其他节点进行通信。

粘贴后,按esc 然后输入:wq 回车就可以了

ROS 工作空间与功能包的创建(三)_第12张图片

 按以下图写代码ROS 工作空间与功能包的创建(三)_第13张图片

 效果:

ROS 工作空间与功能包的创建(三)_第14张图片

然后启动两个终端,一个运行

必须先运行这个

roscore
rosrun helloworld helloworld

ROS 工作空间与功能包的创建(三)_第15张图片

 ROS 工作空间与功能包的创建(三)_第16张图片

拍照快照

 

ROS 工作空间与功能包的创建(三)_第17张图片

你可能感兴趣的:(linux,运维,服务器)