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)#休眠3秒return 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)#休眠3秒while 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