ros使用时的注意事项技巧

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中修改package-name,package-name例如这里的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_MAXint 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仿真器中的海龟发布随机生成的指令,在添加完依赖后,执行结果如下图
1


编写一个订阅者程序
我们继续使用 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块有没有被注释掉,如果注释掉就要打开
试验结果:
123
左边是订阅者收到的消息,右边是随机发送的指令
---

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执行后的结果如下:
12312

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文件,并添加进来

转载于:https://www.cnblogs.com/pk28/p/7625838.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu+vscode打不开

前沿: vscode链接参考链接 问题: 之前在Ubuntu上安装chrome, 结果chrome没装成功, 还把vscode给qiu坏了, 貌似是当时安装chrome时提示要升级一个包. 后来发现当时是修改了libnss这个包的版本: 解决方法: # 将libnss给downgrade一下就OK了. sudo apt install libnss32:3.21-1ubu…

纯css隐藏移动端滚动条解决方案(ios上流畅滑动)

html代码展示&#xff08;直接复制代码保存至本地文件运行即可&#xff09;&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, init…

JavaAppArguments.java

思路&#xff1a;定义一个String类型的变量&#xff0c;用来接收每次args读取到的值&#xff0c;然后把String转换为int,然后计算输出sum。 流程图&#xff1a; 源代码&#xff1a; 截图&#xff1a; 转载于:https://www.cnblogs.com/xiaohaigege666/p/7635907.html

〖Mysql〗-- python操作数据库

【数据库进阶】 python 操作MYSQL数据库主要有两种方式&#xff1a;    使用原生模块&#xff1a;pymysql  ORM框架&#xff1a;SQLAchemy 一、pymysql 1.1下载安装模块 12第一种&#xff1a;cmd下&#xff1a;执行命令下载安装&#xff1a;pip3 install pymysql第二种&…

Apriori 关联分析算法原理分析与代码实现

转自穆晨 阅读目录 前言关联分析领域的一些概念Apriori算法基本原理频繁项集检索实现思路与实现代码关联规则学习实现思路与实现代码小结回到顶部前言 想必大家都听过数据挖掘领域那个经典的故事 - "啤酒与尿布" 的故事。 那么&#xff0c;具体是怎么从海量销售信息中…

Spring JpaRepository示例(内存中)

这篇文章描述了一个使用内存中HSQL数据库的简单Spring JpaRepository示例。 该代码示例可从GitHub的Spring-JpaRepository目录中获得。 它基于带有注释的Spring-MVC-示例和此处提供的信息 。 JPA资料库 我们为该示例实现一个虚拟bean&#xff1a; Entity AutoProperty public…

数据分析 - 残酷的世界

数据分析 - 残酷的世界 可视化作品链接地址&#xff1a;http://reinhardhsu.com/game.html 概要 最近读了比尔盖茨的夏日书单中的荐书《乡下人的悲歌》&#xff0c; 书中描述了贫穷、毒品和一系列陋习&#xff0c;像遗传病一样&#xff0c;困扰着一代又一代的美国底层人民…

burpsuite破解版

来源&#xff1a;http://www.vuln.cn/8847 转载于:https://www.cnblogs.com/shengulong/p/8819072.html

Eclipse Juno上带有GlassFish的JavaEE 7

Java EE 7很热。 前四个JSR最近通过了最终批准选票&#xff0c;与此同时GlassFish 4达到了升级版83。 如果您关注我的博客&#xff0c;那么您将了解NetBeans的大部分工作。 但是我确实认识到&#xff0c;那里还有其他IDE用户&#xff0c;他们也有权试用最新和最出色的企业Java。…

photoshop 切片工具进行切图

1、使用切片工具切图 2、存储为web所用格式 3、选择图片格式 4、只保存切片&#xff08;选择所有用户切片&#xff09; 5、查看&#xff1a;

HubSwitch工作原理,冲突域,以太网帧结构笔记(2017年10月9日 11:15:46)

一、冲突域 网络中发送的主要是应用程序产生的数据。 数据流需要网络设备进行数据转发&#xff0c;任何应用程序在发送数据流之前都要进行数据封装。 比如&#xff1a;SMAC DMAC | SIP DIP | 报头&#xff08;Source Port、Destination Port&#xff09;| QQ的数据载荷&#xf…

在IDEA中实战Git

工作中多人使用版本控制软件协作开发&#xff0c;常见的应用场景归纳如下&#xff1a; 假设小组中有两个人&#xff0c;组长小张&#xff0c;组员小袁 场景一&#xff1a;小张创建项目并提交到远程Git仓库 场景二&#xff1a;小袁从远程Git仓库上获取项目源码 场景三&#xff1…

iOS 图文并茂的带你了解深拷贝与浅拷贝

一、概念与总结 1、浅拷贝 浅拷贝就是对内存地址的复制&#xff0c;让目标对象指针和源对象指向同一片内存空间&#xff0c;当内存销毁的时候&#xff0c;指向这片内存的几个指针需要重新定义才可以使用&#xff0c;要不然会成为野指针。 浅拷贝就是拷贝指向原来对象的指针&…

angular使用sass的scss语法

一、现象 为了简写样式 二、解决 1、安装sass ,利用npm 安装(npm工具如果没有&#xff0c;请先自行安装好) &#xff08;1&#xff09;、npm install node-sass --save-dev &#xff08;2&#xff09;、npm install sass-loader --save-dev 2、修改.angular-cli.json文件 …

Arrays.sort与Arrays.parallelSort

我们都使用Arrays.sort对对象和原始数组进行排序。 该API在下面使用合并排序或Tim排序对内容进行排序&#xff0c;如下所示&#xff1a; public static void sort(Object[] a) {if (LegacyMergeSort.userRequested)legacyMergeSort(a);elseComparableTimSort.sort(a); }即使合…

Google Chrome 浏览器JS无法更新解决办法

JS无法更新原因&#xff1a; 浏览器为了加载快&#xff0c;默认是按照自定规则更新缓存&#xff0c;非实时更新。 我们在开发的时候&#xff0c;JS变动很快&#xff0c;需要即时让浏览器加载最新文件&#xff0c;也就是禁用浏览器缓存 &#xff08;1&#xff09;使用F12进入…

CSS盒子的浮动

在标准流中&#xff0c;一个块级元素在水平方向会自动伸展&#xff0c;直到包含它的元素的边界&#xff1b;而在竖直方向和兄弟元素依次排列&#xff0c;不能并排。使用“浮动”方式后&#xff0c;块级元素的表现就会有所不同。 CSS中有一个float属性&#xff0c;默认为no…

servlet中url-pattern之/与/*的区别

转载于:https://www.cnblogs.com/hwgok/p/8835350.html

很少使用“ ControlFlowException”

控制流是命令式编程的“遗留物”&#xff0c;它已泄漏到其他各种编程范例中&#xff0c;包括Java的面向对象范例 。 除了有用的和无处不在的分支和循环结构外&#xff0c;还包括原语&#xff08;例如GOTO&#xff09;和非局部变量&#xff08;例如异常&#xff09;。 让我们仔细…

使用Amazon Web Services(EC2)

正如我上周参加技术动手AWS培训之前所发布的。 这些天的课程当然是我以前使用过的标准EC2和S3服务。 除此之外&#xff0c;我们还使用了RDS &#xff0c; Elastic Load Balancing &#xff0c; SNS和VPC &#xff0c; Elastic Beanstalk并讨论了许多术语和业务案例。 在本文中&…