2025年机器人操作系统教程总结

机器人操作系统教程总结Ros 教程总结 参考网址 http training eeworld com cn video 14321 视频网址 最简单的一个 package 如下图所示 其中 CMakeLists txt 文件 规定了 catkin 编译的规则 例如 源文件 依赖项

大家好,我是讯享网,很高兴认识大家。

最简单的一个package(如下图所示)
在这里插入图片描述
讯享网
其中,CMakeLists.txt文件
规定了catkin编译的规则,例如:源文件,依赖项,目标文件。
常用的CMakeLists.txt文件的语法:在这里插入图片描述
一般使用catkin_create_pkg指令之后,通过自己的需要在对应的函数后边添加必要的文件.比如,自己写了一个msg,那么必须将该msg文件名写到add_message_file()中,写了srv,则把srv文件名写到add_service_files()中.
至于其他的比如节点,发布者,订阅者,服务跟客户,则每个都需要在末尾添加以下3个句子.
第一个句子是对该文件进行编译,第一个参数是编译生成的文件名,第二个参数是编译的文件的地址。
第二个句子,为生成文件指定了该文件需要链接的库,如果用到opencv或者qt的库,需要另行添加,库的链接.如果编译需要添加形如-lmenuw -lncursesw,则需要在末尾加上。(如下图第二个所示)
第三个句子,为生成文件指定依赖关系.
三个句子的示例如下所示
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES} -lmenuw -lncursesw)
add_dependencies(talker beginner_tutorials_generate_messages_cpp)

而,Package.xml文件
定义了package的属性,例如:包名,版本号,作者,依赖等等。
常用的package.xml文件的语法:
在这里插入图片描述
这个package可以根据ros提供的文件自行更改,一般只需要更改<build_depend>和<run_depend>的包.其他的维护者什么的,可以根据其他的package自己模仿,较为简单。
典型的package结构:(较为复杂,每个package应按照规矩来做.)
在这里插入图片描述
常用的部分ros指令及其功能:
在这里插入图片描述
其中,详细讲解一下catkin_create_pkg.(可用于创建自己的node)
加入你要创建一个叫做hello的node。
进入你的工作空间,例如:catkin_ws这个工作空间。
如果你还没有这个空间,就自己创建一个吧。
指令:

$ cd ~ $ mkdir catkin_ws $ catkin_make 

讯享网

(这样子,你自己的工作空间就创建好啦,其中第二条指令的文件名可以自己更改)
创建完工作空间后,记得将自己工作空间的setup.bash写入环境变量:
指令:(< yourname>是你自己本机的~的名称)

讯享网$ echo “source/home/<yourname>/catkin_ws/devel/setup.bash” >> ~/.bashrc 
$ catkin_create_pkg hello roscpp std_msgs rospy 

这个时候,catkin_ws/src中就会出现一个最简单的package啦,里面一开始只有package.xml,CMakeLists.txt文件和一个src的空文件夹(src文件夹用来存放你自己想变成node的代码)。

一般我们使用roscore打开ros的核心,要运行ros的node之前必须启动roscore

ros的node的运行指令:
rosrun <package_name> <node_name>
例如你先要要启动hello这个package里面的hello_node这个node
则,你需要使用指令:<每个指令对应一个终端,不可关闭,除非不用了。>

讯享网$roscore $ rosrun hello hello_node 

rosnode指令:<常用指令>
在这里插入图片描述
rosnode info <node_name>显示的信息大致如下:
在这里插入图片描述
有时候,可以在其中查找自己想要的topic的信息,然后借助rostopic info <topic_name>来显示出对应的topic,然后找到该topic对应的发布节点以及msg文件,自行编写一个相同的msg文件以及一个侦查者来接受该node发布在topic上的信息。

roslaunch指令:
roslaunch <package_name> <filename.launch>
例如:
roslaunch usb_cam usb_cam.launch

对于launch文件的语法,如下:
在这里插入图片描述
额外参考网址:https://blog.csdn.net/_/article/details/
1根元素中间内容

2.launch文件中的内容主要是需要启动的各个节点。

<node name="" pkg="" type="" > 

name=”” //给节点指派了名称,它将覆盖任何通过调用ros::int来赋予节点的名称
pkg=”” //包名
type=”” //可执行文件名(节点名)
例如:

讯享网<node name="usb_cam" pkg="usb_cam" type="usb_cam_node"> 

3.< node> 的内容除了2中必须要之外还有其他一些

required=“true”//必须,即该节点关闭所有都关闭

respawn=”true”//节点关闭会重启

launch-prefix=””//前缀,实现特定功能,如另起终端 “xterm -e“

output=”screen”//在控制台输出信息

ns=”namespace”//。对一个节点设置默认命名空间 ,通常叫做压入(pushing down)命名空间

2)launch

运行 roslaunch pkg_ name launch_name

请求详细信息 roslaunch –vpackage-name launch-file-name

控制台显示所有节点输出roslaunch –screen package-name launch-file-name

3)名称重映射

作用:更改节点名称 可更改节点订阅的话题 其他用处?

<nodepkg=”turtlesim” type=”turtlesim_node”

name=”turtlesim_node”>

<remapfrom=”turtle1/pose” to=”tim”/>

< /node>

4)launch文件包含其他启动文件,即想在启动文件中包含其他启动文件的内容

可< include file=”$(findpackage-name)/launch-file-name”>

包含元素同样支持命名空间属性,可以将内容压入一个指定的命名空间中去:

<includefile=”…” ns=”namespace”/>

<include file="$(find roslaunch)/resources/example-include.launch" /> 

这里,系统将默认使用rospack find roslaunch找到文件的路径,然后进入其resources/目录,然后叠加她的example-include.launch文件。

5)启动参数arg

A.通过设置参数来描述节点在不同ROS会话中运行时可能需要改变的一小部分

声明参数 并赋值

<argname=”agr-name” default=”arg-value”/>//默认

<argname=”arg-name” value=”arg-value”/>//value

参数赋值亦可通过roslaunchpackage-name launch-file-name arg-name:=arg-value 来实现,会覆盖默认值,对于value值无法更改,并报错

B.获取参数值 一旦参数值被声明并且被赋值,可以使用该参数值了

$(arg arg-name)

C.arg参数相当于局部变量,不能被被包含的启动文件继承。可以将arg元素放到include中

<inclucefile=”path–to-launch-file”>

<argname=”arg-name” value=”arg-value”/>

< /include>

在include标签之间的参数是属于被包含文件的,而不是它们出现的启动文件。因为目的是为被包括的启动文件设置响应的参数值,所以该处需要使用value属性。

一种常见的情况是两个启动文件(包含文件和被包含文件)有一些共同的参数,在这种情况下,希望参数在传递的时候不会改变。这样的元素在两个地方使用相同的参数名:

<argname=”arg-name” value=”$(arg arg-name)”>

在该例子中,第一个参数名字通常是指被包含文件中的参数,第二个参数名是指当前文件中的参数。这样做之后,给定参数在两个启动文件中有相同的值。

6)group

作用

group可以把若干个节点放入同一个命名空间内。

<groupns=”namespace”/>

< /group>

组内的每个节点都从给定的默认命名空间启动。

group可以有条件地使能或禁用一个节点。

<group if=”0 or1”/>

< /group>

核心部分:
ros的topic与msg:(用于node与node之间的异步通信)
Node之间通过publish和subscribe机制通信()
在这里插入图片描述

Node之间发布topic跟订阅topic并没有影响的关系。
简而言之,一个只管发,一个只管订阅,并不在乎订阅的是谁发布的topic,只要msg类型相同即可。
基本msg中内容类型可包括:
在这里插入图片描述
rostopic和rosmsg常用指令:
在这里插入图片描述

Service与srv:
不用于ros的发布和订阅,这个属于ros中的同步订阅
Node之间通过request和reply方式通信。
在这里插入图片描述

Topic和service的区别对比:
在这里插入图片描述
.srv文件是service通信的数据格式,定义在srv文件夹中。
Srv的文件格式形如:
int a
int b

int sum
中间必须有三个-将request(请求)还有reply(回应)隔开
Note:srv和msg文件都可以嵌套msg文件,但是不可以嵌套stv文件,例如:
在这里插入图片描述
如果有msg和srv文件<针对以上的两个msg和一个srv文件>
必须在package文件添加:
在这里插入图片描述
在CMakeLists.txt文件添加:
在这里插入图片描述
rosservice和rossrv指令的常见用法:
在这里插入图片描述
Rosparam指令的用法:
在这里插入图片描述

ros::NodeHandle Class:
类方法:ros::Publisher advertise(const string &topic,uint32_t queue_size);
第一个参数是topic的名称,第二个参数是往topic发布的程度,结果返回一个publisher
发布的基本写法:
ros::NodeHandle nh;
ros::Publisher pub = nh.advertise(…);
Pub.publish(msg);

类方法:ros::Subscriber subscriber(const string &topic,unit32_t queue_size,void(*)(M));
前两个同上,第三个其实是一个函数指针,指向回调函数。
基本写法:
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscriber(…);
sub.subscribe(msg);
其他类方法:/参考链接:http://docs.ros.org/api/roscpp/html/
在这里插入图片描述

小讯
上一篇 2025-02-08 15:18
下一篇 2025-03-18 14:53

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/18819.html