Ros教程总结:
参考网址:http://training.eeworld.com.cn/video/14321(视频网址)
最简单的一个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提供的文件自行更改,一般只需要更改
典型的package结构:(较为复杂,每个package应按照规矩来做.)
常用的部分ros指令及其功能:
其中,详细讲解一下catkin_create_pkg.(可用于创建自己的node)
加入你要创建一个叫做hello的node。
进入你的工作空间,例如:catkin_ws这个工作空间。
如果你还没有这个空间,就自己创建一个吧。
指令:
$ cd ~
$ mkdir catkin_ws
$ catkin_make
(这样子,你自己的工作空间就创建好啦,其中第二条指令的文件名可以自己更改)
创建完工作空间后,记得将自己工作空间的setup.bash写入环境变量:
指令:(< yourname>是你自己本机的~的名称)
$ echo “source/home//catkin_ws/devel/setup.bash” >> ~/.bashrc
接下来,继续讲解创建属于自己的node。
指令:(依赖性随需要而定,以下的三个依赖项只是示范,其中,roscpp是c++文件的依赖项,rospy是python文件的依赖项,std_msgs是通信的依赖项)
$ 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
例如你先要要启动hello这个package里面的hello_node这个node
则,你需要使用指令:<每个指令对应一个终端,不可关闭,除非不用了。>
$roscore
$ rosrun hello hello_node
rosnode指令:<常用指令>
rosnode info
有时候,可以在其中查找自己想要的topic的信息,然后借助rostopic info
roslaunch指令:
roslaunch
例如:
roslaunch usb_cam usb_cam.launch
对于launch文件的语法,如下:
额外参考网址:https://blog.csdn.net/qq_35460250/article/details/54744473
1根元素中间内容
2.launch文件中的内容主要是需要启动的各个节点。
name=”” //给节点指派了名称,它将覆盖任何通过调用ros::int来赋予节点的名称
pkg=”” //包名
type=”” //可执行文件名(节点名)
例如:
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)名称重映射
作用:更改节点名称 可更改节点订阅的话题 其他用处?
name=”turtlesim_node”> < /node> 4)launch文件包含其他启动文件,即想在启动文件中包含其他启动文件的内容 可< include file=”$(findpackage-name)/launch-file-name”> 包含元素同样支持命名空间属性,可以将内容压入一个指定的命名空间中去: 应该说该设置是十分普遍的,尤其是当被包含进来的启动文件属于另一个功能包的时候,设置的操作应当独立于其他节点 这里,系统将默认使用rospack find roslaunch找到文件的路径,然后进入其resources/目录,然后叠加她的example-include.launch文件。 5)启动参数arg A.通过设置参数来描述节点在不同ROS会话中运行时可能需要改变的一小部分 声明参数 并赋值 参数赋值亦可通过roslaunchpackage-name launch-file-name arg-name:=arg-value 来实现,会覆盖默认值,对于value值无法更改,并报错 B.获取参数值 一旦参数值被声明并且被赋值,可以使用该参数值了 $(arg arg-name) C.arg参数相当于局部变量,不能被被包含的启动文件继承。可以将arg元素放到include中 … < /include> 在include标签之间的参数是属于被包含文件的,而不是它们出现的启动文件。因为目的是为被包括的启动文件设置响应的参数值,所以该处需要使用value属性。 一种常见的情况是两个启动文件(包含文件和被包含文件)有一些共同的参数,在这种情况下,希望参数在传递的时候不会改变。这样的元素在两个地方使用相同的参数名: 在该例子中,第一个参数名字通常是指被包含文件中的参数,第二个参数名是指当前文件中的参数。这样做之后,给定参数在两个启动文件中有相同的值。 6)group 作用 group可以把若干个节点放入同一个命名空间内。 … < /group> 组内的每个节点都从给定的默认命名空间启动。 group可以有条件地使能或禁用一个节点。 < /group> 核心部分: Node之间发布topic跟订阅topic并没有影响的关系。 Service与srv: int sum ros::NodeHandle Class: 类方法:ros::Subscriber subscriber(const string &topic,unit32_t queue_size,void(*)(M));
例子:
ros的topic与msg:(用于node与node之间的异步通信)
Node之间通过publish和subscribe机制通信()
简而言之,一个只管发,一个只管订阅,并不在乎订阅的是谁发布的topic,只要msg类型相同即可。
基本msg中内容类型可包括:
rostopic和rosmsg常用指令:
不用于ros的发布和订阅,这个属于ros中的同步订阅
Node之间通过request和reply方式通信。
Topic和service的区别对比:
.srv文件是service通信的数据格式,定义在srv文件夹中。
Srv的文件格式形如:
int a
int b
中间必须有三个-将request(请求)还有reply(回应)隔开
Note:srv和msg文件都可以嵌套msg文件,但是不可以嵌套stv文件,例如:
如果有msg和srv文件<针对以上的两个msg和一个srv文件>
必须在package文件添加:
在CMakeLists.txt文件添加:
rosservice和rossrv指令的常见用法:
Rosparam指令的用法:
类方法: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::NodeHandle nh;
ros::Subscriber sub = nh.subscriber(…);
sub.subscribe(msg);
其他类方法:/参考链接:http://docs.ros.org/api/roscpp/html/