ROS系统的相关命令+订阅发布代码

news/2024/11/30 2:47:20/

1.5.2 ROS文件系统相关命令

1.增

catkin_create_pkg 自定义包名 依赖包 === 创建新的ROS功能包sudo apt install xxx === 安装 ROS功能包

2.删

sudo apt purge xxx ==== 删除某个功能包

3.查

rospack list === 列出所有功能包rospack find 包名 === 查找某个功能包是否存在,如果存在返回安装路径roscd 包名 === 进入某个功能包rosls 包名 === 列出某个包下的文件apt search xxx === 搜索某个功能包apt search noetic-* | grep -i gmapping  === 搜索导航的功能包

4.改

rosed 包名 文件名 === 修改功能包文件

需要安装 vim

比如:rosed turtlesim Color.msg
5.执行
5.1roscore

roscore === 是 ROS 的系统先决条件节点和程序的集合, 必须运行 roscore 才能使 ROS 节点进行通信。

roscore 将启动:

 ros masterros 参数服务器rosout 日志节点

用法:

roscore

或(指定端口号)

roscore -p xxxx

5.2rosrun

rosrun 包名 可执行文件名 === 运行指定的ROS节点比如:rosrun turtlesim turtlesim_node

5.3roslaunch

roslaunch 包名 launch文件名 === 执行某个包下的 launch 文件

在这里插入图片描述

c++订阅发布代码

发布方:demo01_pub.cpp

/*需求: 实现基本的话题通信,一方发布数据,一方接收数据,实现的关键点:1.发送方2.接收方3.数据(此处为普通文本)PS: 二者需要设置相同的话题消息发布方:循环发布信息:HelloWorld 后缀数字编号实现流程:1.包含头文件 2.初始化 ROS 节点:命名(唯一)3.实例化 ROS 句柄4.实例化 发布者 对象5.组织被发布的数据,并编写逻辑发布数据*/
// 1.包含头文件 
#include "ros/ros.h"
#include "std_msgs/String.h" //普通文本类型的消息
#include <sstream>int main(int argc, char  *argv[])
{   //设置编码setlocale(LC_ALL,"");//2.初始化 ROS 节点:命名(唯一)// 参数1和参数2 后期为节点传值会使用// 参数3 是节点名称,是一个标识符,需要保证运行后,在 ROS 网络拓扑中唯一ros::init(argc,argv,"talker");//初始ros注rospy.sleep(3)#休眠3秒册一个talker节点名称//3.实例化 ROS 句柄ros::NodeHandle nh;//初始化一个句柄,句柄名称为nh,就是将ROS实例化//4.实例化 发布者 对象//泛型: 发布的消息类型//参数1: 要发布到的话题//参数2: 队列中最大保存的消息数,超出此阀值时,先进的先销毁(时间早的先销毁)ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10);// 创建发布者对象,为文本类型,话题名为chatter,缓冲区大小为10.//发布者注册一个pud的话题,消息类型为10大小的//消息队列相当与缓存信息,如果处理速度不够快的消息会被保存在队列中//5.组织被发布的数据,并编写逻辑发布数据//数据(动态组织)std_msgs::String msg;//定义一个msg,声明变量, 声明string类型数据// msg.data = "你好啊!!!";std::string msg_front = "Hello 你好!"; //消息前缀int count = 0; //消息计数器//发布频率。逻辑(一秒10次),10HZ ros::Rate r(10);ros::Duration(3).sleep();//延迟3秒,为了实现完成注册,为了不让数据减少//节点不死while (ros::ok())//ok是你这个节点还活着我这个循环就成立{//使用 stringstream 拼接字符串与编号std::stringstream ss;ss << msg_front << count;//字符串+信息计数器的拼接msg.data = ss.str();//将输入流中的统一成,字符类型//发布消息pub.publish(msg);//加入调试,打印发送的消息,添加日志ROS_INFO("发送的消息:%s",msg.data.c_str());//根据前面制定的发送贫频率自动休眠 休眠时间 = 1/频率;r.sleep();count++;//循环结束前,让 count 自增//回头函数,来处理回调函数,但是这个没有回调函数,占时没有用上ros::spinOnce();}return 0;
}

rospy.sleep(3)#休眠3秒

订阅方:demo02_sub.cpp

/*需求: 实现基本的话题通信,一方发布数据,一方接收数据,实现的关键点:1.发送方2.接收方3.数据(此处为普通文本)消息订阅方:## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})## Specify libraries to link a library or executable target against订阅话题并打印接收到的消息实现流程:1.包含头文件 2.初始化 ROS 节点:命名(唯一)3.实例化 ROS 句柄4.实例化 订阅者 对象5.处理订阅的消息(回调函数)6.设置循环调用回调函数
rospy.sleep(3)#休眠3秒
*/
// 1.包含头文件 
#include "ros/ros.h"
#include "std_msgs/String.h"//回调函数:传递消息是String类型的,ConstPtr& msg_p:常量指针的引用
void doMsg(const std_msgs::String::ConstPtr& msg_p){ROS_INFO("我听见:%s",msg_p->data.c_str());// ROS_INFO("我听见:%s",(*msg_p).data.c_str());
}
int main(int argc, char  *argv[])
{setlocale(LC_ALL,"");//2.初始化 ROS 节点:命名(唯一)ros::init(argc,argv,"listener");//3.实例化 ROS 句柄ros::NodeHandle nh;//4.实例化 订阅者 对象ros::Subscriber sub = nh.subscribe<std_msgs::String>("chatter",10,doMsg);//doMsg:回调函数//5.处理订阅的消息(回调函数)//     6.设置循环调用回调函数,回头函数,来处理回调函数ros::spin();//循环读取接收的数据,并调用回调函数处理
rospy.sleep(3)#休眠3return 0;
}

修改CMakeLists.txt文件

add_executable(demo01_pub src/demo01_pub.cpp)
add_executable(demo02_sub src/demo02_sub.cpp)target_link_libraries(demo01_pub${catkin_LIBRARIES}
)
target_link_libraries(demo02_sub${catkin_LIBRARIES}
)

在这里插入图片描述

编译代码

catkin_make
roscore
source ./devel/setup.bash

#订阅发布实现命令

rosrun plumbing_pub_sub  demo01_pub
rosrun plumbing_pub_sub demo02_sub

画图的命令

rqt_graph

图:两边是节点,中间是话题
在这里插入图片描述
python实现订阅话题

#! /usr/bin/env python
"""需求: 实现基本的话题通信,一方发布数据,一方接收数据,实现的关键点:1.发送方2.接收方3.数据(此处为普通文本)PS: 二者需要设置相同的话题消息发布方:循环发布信息:HelloWorld 后缀数字编号实现流程:1.导包 2.初始化 ROS 节点:命名(唯一)3.实例化 发布者 对象4.组织被发布的数据,并编写逻辑发布数据"""
#1.导包 
import rospy
from std_msgs.msg import String #发布消息类型if __name__ == "__main__":#2.初始化 ROS 节点:命名(唯一)rospy.init_node("talker_p")#初始化节点,创建一个talker_p节点#3.实例化 发布者 对象pub = rospy.Publisher("chatter",String,queue_size=10)#创建一个话题:chatter话题名称,String数据的类型#4.组织被发布的数据,并编写逻辑发布数据msg = String()  #创建 msg 对象msg_front = "hello 你好"count = 0  #计数器 # 设置循环频率rate = rospy.Rate(1)rospy.sleep(3)#休眠3while not rospy.is_shutdown():#判断节点是否关闭的函数:rospy.is_shutdown#拼接字符串msg.data = msg_front + str(count)#字符串+信息计数器的拼接pub.publish(msg)#//发布消息rate.sleep()#//根据前面制定的发送贫频率自动休眠 休眠时间 = 1/频率;rospy.loginfo("写出的数据:%s",msg.data)#打印输出count += 1
#! /usr/bin/env python
"""需求: 实现基本的话题通信,一方发布数据,一方接收数据,实现的关键点:1.发送方2.接收方3.数据(此处为普通文本)消息订阅方:订阅话题并打印接收到的消息实现流程:1.导包 2.初始化 ROS 节点:命名(唯一)3.实例化 订阅者 对象4.处理订阅的消息(回调函数)5.设置循环调用回调函数"""
#1.导包 
import rospy
from std_msgs.msg import Stringdef doMsg(msg):rospy.loginfo("I heard:%s",msg.data)if __name__ == "__main__":#2.初始化 ROS 节点:命名(唯一)rospy.init_node("listener_p")#3.实例化 订阅者 对象sub = rospy.Subscriber("chatter",String,doMsg,queue_size=10)#4.处理订阅的消息(回调函数)#5.设置循环调用回调函数rospy.spin()```## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})## Specify libraries to link a library or executable target against修改CMakeLists.txt文件```cpp
catkin_install_python(PROGRAMSscripts/demo01_pub_p.pyscripts/demo02_sub_p.pyDESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

实现命令

在/src/plumbing_pub_sub/scripts文件下
sudo chmod +x *.py## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})## Specify libraries to link a library or executable target against
roscore
rosrun plumbing_pub_sub  demo01_pub_p.py
rosrun plumbing_pub_sub demo02_sub_p.py 

http://www.ppmy.cn/news/41647.html

相关文章

Java开发 - 配置中心初体验

目录 前言 配置中心介绍 什么是配置中心 Nacos配置中心 数据结构 命名空间 分组 服务 配置中心添加配置 读取配置 本地添加依赖 本地添加配置 测试 结语 前言 前文讲了ELK&#xff0c;ELK说简单也简单&#xff0c;说复杂也复杂&#xff0c;但说实话&#xff0c;微…

动力节点王鹤SpringBoot3笔记-了解AOT和GraalVM

9 了解AOT和GraalVM 9.1 提供性能的技术 什么是AOT&#xff1a; Ahead-of-Time Compilation &#xff1a;预编译&#xff08;提前编译&#xff09;它在 JEP-295 中描述&#xff0c;并在 Java 9 中作为实验性功能添加。 AOT是提升Java程序性能的一种方法&#xff0c;特别是提供…

LAZADA将缩短履约时效,卖家发货倍感压力

Lazada的跨境卖家们&#xff0c;恐怕又要头疼了。 近日&#xff0c; Lazada官方宣布&#xff0c;为了提升消费者体验&#xff0c;平台将调整商家履约订单时效。从2023年5月4日起生成的订单履约时效将有所更新。 具体而言&#xff0c;内地、香港和Laz Go Global的履约节点为“点…

elasticsearch 认知

1.大数据领域需要解决以下三个问题 如何存储数据 传统的关系数据库&#xff08;MySQL、Oracle、和Access等&#xff09;主导了20世纪的数据存储模式&#xff0c;但当数据量达到太字节级&#xff0c;甚至拍字节级时&#xff0c;关系型数据库表现出了难以解决的瓶颈问题。为了解决…

SDUT操作系统课程(CATS)专题一+专题三(参考总结)

CATS专题一+进程同步模型.信号量机制 总结:先看进程优先级,优先级高的进程先进行,一般在CATS中第三个才会出现P/V操作 两个信号量都初始值为零,P操作为信号量减一 如:X=X-1=-1. V操作为信号量加一 如:Y=Y+1=1. 其中如果信号量为-1时,当前进程为阻塞状态,切换到另一…

你真的会自动化测试?自动化测试技术选型抉择

自动化测试框架 在学习自动化测试或者实践自动化测试时&#xff0c;我们一定会对一个名词不陌生&#xff0c;那就是“自动化测试框架”&#xff0c;而有些人也将Selenium、Appium这样的工具也称之为“自动化测试框架”&#xff0c;那么到底自动化测试框架如何理解呢&#xff1…

7nm舱泊一体SoC的新玩家

2016年&#xff0c;高通推出基于14纳米工艺的汽车座舱芯片骁龙820A&#xff0c;彼时&#xff0c;传统座舱SoC霸主NXP主推的是28纳米工艺的iMX8系列。不过&#xff0c;两款芯片都没有能够达到预期的量产效果。 真正的时代变革&#xff0c;来自于高通在2019年发布的全球首款量产7…

Zookeeper集群 + Fafka集群

目录 第一章Zookeeper 概述 1.1.Zookeeper 定义 1.2.Zookeeper 工作机制 1.3.Zookeeper 特点 1.4.Zookeeper 数据结构 1.5.Zookeeper 应用场景 1.6.Zookeeper 原理之选举机制 1.7.部署 Zookeeper 集群 总结 第二章消息队列概述 2.1消息队列需求原因 2.2消息队列的优…