1.rosrun package-name executable-name 比如 rosrun turtlesim turtlesim_node

2.一旦启动roscore后,便可以运行ROS程序了。ROS程序的运行实例被称为节点(node),roscore叫做节点管理器

3.查看节点列表rosnode list

4.需要注意节点名并不一定与对应可执行文件名称相同

5.可以使用 rosrun 命令显式设置节点的名称rosrun package-name executable-name __name:=node-name这种方法将使用 node-name 参数给出的名称覆盖节点的默

认名。

6.查看节点信息rosnode info node-name 终止节点 rosnode kill node-name

7.用 Ctrl-C 命令终止节点。但使用这种方法时可能不会在节点管理器中注销该节点,因此会导致已终止的节点仍然在 rosnode 列表中。这虽然没有什么坏处,但可能会让用户对当前系统的行为感到困扰。此时可以使用下面的命令将节点从列表中删除:rosnode cleanup

8.ROS节点之间进行通信所利用的最重要的机制就是消息传递。在ROS中,消息有组织地存放在话题里。消息传递的理念是:当一个节点想要分享信息时,它就会发布(publish)消息到对应的一个或者多个话题;当一个节点想要接收信息时,它就会订阅(subscribe)它所需要的一个或者多个话题。ROS节点管理器负责确保发布节点和订阅节点能找到对方;而且消息是直接地从发布节点传递到订阅节点,中间并不经过节点管理器转交

9.在 ROS 系统中查看节点之间的发布-订阅关系的最简单方式就是在终端输入如下命令:rqt_graph

10.所有的节点发布都向话题/rosout 发布消息,该话题由同名的/rosout 节点订阅。这个话题的作用是用来生成各个节点的文本日志消息。

11.ROS 节点通常设计成了只管发布它们有用的信息,而不需要担心是否有其他节点来订阅这些消息。这样有助于减少各个节点之间的耦合度。

12.获得话题列表 rostopic list这个列表列举的话题和 rqt_graph 中展示的话题应该是一样的。

13.打印消息内容 rostopic echo topic-name

14.测量发布频率rostopic hz topic-name,带宽rostopic bw topic-name

15.查看话题rostopic info topic-name,可以获得消息类型等信息

16.查看消息类型rosmsg show message-type-name

17.用命令发布消息rostopic pub –r rate-in-hz topic-name message-type message-content,如rostopic pub –r 1 /turtle1/cmd_vel geometry_msgs/Twist ’[2,0,0]’ ’[0,0,0]’

18.问题检查:roswtf

19.创建工作区caktin_ws并创建src子目录用于存放功能包代码,mkdir -p ~/catkin_ws/src

20.src目录下创建功能包catkin_create_pkg package-name,会产生两个文件package.xml和CMakeLists.txt

21.头文件 ros/ros.h 包含了标准 ROS 类的声明,你将会在每一个你写的 ROS 程序中包含它。下面是一个ros helloworld程序

// This is a ROS version of the standard "hello , world"
// program.
// This header defines the standard ROS classes .
#include <ros / ros.h>
int main ( int argc , char ** argv ) {
// Initialize the ROS system .
ros::init ( argc , argv , " hello _ros " ) ;
// Establ ish this program as a ROS node .
ros::NodeHandle nh ;
// Send some output as a log message .
ROS_INFO_STREAM( " Hello , ␣ ROS! " ) ;
}

22.编译hello程序

(1)声明依赖库

在CmakeList.txt中修改 find_package(catkin REQUIRED COMPONENTS package-names)

在package.xml中修改<build_depend>package-name</build_depend>,<run_depend>package-name</run_depend>例如这里的package-name应该是roscpp

(2)声明可执行文件

在CmakeList.txt中add_executable(executable-name source-files),target_link_libraries(executable-name ${catkin_LIBRARIES})

(3)编译工作区catkin_make

(4)Sourcing setup.bash source devel/setup.bash

23.执行hello程序,rosrun 包名 可执行文件名


编写一个发布者程序

#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 untilit's time for another iteration .
rate.sleep();
}
}

上面程序用来给turtlesim仿真器中的海龟发布随机生成的指令,在添加完依赖后,执行结果如下图


编写一个订阅者程序

我们继续使用 turtlesim 作为测试平台,订阅 turtlesim_node发布的/turtle1/pose 话题。这一话题的消息描述了海龟的位姿(位置和朝向)。

这里有三点需要注意:

1)编写回调函数

发布和订阅消息的一个重要的区别是订阅者节点无法知道消息什么时候到达。为了应对这一事实,我们必须把响应收到消息事件的代码放到回调函数里,ROS 每接收到一个新的消息将调用一次这个函数。订阅者的回调函数类似于:

void function_name(const package_name::type_name &msg)
{
}

其中参数 package_name 和 type_name 和发布消息时的相同,它们指明了我们想订阅的话题的消息类。回调函数的主体有权限访问接收到消息的所有域,并以它认为合适的方式存储、使用或丢弃接收到的数据。与往常一样,我们必须包含定义该类的头文件。

2)创建订阅者对象

为了订阅一个话题,我们需要创建一个ros::Subscriber对象 :

ros::Subscriber sub = node_handle.subscribe(topic_name,queue_size, pointer_to_callback_function);

这个构造函数有三个形参,其中大部分与 ros::Publisher 声明中的类似,最后一个参数是回调函数的指针

3)给ROS控制权

最后的复杂之处在于只有当我们明确给ROS许可时,它才会执行我们的回调函数 。实际上有两个略微不同的方式来做到这一点,其中一个版本如下所示:

ros::spinOnce();

这个代码要求 ROS 去执行所有挂起的回调函数,然后将控制权限返回给我们。另一个方法如下所示:

ros::spin();

这个方法要求 ROS 等待并且执行回调函数,直到这个节点关机。换句话说,ros::spin()大体等于这样一个循环:

while(ros::ok( ))
{
ros::spinOnce();
}

使用 ros::spinOnce()还是使用 ros::spin()的建议如下:你的程序除了响应回调函数,还有其他重复性工作要做吗?如果答案是“否”,那么使用 ros::spin();否则,合理的选择是写一个循环,做其他需要做的事情,并且周期性地调用 ros::spinOnce()来处理回调。

订阅者代码

// This program subscribes to turtle1/pose and shows its
// messages on the screen .
#include <ros/ros.h>
#include <std_msgs/String.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 sub = nh.subscribe("turtle1/pose", 1000, &poseMessageReceived);
// Let ROS take over.
ros::spin();
}

注意在CmakeList.txt添加turtlesim依赖后还会出现找不到turtlesim/Pose.h的情况,这时看看CmakeList中build中的include_directories块有没有被注释掉,如果注释掉就要打开

试验结果:



左边是订阅者收到的消息,右边是随机发送的指令

24.通过 rosparam get /run_id 查看 run_id通过runid来查看日志消息

25.清除日志rosclean check ,rosclean purge

26.roslanch启动多个节点的。其基本思想是在一个XML格式的文件内将需要同时启动的一组节点罗列出来


一个launch文件例子

<launch>
<node name="turtlesim_node" pkg="turtlesim" type="turtlesim_node" ns="sim1" respawn="true" />
<node pkg="learn_ros" type="sub" name="sub_pose" output="screen" />
<node pkg="learn_ros" type="pub" required="true" launch-prefix="xterm -e" ns="sim1" name="pub"/> <node name="turtlesim_node" pkg="turtlesim" type="turtlesim_node" ns="sim2" respawn="true" />
<node pkg="turtlesim" type="turtle_teleop_key" required="true" launch-prefix="xterm -e" ns="sim2" name="pub2"/> </launch>

说明:respawn参数为真代表如果节点崩了过一会会自动重启节点  

output="screen"将结果输出到屏幕

type的参数是可执行的文件名

pkg的参数是功能包名

required为真代表如果这个节点崩了,那么整个launch结束

launch-prefix="xterm -e"表示新开个终端显示数据

ns是命名空间,用于分开控制两只乌龟

上面launch执行后的结果如下:

launch中的重映射

重映射是基于替换的思想:每个重映射包含一个原始名称和一个新名称。每当节点使用重映射中的原始名称时,ROS客户端库就会将它默默地替换成其对应的新名称。

<remap from="turtle1 /cmd_vel" to="turtle1 /cmd_vel_reversed" />

这样原来订阅turtle1 /cmd_vel的节点就会订阅turtle1 /cmd_vel_reversed的消息了

下面是一个包含其他launch文件的示例

<launch>
<include file ="$(find learn_ros)/doublesim.launch" />
<arg name="use_sim3" default="0" /> <group ns="sim3" if="$(arg use_sim3)" >
<node name="turtlesim_node" pkg="turtlesim " type="turtlesim_node" />
<node pkg="turtlesim " type="turtle_teleop_key" name="teleop_key" required="true " launch-prefix="xterm -e"/>
</group> </launch>

其中use_sim3是参数,可以通过roslaunch learn_ros example.launch use_sim3:=1 来赋值

group可以将一些节点分组到同一个命名空间 sim3

用来查找learn_ros功能包中的doublesim文件,并添加进来

ros使用时的注意事项&技巧的更多相关文章

  1. ros使用时的注意事项&技巧2

    1.查看参数列表 rosparam list 2.查询参数rosparam get parameter_name,如rosparam get /rosdistro 3.设置参数rosparam set ...

  2. free函数使用时的注意事项。

    free函数是我们在写C语言程序时常用的函数,但是使用时需要注意,一不小心很肯能会引起吐核. 注意:free函数与malloc()函数配对使用,malloc函数释放申请的动态内存.对于free(p)这 ...

  3. time.h文件中包含的几个函数使用时须注意事项

    time.h头文件中包含以下函数 char* asctime(const struct tm *tm); char* asctime_r(const struct tm *tm,char *buf); ...

  4. Python中 "+=" 使用时的注意事项

    代码1: >>> l1=range(3) >>> l2=l1 >>> l2+=[4] >>> l1 [0, 1, 2, 4] & ...

  5. C# 非托管内存使用时的注意事项

    调用Marshal.AllocHGlobal必须调用 Marshal.FreeHGlobal(ptr)来手动释放内存,即使调用GC.Collect();方法也无法释放,导致内存泄露!!

  6. 解决Bootstrap 附加导航(Affix)的问题和使用时若干注意事项

    1.要清楚Affix分别赋予的class, 开始:affix-top 达到top参数:affix 达到bottom参数:affix-bottom 2.一定要自定义这些class,否则 插件会默认给你在 ...

  7. %f使用时的注意事项

    1不是所有定义都用int,使用浮点函数需要把int改成float才能正常工作 2保留一位小数时要打入%0.1f,保留两位小数时要打入%0.2f,而不是%0.01f

  8. webbrowser控件使用时的注意事项

    如果HtmlElement内的没有信息,则HtmlElement的OuterText属性值为null:OuterHtml属性值则为相应的html值 如果使用OuterText属性,使用前要判断下.

  9. MySQL数据库使用时注意事项

    MySQL数据库使用时注意事项 建表的角度上 1.合理安排表关系 2.尽量把固定长度的字段放在前面 3.尽量使用char 代替varchar 4.分表:水平分和垂直分 在使用sql语句的时候 1.尽量 ...

随机推荐

  1. EJB的优点有哪些?(选择2项)

    EJB的优点有哪些?(选择2项) A.技术领先 B.价格低廉 C.性能优越 D.强大的容器支持 解答:CD

  2. vim 命令大全(写的非常全和好)http://blog.csdn.net/woshixiaosimao/article/details/54312738

    下文转自链接.由原作者陈皓译自<Learn ViM Progressively>,非常不错. ——————————正文开始—————————— 你想以最快的速度学习人类史上最好的文本编辑器 ...

  3. jQery使网页在显示器上居中显示适用于任何分辨率

    这篇文章主要介绍了jQery使网页在任何分辨率的显示器上居中显示的方法,需要的朋友可以参考下 检测屏幕宽度,并设置为id为frame的div宽度, 根据自己网页的最大宽度来调节,小demo最大宽度为1 ...

  4. 第七篇:使用 fcntl 函数 获取,设置文件的状态标志

    前言 当打开一个文件的时候,我们需要指定打开文件的模式( 只读,只写等 ).那么在程序中如何获取,修改这个文件的状态标志呢? 本文将告诉你如何用 fcntl函数 获取指定文件的状态标志. 解决思路 1 ...

  5. 【BZOJ4260】Codechef REBXOR Trie树+贪心

    [BZOJ4260]Codechef REBXOR Description Input 输入数据的第一行包含一个整数N,表示数组中的元素个数. 第二行包含N个整数A1,A2,…,AN. Output ...

  6. mvn命令上传jar

    开发过程中涉及到下载第三SDK包,而本身项目是基于gradle的,所以为了项目中使用sdk包,需要将包加入到自己的仓库 1.利用nexus创建自己的第三方库thirdparty 类型hosted 2. ...

  7. 160811、29 个你必须知道的 Linux 命令

    虽然Linux发行版支持各种各样的饿GUI(graphical user interfaces),但在某些情况下,Linux的命令行接口(bash)仍然是简单快速的.Bash和 Linux Shell ...

  8. MD5-【验签】

    MD5是什么? MD5是message-digest algorithm 5(信息-摘要算法)的缩写,被广泛用于加密和解密技术上,它可以说是文件的"数字指纹".任何一个文件,无论是 ...

  9. Spoken English Practice(appetite,ache,meds,change, stop)Look like you got your appetite back, that's a good sign.

    绿色:连读:                  红色:略读:               蓝色:浊化:               橙色:弱读     下划线_为浊化 口语蜕变(2017/6/27) ...

  10. <2014 05 21> 互联网时代的C语言——Go

    Go希望成为互联网时代的C语言. 多数系统级语言(包括Java和C#)的根本编程哲学来源于C++,将C++的面向对象进一步发扬光大.但是Go语言的设计者却有不同的看法,他们认为C++ 真的没啥好学的, ...