解决方案

ROS 使用教程

seo靠我 2023-09-26 02:03:56

ROS(Robot Operating System)机器人操作系统实际上是提供了多节点协同机制,使用了话题、服务、参数服务器、action等通信机制,同时ROS还提供了Gazebo、rviz、rqtSEO靠我、rosbag等工具,这些工具的本质也是对通信消息的收发。

ROS本身提供了点对点网络,共同处理数据,它的基本概念包括节点、主节点、参数服务器、消息、服务、话题、包等等。

分别使用

rospack-获取软件SEO靠我包有关信息:查看软件包依赖,

roscd-切换到软件包目录

rosls-查看软件包包含文件

rosnode-查看ros节点相关信息:查看节点列表,查看节点消息属性

rosrun-运行软件包-某一节点功能:rqSEO靠我t-graph

rostopic-获取话题相关信息

rosservice-获取服务相关信息

rosparam-获取参数相关信息

roslaunch-启动launch文件

rosmsg-查看消息有关信息

可以使用TSEO靠我ab补全代码

整个ROS程序的完整结构是

workspace_folder/ -- WORKSPACEsrc/ -- SOURCE SPACECMakeLists.txt -- Toplevel CMakSEO靠我e file, provided by catkinpackage_1/CMakeLists.txt -- CMakeLists.txt file for package_1package.xml -SEO靠我- Package manifest for package_1...package_n/CMakeLists.txt -- CMakeLists.txt file for package_npackSEO靠我age.xml -- Package manifest for package_n 初始化工作空间 mkdir -p my_workspace/srcSEO靠我 cd my_workspace/src 创建软件包 catkin_create_pkg[depend1] [depend2] [depend3] SEO靠我 catkin_create_pkg beginner_tutorials std_msgs rospy roscpp 创建catkin工SEO靠我作区,生效配置文件

使用catkin_make,即在CMAKE标准工作流中依次调用了cmake和make。 cd .. catkin_make SEO靠我 catkin_make install# 等价于在CMAKE工作空间下执行: # mkdir build | cd build | cmake .. | makeSEO靠我 | make install 运行软件包和查看系统结构

运行键盘控制小乌龟运动的示例功能,在多个终端窗口分辨运行下面指令 roscore roSEO靠我srun turtlesim turtlesim_node __name:=my_turtle rosrun turtlesim turtle_teleop_key

检查通信的层次方向

rSEO靠我osrun rqt_graph rqt_graph rostopic 指令详述

(1)echo-接收话题消息数据-rostopic echo

(2)pub-发布话题消息数据-roSEO靠我stopic pub <topic_name> <msgs_type> [args] # 发布一次小乌龟速度话题消息数据 rostopic pub -1 /turtleSEO靠我1/cmd_vel geometry_msgs/Twist -- [2.0, 0.0, 0.0] [0.0, 0.0, 1.8] # 以1Hz的频率持续发布小乌龟速度话题数据 SEO靠我 rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- [2.0, 0.0, 0.0] [0.0, 0.0, -1.8]

(3)hz-SEO靠我查看数据发布速率-``

rosservice 指令详述 (1)rosservice list 获取服务列表 (2)rosservice call SEO靠我 rosparam 指令详述 #(1)rosparam list 获取参数列表 #(2)rosparam get [param_nameSEO靠我] 获取参数值 #(3)rosparam set [param_name] [args] 设置参数值 #(4)rosparam load [yaml_nSEO靠我ame] ([namespace]) 从文件中加载参数(载入新的命名空间) #(5)rosparam sump [yaml_name] ([namespace]) 向文件中转储SEO靠我参数(载入新的命名空间) #(6)rosparam delete [param_name] 删除参数 rqt 指令详述

(1)查看节点传递消息层次:roSEO靠我srun rqt_graph rqt_graph

(2)查看数据图:rosrun rqt_plot rqt_plot

(3)查看日志框架:rosrun rqt_console rqt_console

(4)SEO靠我查看信息的详细级别:rosrun rqt_logger_level rqt_logger_levelroslaunch

在软件包(如beginner_tutorials)文件夹内创建launch文件家,SEO靠我用于保存launch文件。 <launch><!--创建两个分组,命名空间分别为turtlesim1,turtlesim2它们都包含名为sim的turtlesim节点,--><grouSEO靠我p ns="turtlesim1"><node pkg="turtlesim" name="sim" type="turtlesim_node"/></group><group ns="turtlesSEO靠我im2"><node pkg="turtlesim" name="sim" type="turtlesim_node"/></group><!--启动模仿节点,模仿的输入和输出分别为turtlesimSEO靠我1和turtlesim2--><node pkg="turtlesim" name="mimic" type="mimic"><remap from="input" to="turtlesim1/tuSEO靠我rtle1"/><remap from="output" to="turtlesim2/turtle1"/></node></launch>

在终端窗口运行launch文件和发布话题消息

roslauncSEO靠我h beginner_tutorials turtlemimic.launch rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msSEO靠我gs/Twist -r 1 -- [2.0, 0.0, 0.0] [0.0, 0.0, -1.8]

其中消息传递的层次是

13. rosed 操作详述

rosed是rosbash套件的一部分,可以用来编辑包SEO靠我中文件

设置默认编辑器

详细操作见:http://wiki.ros.org/cn/ROS/Tutorials/UsingRosEd

10.创建ROS消息和服务

(1)基本介绍

消息(.msg)和服务(.srv)SEO靠我都是文本文件,一般分别放置在软件功能包中的msg和srv文件夹中(与launch平级),用于为不同语言编写的消息生成源代码,msg只有一个部分,而服务分为请求和响应。

(2)类型格式

可用类型:

int8,SEO靠我 int16, int32, int64 (以及 uint*)float32, float64stringtime, duration其他msg文件variable-length array[] 和 SEO靠我fixed-length array[C]

.srv文件用一条---将请求和响应两部分上下分开,如: int64 A int64 B --- SEO靠我 int64 Sum

(3)创建消息或服务

为保证能够转换成为C++、python或者其他语言的源代码(即若需要自己构建消息类型),需要在package.xml、CMakeLists.txt中添加相关代SEO靠我码:

对于消息

package.xml

<build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_dSEO靠我epend>

CMakeLists.txt

find_package中添加message_generationcatkin_package取消注释,并在CATKIN_DEPENDS后面添加message_SEO靠我runtimeadd_message_files取消注释,并添加message_name.msggenerate_messages取消注释

对于服务

package.xml

<build_depend>meSEO靠我ssage_generation</build_depend><exec_depend>message_runtime</exec_depend>

CMakeLists.txt

find_package中SEO靠我添加message_generationcatkin_package取消注释,并在CATKIN_DEPENDS后面添加message_runtimeadd_service_files取消注释,并添加sSEO靠我ervice_name.srvgenerate_messages取消注释

添加完成后,退回工作空间,使用catkin_make重新编译ROS包,编译完成后,自行创建的消息类型就被加载到rosmasterSEO靠我中了,可以通过rosmsg show <message_name>或rossrv show <service_name>查看消息详细信息。

11.编写简单的发布者和订阅者

C++

(1).cpp文件添加

在前SEO靠我面创建的pkg/src中添加talker.cpp文件,在其中初始化名为talker_init的节点。(talker.cpp和listenter.cpp的代码见节尾)

(2)CMakeLists.txt添SEO靠我

在CMakeLists.txt的末尾添加add_executable(talker src/talker.cpp) target_link_libraries(talker ${caSEO靠我tkin_LIBRARIES}) add_dependencies(talker beginner_tutorials_generate_messages_cpp)add_executSEO靠我able(listener src/listener.cpp) target_link_libraries(listener ${catkin_LIBRARIES}) SEO靠我add_dependencies(listener beginner_tutorials_generate_messages_cpp)

代码解释

add_executable(<exable file_nSEO靠我ame> <relative file_path>) target_link_libraries(<exable file_name> ${catkin_LIBRARIES}) SEO靠我 add_dependencies(<exable file_name> ${${PROJECT_NAME}_EXPORTED_TARGETS})

(3)编译和运行

在workspace执行catSEO靠我kin_make编译指令,可以调用rosrun <pkg_name> <exable file_name>,即rosrun beginner_tutorials talker。/*talker.cppSEO靠我*/ #include "ros/ros.h" #include "std_msgs/String.h"#include <sstream>int main(int aSEO靠我rgc, char **argv) {// 初始化ROS,指定节点名,此处的节点名必须是唯一的ros::init(argc, argv, "talker_initname");// 创SEO靠我建进程句柄ros::NodeHandle n;// 创建话题发布者,定义其名字和消息类型,以及最多缓存的消息条数ros::Publisher chatter_pub = n.advertise<stdSEO靠我_msgs::String>("chatter", 1000);// 指定循环频率ros::Rate loop_rate(10);int count = 0;/* 若没有出现:(1)Ctrl+C;(2SEO靠我)被同名节点提出网络;(3)ros::shutdown()被程序另一部分调用;(4)ros::NodeHandles都被销毁。则ros::ok()返回true*/while(ros::ok()){stSEO靠我d_msgs::String msg;std::stringstream ss;ss << "hello world " << count;msg.data = ss.str();ROS_INFO("SEO靠我%s", msg.data.c_str());// 发布消息chatter_pub.publish(msg);// 与回调函数相关ros::spinOnce();// 睡眠指定时间loop_rate.SEO靠我sleep();++count;}return 0; } /*listener.cpp*/ #include "ros/ros.h" SEO靠我#include "std_msgs/String.h"// 定义接收到消息时的回调函数 void chatterCallback(const std_msgs::String::CoSEO靠我nstPtr& msg) {ROS_INFO("I heard: [%s]", msg->data.c_str()); }int main(int argc, charSEO靠我 **argv) {ros::init(argc, argv, "listener_initname");ros::NodeHandle n;// 创建订阅者,指定可以累积接收的消息数SEO靠我,指定回调函数ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);// 自循环函数,一旦ros::ok()返回falSEO靠我se,将自动退出ros::spin();return 0; }

python

(1)添加.py文件

一般习惯在前面创建的pkg中创建scripts文件夹,在其中添加talker.py文件,在SEO靠我其中初始化名为talker_init_py的节点。右击.py文件的属性,将其设置为可以作为程序执行。(talker.py和listenter.py的代码见节尾)

(2)在CMakeList.txt中添加SEO靠我(可以不做这一步)

catkin_install_python(PROGRAMS scripts/talker.py scripts/listener.pyDESTINATION ${CATKIN_PASEO靠我CKAGE_BIN_DESTINATION} )

(3)运行

若进行了第二步,需切换到工作空间目录执行catkin_make。

使用rosrun <pkg_name> <filename.pSEO靠我y>运行。"""talker.py""" #!/usr/bin/env python # -*- coding: utf-8 -*- # licenseSEO靠我 removed for brevityimport rospy from std_msgs.msg import String # 创建发布者函数 dSEO靠我ef talker():# 创建话题发布者对象,指定其名字,消息类型,最大累积队列长度pub = rospy.Publisher(chatter, String, queue_size=10)# 初始SEO靠我化节点,指定节点名,anonymous = True会让名称末尾添加随机数,来确保节点具有唯一的名称。rospy.init_node(talker_init_py, anonymous=True)# SEO靠我设置发布频率rate = rospy.Rate(10)# 如果节点没有被关闭while not rospy.is_shutdown():hello_str = "hello world %s" % rSEO靠我ospy.get_time()# ros消息框rospy.loginfo(hello_str)# 发布消息pub.publish(hello_str)# 睡眠指定时间rate.sleep()if __SEO靠我name__ == __main__:try:talker()except rospy.POSInterruptException:pass """listener.py""" SEO靠我 #!/usr/bin/env python # -*- coding: utf-8 -*- import rospy from std_msSEO靠我gs.msg import String# 创建回调函数 def callback(data):# 在ros窗口显示消息rospy.loginfo(rospy.get_caller_iSEO靠我d() + "I heard %s", data.data)def listener():# 初始化节点rospy.init_node(listener_init_py, anonymous=TrueSEO靠我)# 指定订阅者对象rospy.Subscriber("chatter", String, callback)# 自循环函数rospy.spin()if __name__ == __main__:liSEO靠我stener()

进阶库学习

navigate 导航模块

首先跑通一个demo对navigate模块建立整体的认识,下载中国大学慕课《机器人操作系统入门》的代码(视频和代码链接见文末),根据其中的md文件配SEO靠我置ros工作空间和编译,

slam例子

分别输入指令:roscore # roslaunch slam_sim_demo <launchfilename> roslauncSEO靠我h slam_sim_demo gmapping_demo.launch roslaunch slam_sim_demo view_slam.launch

在rviz环境中使用2D NaSEO靠我v Goal指定目标点

跑通的gmapping_demo层次结构

如图:

navigation本身是一个metapackage,是一个功能包的集合。

是一个二维的导航功能包。

灰色(可替代)

蓝色(必须提供)

moSEO靠我ve_base的功能包括全局规划局部规划处理异常行为,可以把它看做有三个接口,如下图所示,针对每个接口,都可以指定相应的程序,而这三个接口插件都集成了nav_core这个接口类。

cost_mapSEO靠我move_base的一个插件,与map不同的是,cost_map用于路径规划,是有多个层叠加的结果,如static layer(静态)、obstacle layer(动态和三维)、inflation SEO靠我layer(膨胀信息)。

map_server提供一直地图的信息,发布的topic为占用栅格数值和地图信息,提供静态地图服务,提供frame的参数服务器。

amcl为蒙特卡洛自适应定位方法,输入的参数有/SEO靠我tf、/scan和/map,输出的参数为/tf、/amcl_pose和/map,相较于传统的纯里程计(odom)定位,会将里程计的漂移补到odom计和map之间。

navigation例子

roscoreSEO靠我

ROS资料:

ROS wiki cn:http://wiki.ros.org/cn/ROS/TutorialsROS导航官方库:【奥特学院】ROS机器人入门课程《ROS理论与实践》零基础教程:httpsSEO靠我://www.bilibili.com/video/BV1Ci4y1L7ZZ,课程文档:http://www.autolabor.com.cn/book/ROSTutorials/中国大学慕课,课程代SEO靠我码:https://github.com/GetOverMassif/ROS-Academy-for-Beginners,课程文档:https://sychaichangkun.gitbooks.ioSEO靠我/ros-tutorial-icourse163/content/
“SEO靠我”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与 我们联系删除或处理,客服邮箱:html5sh@163.com,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同 其观点或证实其内容的真实性。

网站备案号:浙ICP备17034767号-2