执行命令:
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!!!" 消息。以下是代码的详细说明:
#include <ros/ros.h>
在代码的开头,我们包含了 ROS C++ 客户端库的头文件
ros/ros.h
。这个头文件包含了一些 ROS 节点开发所需的基本函数和类。
int main(int argc,char **argv){}
这是 C++ 程序的主函数。在 ROS 中,每个节点都必须包含一个
main
函数,用于初始化 ROS 节点并执行节点的主要逻辑。``argc
和
argv参数是传递给节点的命令行参数。在 ROS 中,
argc参数表示命令行参数的数量,
argv` 参数是一个字符串数组,包含所有命令行参数的值。
ros::init(argc,argv,"hello_node");
``ros::init
函数用于初始化 ROS 节点。在此示例中,我们将
argc和
argv参数传递给
ros::init` 函数,以便 ROS 节点可以解析命令行参数并进行必要的初始化。另外,我们将节点的名称设置为 "hello_node"。
ros::NodeHandle nh;
``ros::NodeHandle
类用于创建一个节点句柄,以便节点可以与 ROS 系统进行通信。在此示例中,我们创建了一个名为
nh` 的节点句柄,用于向 ROS 发布和接收消息,以及订阅 ROS 主题。
ROS_INFO_STREAM("hello world!!!");
``ROS_INFO_STREAM` 函数用于在 ROS 中输出日志消息。在此示例中,我们输出了一个 "hello world!!!" 的消息。这个消息将显示在 ROS 的日志窗口中。
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 软件包的可执行文件的,具体含义如下:
add_executable(helloworld ./src/helloworld.cpp)
``add_executable
函数用于定义可执行文件,并将其与指定的源文件进行链接。在此示例中,我们定义了一个名为
helloworld的可执行文件,并将其链接到
./src/helloworld.cpp` 源文件。
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 软件包中定义可执行文件的,具体含义如下:
add_executable(helloworld ./src/helloworld.cpp)
``add_executable()
函数用于定义可执行文件,并将其与指定的源文件进行链接。在此示例中,我们定义了一个名为
helloworld的可执行文件,并将其链接到
./src/helloworld.cpp` 源文件。在 ROS 中,每个节点都是一个可执行文件。因此,在 ROS 软件包中定义一个可执行文件实际上是定义一个 ROS 节点。在此示例中,我们定义了一个名为
helloworld
的节点,用于输出 "Hello, world!" 消息。
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