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

执行命令: 

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

效果:

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

tail ~/.bashrc 

编译工程:执行命令

cd ~/catkin_ws/
catkin_make

 

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

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

然后编译包

 cd ~/catkin_ws/
catkin_make

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

roscd helloworld/

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

apt install vim 

然后进入src目录

vim helloworld.cpp

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

#include <ros/ros.h>
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/ros.h>

    在代码的开头,我们包含了 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  就是保存退出的意思  

 我们就有文件了

然后再进入

 添加如下内容:

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 回车就可以了

 按以下图写代码

 效果:

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

必须先运行这个

roscore
rosrun helloworld helloworld

 

拍照快照

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值