机器人系统ROS中包内节点启动详解和实战示例
在 ROS 中,rosrunroslaunch下面以一个完整的示例,展示如何在 ROS 包内启动节点,包括rosrun和roslaunch的使用方法。
·
在 ROS 中,节点的启动通常有两种方式:
- 直接通过
rosrun
启动单个节点 - 通过
roslaunch
启动多个节点及其参数
下面以一个完整的示例,展示如何在 ROS 包内启动节点,包括 rosrun
和 roslaunch
的使用方法。
示例背景
假设我们有一个工作包名为 my_cpp_package
,其中包含两个节点:
talker.cpp
(发布者)listener.cpp
(订阅者)
参考前面创建的 ROS 包模板,ROS1/ROS2中工作空间和工作包创建详解
方法 1:使用 rosrun
启动单个节点
# 启动 roscore(必须的)
roscore
新终端:启动 talker
rosrun my_cpp_package talker
再开一个终端:启动 listener
rosrun my_cpp_package listener
方法 2:使用 roslaunch
启动节点(推荐方式)
创建 launch 目录并添加启动文件
cd ~/catkin_ws/src/my_cpp_package
mkdir launch
touch launch/start_nodes.launch
start_nodes.launch
内容如下:
<launch>
<!-- 启动发布者 -->
<node pkg="my_cpp_package" type="talker" name="talker_node" output="screen" />
<!-- 启动订阅者 -->
<node pkg="my_cpp_package" type="listener" name="listener_node" output="screen" />
</launch>
启动方法
cd ~/catkin_ws
catkin_make
source devel/setup.bash
roslaunch my_cpp_package start_nodes.launch
你会看到两个节点都启动了,输出类似:
[INFO] [talker_node]: hello world 1
[INFO] [listener_node]: I heard: [hello world 1]
注意事项
项目 | 说明 |
---|---|
<node pkg=...> |
指定节点所在的包名 |
type="xxx" |
可执行文件名称,位于 devel/lib/your_package/xxx |
name="xxx" |
ROS 中节点的名称,可用于参数命名空间等 |
output="screen" |
输出日志到终端,便于调试 |
完整示例
下面是一个完整的 C++ ROS 工作包模板,包含以下内容:
功能概览
-
包名:
my_cpp_package
-
节点:
talker
: 发布字符串消息并读取参数listener
: 订阅字符串消息
-
启动文件:
start_nodes.launch
:同时启动两个节点并传参
项目结构
my_cpp_package/
├── CMakeLists.txt
├── package.xml
├── launch/
│ └── start_nodes.launch
├── src/
│ ├── talker.cpp
│ └── listener.cpp
CMakeLists.txt
cmake_minimum_required(VERSION 3.0.2)
project(my_cpp_package)
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
)
catkin_package()
include_directories(
${catkin_INCLUDE_DIRS}
)
add_executable(talker src/talker.cpp)
add_executable(listener src/listener.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
target_link_libraries(listener ${catkin_LIBRARIES})
package.xml
<?xml version="1.0"?>
<package format="2">
<name>my_cpp_package</name>
<version>0.0.1</version>
<description>A simple ROS C++ demo package</description>
<maintainer email="your_email@example.com">Your Name</maintainer>
<license>MIT</license>
<buildtool_depend>catkin</buildtool_depend>
<depend>roscpp</depend>
<depend>std_msgs</depend>
</package>
src/talker.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
int main(int argc, char **argv)
{
ros::init(argc, argv, "talker_node");
ros::NodeHandle nh("~"); // 私有命名空间
ros::Publisher pub = nh.advertise<std_msgs::String>("/chatter", 10);
ros::Rate rate(1);
std::string base_msg;
nh.param<std::string>("message", base_msg, "Hello from talker!");
int count = 0;
while (ros::ok())
{
std_msgs::String msg;
msg.data = base_msg + " [" + std::to_string(count++) + "]";
ROS_INFO_STREAM("[talker] Publishing: " << msg.data);
pub.publish(msg);
rate.sleep();
}
return 0;
}
src/listener.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
void callback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO_STREAM("[listener] Heard: " << msg->data);
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "listener_node");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("/chatter", 10, callback);
ros::spin();
return 0;
}
launch/start_nodes.launch
<launch>
<!-- 启动 talker -->
<node pkg="my_cpp_package" type="talker" name="talker_node" output="screen">
<param name="message" value="Custom Hello ROS!" />
</node>
<!-- 启动 listener -->
<node pkg="my_cpp_package" type="listener" name="listener_node" output="screen" />
</launch>
构建与运行步骤
cd ~/catkin_ws/src
git clone <your_repo> my_cpp_package
cd ~/catkin_ws
catkin_make
source devel/setup.bash
roslaunch my_cpp_package start_nodes.launch
输出示例
[talker] Publishing: Custom Hello ROS! [0]
[listener] Heard: Custom Hello ROS! [0]
...

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)