[ROS] 创建并启动功能包 & 收发topic例程

[ROS] 创建并启动功能包 & 收发topic例程

ROS 版本:melodic

1. 创建工作环境 ws

(如果已经有工作环境可忽略)

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make

2. 在 ws 中创建 package

catkin_create_pkg 只是创建了包目录和默认的配置版本,没有做啥其他神奇的事情。

cd ~/catkin_ws/src
catkin_create_pkg testpkg roscpp std_msgs # 功能包依赖项为cpp stdmsg
cd ..
catkin_make

3. 在 package 中创建节点

3.1 创建发布节点 publisher

topic 发布语法

ros::Publisher pub = node_handle.advertise<message_type>(topic_name, queue_size);
  • node_handle:ros::NodeHandle 类的一个对象
  • message_type: 模板参数,表示我们要发布的数据的类型
  • topic_name: 一个字符串,话题的名称;该名称将会在 rostopic list 或者 rqt_graph中展示
  • queue_size: 一个整数,表示发布者消息序列的大小,它是一个队列

如果你想发布多个话题,需要创建多个 ros::Publisher 对象。

如何控制消息发布的频率

可能很多人会想到使用简单的固定延时,如sleep、usleep,但是如果程序运行中有一些延时产生,那么频率可能就发生波动。而使用 rate::sleep() 方法,ROS 将会自动计算延时,并在等待时长中减除。

使用方法如下:

ros::Rate rate(10); // 10 means 10hz

while(1)
{
    .....
    rate.sleep();
    .....
}

示例代码

mkdir -p ~/catkin_ws/src/testpkg/src
cd ~/catkin_ws/src/testpkg/src
vim publisher.cpp
#include "ros/ros.h" 
#include "std_msgs/String.h"
#include <sstream>

int main(int argc, char **argv)
{
    ros::init(argc, argv, "publisher"); //节点名称要保持唯一性
    ros::NodeHandle n; 

    //发布一个消息类型为std_msgs/String,命名为chatter的话题
    //定义消息队列大小为1000,即超过1000条消息之后,旧的消息就会丢弃
    ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000); 
    
    //指定发布消息的频率10Hz
    ros::Rate loop_rate(10);

    //通过 Rate::sleep()来处理睡眠的时间来控制对应的发布频率。
    int count = 0;
    while (ros::ok())
    {
        std_msgs::String msg;
        std::stringstream ss;
        ss << "hello world " << count;
        msg.data = ss.str();
         
        ROS_INFO("PubMsg >> %s", msg.data.c_str());
        chatter_pub.publish(msg);
    
        //确保消息发出去,非阻塞
        ros::spinOnce();

        //根据之前ros::Rate loop_rate(10)的定义来控制发布话题的频率。定义10即为每秒10次,100毫秒
        loop_rate.sleep();
        count++;
    }
    return 0;
}

3.2 创建监听节点 listerner

topic 监听语法

ros::Subscriber sub = node_handle.subscribe(topic_name, queue_size, pointer_to_callback_function);
  • topic_name:同上
  • queue_size:一个整数,表示接收消息的队列大小,当新消息到达时,保存到队列中,直到ROS有空闲时,从队列取出消息并执行相应的回调函数。
  • pointer_to_callback_function:一个函数指针,指向消息回调函数

示例代码

~/catkin_ws/src/testpkg/src
vim listener.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"

void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
    ROS_INFO("SubMsg << %s", msg->data.c_str());
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "listener");
    ros::NodeHandle n;


    ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);

    //调用此函数将不返回,直到 ros::ok()返回false。
    //接收到消息不会马上被调用回调函数,而是要等到 spin 或者 spinOnce 执行才被调用。
    ros::spin();
    return 0;
}

4. 修改 CMakeList.txt

添加依赖库

依赖其他库可以添加到 COMPONENTS 关键字后边

find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
  message_generation
)
generate_messages(
  DEPENDENCIES
  std_msgs
)
catkin_package(
  CATKIN_DEPENDS roscpp std_msgs message_runtime
)

声明可执行文件

涉及几个关键词

  • add_executable :声明可执行文件的文件名

  • target_link_libraries:告诉 Cmake 当链接此可执行文件时需要链接那些库(当然这些库需要在上边的 find_package 中添加)

  • add_dependencies

include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)

add_executable(
  publisher 
  src/publisher.cpp
)
target_link_libraries(
  publisher
  ${catkin_LIBRARIES}
)
add_dependencies(
  publisher
  testpkg_generate_messages_cpp
)

add_executable(
  listener
  src/listener.cpp
)
target_link_libraries(
  listener
  ${catkin_LIBRARIES}
)
add_dependencies(
  listener
  testpkg_generate_messages_cpp
)

5. 修改package.xml

package.xml 是包的清单文件

  • <build_depend>:编译依赖

  • <exec_depend>:运行依赖

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

6. 编译

cd ~/catkin_ws/
catkin_make

如果成功你将看到

#### Running command: "make cmake_check_build_system" in "/home/dev/catkin_ws/build"
####
####
#### Running command: "make -j4 -l4" in "/home/dev/catkin_ws/build"
####
[  0%] Built target std_msgs_generate_messages_nodejs
[  0%] Built target std_msgs_generate_messages_py
[  0%] Built target std_msgs_generate_messages_cpp
[  0%] Built target std_msgs_generate_messages_lisp
[  0%] Built target testpkg_generate_messages_py
[  0%] Built target std_msgs_generate_messages_eus
[  0%] Built target testpkg_generate_messages_lisp
[  0%] Built target testpkg_generate_messages_cpp
[ 20%] Built target testpkg_generate_messages_eus
[ 20%] Built target testpkg_generate_messages_nodejs
Scanning dependencies of target listener
[ 40%] Building CXX object testpkg/CMakeFiles/listener.dir/src/listener.cpp.o
[ 40%] Built target testpkg_generate_messages
[ 80%] Built target publisher
[100%] Linking CXX executable /home/dev/catkin_ws/devel/lib/testpkg/listener
[100%] Built target listener

7. 运行节点

Terminal 1

启动你的 ROS

$ roscore

Terminal 2

启动监听节点

$ source ~/catkin_ws/devel/setup.bash
$ rosrun testpkg listener

setup.bash 脚本由工作区生成,用于设置若干环境变量,使 ROS 能够找到你创建的功能包和可执行文件

Terminal 3

启动发布节点

$ source ~/catkin_ws/devel/setup.bash
$ rosrun testpkg publisher

8. 成功

Image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容