编写 launch 文件

引言

之前的文章 介绍了 launch 文件的基本结构和使用方法。

在这里我们用小海龟 (turtlesim)做一下实例练习。

  • 创建一个控制节点 pubvel,向小海龟发布命令,控制它移动;
  • 再创建一个消息显示节点 subpose,实时地将小海龟的位置和角度显示在屏幕上。
  • 创建一个 launch 文件,启动上述节点,并设置相关参数

本文内容主要来自 《A Gentle Introduction to ROS》.

编写 pubvel 节点和 subpose 节点

在该实例中,ros package 名字为 agitr,里面包含了 CMakeLists.txtpackage.xml 文件,以及 src 文件夹,存放源程序。

这里我们用 C++ 编写这两个节点,源程序分别命名为 pubvel.cppsubpose.cpp。

pubvel 的作用是发送随机的线速度和角速度指令到小海龟,驱动它随机移动。具体程序如下:

#include <ros/ros.h>
#include <geometry_msgs/Twist.h> // For geometry_msgs:: Twist
#include <stdlib.h> // For rand() and RAND_MAX
int main(int argc,char**argv){
   // Initialize the ROS system and become a node .
   ros::init(argc,argv,"publish_velocity");
   ros::NodeHandle nh;

   // Create a publisher obj ect .
   ros::Publisher pub=nh.advertise<geometry_msgs::Twist>("turtle1/cmd_vel",1000);

   // Seed the random number generator .
   srand(time(0));

   // Loop at 2Hz until the node is shut down.
   ros::Rate rate(2);
   while(ros::ok()){
   // Create and fill in the message . The other four fields , which are ignored by turtlesim , default to 0.
   geometry_msgs::Twist msg;
   msg.linear.x = double(rand())/double(RAND_MAX);
   msg.angular.z = 2*double(rand())/double(RAND_MAX) - 1;
   // Publish the message .
   pub.publish(msg);
   // Send a message to rosout with the details .
   ROS_INFO_STREAM("Sending random velocity command:"<<"linear="<<msg.linear.x<<"angular="<<msg.angular.z);

   // Wait until it's time for another iteration .
   rate.sleep();
   }
}

subpose 节点的功能是实时读取 /turtle1/pose 中小海龟的位置和角度信息,并通过ROS_INFO_STREAM 在终端显示出来。具体程序如下:

#include <ros/ros.h>
#include <turtlesim/Pose.h>
#include <iomanip> // for std::setprecision and std::fixed

// A callback function . Executed each time a new pose message arrives .
void poseMessageReceived(const turtlesim::Pose&msg){
  ROS_INFO_STREAM(std::setprecision(2)<<std::fixed<<"position=("<<msg.x<<","<<msg.y<<")"<<"*direction="<<msg.theta);
}

int main(int argc,char**argv){
  // Initialize the ROS system and become a node .
  ros::init(argc,argv,"subscribe_to_pose");
  ros::NodeHandle nh;

  // Create a subscri ber obj ect .
  ros::Subscriber nsub=nh.subscribe("turtle1/pose",1000,&poseMessageReceived);
  // Let ROS take over .
  ros::spin();
}

编写好了 C++ 源文件,接下来需要为编译做些准备工作。

CmakeLists.txt 文件中相应位置做如下修改,即指定生成两个可执行文件:

find_package(catkin REQUIRED COMPONENTS roscpp geometry_msgs)
add_executable( pubvel src/pubvel.cpp )
add_executable( subpose src/subpose.cpp )
target_link_libraries( pubvel ${catkin_LIBRARIES} )
target_link_libraries( subpose ${catkin_LIBRARIES} )

package.xml 的相应位置做如下修改,即设置编译和运行中的 package 依赖:

<build_depend>roscpp</build_depend>
<build_depend>geometry_msgs</build_depend>
<exec_depend>roscpp</exec_depend> 
<exec_depend>geometry_msgs</exec_depend>

之后用 catkin_make 命令编译。

创建 launch 文件

为了同时启动多个 ros 节点,我们可以创建一个 launch 文件。

agitr package 文件夹内创建一个名为 launch 的文件夹,在其中创建名为 example.launch 的 launch 文件,程序如下:

<launch>
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim" respawn="true"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="teleop_key" required="true" launch-prefix="xterm -e"/>
<node pkg="agitr" type="pubvel" name="pubvel" launch-prefix="xterm -e"/>
<node pkg="agitr" type="subpose" name="subpose" launch-prefix="xterm -e" output="screen"/>
</launch>

上边命令的具体含义可以参考之前的文章。

该 launch 文件的目的是启动 turtlesim 仿真平台节点,键盘控制节点,以及我们上边编写的 pubvel 节点和 subpose 节点。

在终端启动 launch 文件的命令如下:

roslaunch agitr example.launch

如果一切顺利,应该可以看到 turtlesim 窗口,同时终端会显示出小海龟的姿态信息,类似下图所示:

2019-03-28 17-53-50屏幕截图.png

Written by SH
Revised by QP

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

推荐阅读更多精彩内容