ROS系统
ROS=通信机制+开发工具+应用功能+生态系统-->提高软件复用率
通过两种不同的方式进行通讯:
1.TOPIC异步通信:publish and subscribe between publisher and subscriber nodes by message under the ROS moaster registration模式。节点关系:多对多。多用于数据传输
2.SERVICE同步通信:request and response between servicer and client nodes by message under the ROS moaster registration模式。节点关系:一对多。多用于逻辑处理
参数:全局共享字典。
元功能包meta packages including package
最多只能找到在20.04Ubuntu安装ROS的教程,找不到在22.04上的,只好把22.04的卸载重新安装了。记住,vmware上的是20.04,virtualbox上的是22.04。
常用ROS命令:
rqt_graph基于qt可视化显示并且解释当前结点之间关系。
rosnode显示节点相关的信息,输入rosnode就会被提示相关的命令。例如rosnode list显示所有结点(不用关心rosout结点,因为这个节点是默认用来记录节点信的);rosnode info xx查看xx结点的信息.
rostopic显示相关话题的信息,输入rostopic就会被提示相关命令。例如rostopic list显示当前所有话题列表,rostopic pub给结点发布信息。
rosmsg查看节点信息。比如rosmsg show xx查看某个数据的结构与内容。
rosservice查看服务相关信息,例如resoservice list显示列表,rosservice call xx为节点创建一个service。
rosbag用于一次实验的记录与复原。记录:
rosbag record -a -O xx
将运行的数据存入xx之中,-a代表全部,-O代表放入xx之中。
复现:
rosbag play xx
即可复现。
ROS工作空间与功能包:
工作空间(存放工程开发相关文件的文件夹):
1.src代码空间(source space):放功能包
2.build:编译空间(build space)存放编译好的二进制文件
3.devel:开发空间(development space)
4.install:安装空间(isntall space)
3.4作用相似,所以在ROS2中合为一体
创建工作空间:
功能包:储存源码的最小单元,源码必须放在这里,不能直接放入srd。
同一个工作空间不能有同名功能包,不同工作空间可以有同名功能包。
功能包放在src中。
功能包中四个文件:
1.src放置源码
2.include放置头文件
3.cmakelist.txt描述编译语法
4.package.xml包含功能包描述信息,作用描述,开源许可证,作者信息以及功能包依赖等等,编译时会首先搜索依赖,看看是否已经具备
想执行功能包,要先配置环境变量(在catkin_ws中):
source devel/setup.bash
随后检查环境变量:
echo $ROS_PACKAGE_PATH
实现Publisher:
1.在工作空间创建功能包
2.在功能包的src中创建源代码
3.源代码包含:初始化结点,注册节点信息,创建消息,发布消息
4.配置编译文件
5.编译文件
6.设置环境变量(也可以选择把这个命令放入隐藏的配置文件夹.bashrc中去)
7.运行!
实现Subscriber:
同上
用opencv创建摄像头:(51条消息) ROS教程(五):OpenCV调用USB摄像头并发布topic(详细图文)_Leslie___Cheung的博客-CSDN博客_opencv调用usb摄像头
实现Client与Server:
与publisher,subscriber类似
参数字典:
相当于一个储存各个节点的参数的空间。
查看,修改的方法:1.用rosparam命令行查看并修改;2.用程序在工作空间中进行修改与查看。
具体请查看古月居的ppt。
ROS之坐标管理系统tf:
用launch便捷启动:
关于ROS2:
安装ROS2入门教程——2. Ubuntu20.04安装ROS2 Foxy - 古月居 (guyuehome.com)
教程ROS2安装方法 - ROS2入门教程 (guyuehome.com)
我的ubuntu上shell是sh,不是bash或者zsh,所以
source install/local_setup.bash
要改成
source install/local_setup.sh
(查错可费老鼻子劲了)
用python语言实现节点要在功能包的setup.py文件中添加接口,
entry_points={ 'console_scripts': [ 'node_helloworld = learning_node.node_helloworld:main', 'node_helloworld_class = learning_node.node_helloworld_class:main', 'node_object = learning_node.node_object:main', 'node_object_webcam = learning_node.node_object_webcam:main', ],
如上。注意,接口等号前后都要做修改,等号右边功能包名和节点名都要改。没改全导致我花了整整一天。。。