ROS 使用教程

发布时间:2025-12-09 16:17:27 浏览次数:3

ROS(Robot Operating System)机器人操作系统实际上是提供了多节点协同机制,使用了话题、服务、参数服务器、action等通信机制,同时ROS还提供了Gazebo、rviz、rqt、rosbag等工具,这些工具的本质也是对通信消息的收发。
ROS本身提供了点对点网络,共同处理数据,它的基本概念包括节点、主节点、参数服务器、消息、服务、话题、包等等。

分别使用
rospack-获取软件包有关信息:查看软件包依赖,
roscd-切换到软件包目录
rosls-查看软件包包含文件
rosnode-查看ros节点相关信息:查看节点列表,查看节点消息属性
rosrun-运行软件包-某一节点功能:rqt-graph
rostopic-获取话题相关信息
rosservice-获取服务相关信息
rosparam-获取参数相关信息
roslaunch-启动launch文件
rosmsg-查看消息有关信息

可以使用Tab补全代码

整个ROS程序的完整结构是

workspace_folder/ -- WORKSPACEsrc/ -- SOURCE SPACECMakeLists.txt -- 'Toplevel' CMake file, provided by catkinpackage_1/CMakeLists.txt -- CMakeLists.txt file for package_1package.xml -- Package manifest for package_1...package_n/CMakeLists.txt -- CMakeLists.txt file for package_npackage.xml -- Package manifest for package_n
  • 初始化工作空间
  • mkdir -p my_workspace/srccd my_workspace/src
  • 创建软件包 catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
  • catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
  • 创建catkin工作区,生效配置文件
    使用catkin_make,即在CMAKE标准工作流中依次调用了cmake和make。
  • cd ..catkin_makecatkin_make install# 等价于在CMAKE工作空间下执行:# mkdir build | cd build | cmake .. | make | make install
  • 运行软件包和查看系统结构
    运行键盘控制小乌龟运动的示例功能,在多个终端窗口分辨运行下面指令
  • roscorerosrun turtlesim turtlesim_node __name:=my_turtlerosrun turtlesim turtle_teleop_key

    检查通信的层次方向

    rosrun rqt_graph rqt_graph
  • rostopic 指令详述
    (1)echo-接收话题消息数据-rostopic echo <topic_name>
    (2)pub-发布话题消息数据-rostopic pub <topic_name> <msgs_type> [args]
  • # 发布一次小乌龟速度话题消息数据rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'# 以1Hz的频率持续发布小乌龟速度话题数据rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'

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

  • rosservice 指令详述
  • (1)rosservice list 获取服务列表(2)rosservice call
  • rosparam 指令详述
  • #(1)rosparam list 获取参数列表#(2)rosparam get [param_name] 获取参数值#(3)rosparam set [param_name] [args] 设置参数值#(4)rosparam load [yaml_name] ([namespace]) 从文件中加载参数(载入新的命名空间)#(5)rosparam sump [yaml_name] ([namespace]) 向文件中转储参数(载入新的命名空间)#(6)rosparam delete [param_name] 删除参数
  • rqt 指令详述
    (1)查看节点传递消息层次:rosrun rqt_graph rqt_graph
    (2)查看数据图:rosrun rqt_plot rqt_plot
    (3)查看日志框架:rosrun rqt_console rqt_console
    (4)查看信息的详细级别:rosrun rqt_logger_level rqt_logger_level
  • roslaunch
    在软件包(如beginner_tutorials)文件夹内创建launch文件家,用于保存launch文件。
  • <launch><!--创建两个分组,命名空间分别为turtlesim1,turtlesim2它们都包含名为sim的turtlesim节点,--><group ns="turtlesim1"><node pkg="turtlesim" name="sim" type="turtlesim_node"/></group><group ns="turtlesim2"><node pkg="turtlesim" name="sim" type="turtlesim_node"/></group><!--启动模仿节点,模仿的输入和输出分别为turtlesim1和turtlesim2--><node pkg="turtlesim" name="mimic" type="mimic"><remap from="input" to="turtlesim1/turtle1"/><remap from="output" to="turtlesim2/turtle1"/></node></launch>

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

    roslaunch beginner_tutorials turtlemimic.launchrostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'

    其中消息传递的层次是

    13. rosed 操作详述
    rosed是rosbash套件的一部分,可以用来编辑包中文件
    设置默认编辑器
    详细操作见:http://wiki.ros.org/cn/ROS/Tutorials/UsingRosEd

    10.创建ROS消息和服务

    (1)基本介绍

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

    (2)类型格式

    可用类型:

    • int8, int16, int32, int64 (以及 uint*)
    • float32, float64
    • string
    • time, duration
    • 其他msg文件
    • variable-length array[] 和 fixed-length array[C]
      .srv文件用一条---将请求和响应两部分上下分开,如:
    int64 Aint64 B---int64 Sum

    (3)创建消息或服务

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

    对于消息

    package.xml

    <build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend>

    CMakeLists.txt

    • find_package中添加message_generation
    • catkin_package取消注释,并在CATKIN_DEPENDS后面添加message_runtime
    • add_message_files取消注释,并添加message_name.msg
    • generate_messages取消注释

    对于服务

    package.xml

    <build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend>

    CMakeLists.txt

    • find_package中添加message_generation
    • catkin_package取消注释,并在CATKIN_DEPENDS后面添加message_runtime
    • add_service_files取消注释,并添加service_name.srv
    • generate_messages取消注释

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

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

    C++

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

    add_executable(talker src/talker.cpp)target_link_libraries(talker ${catkin_LIBRARIES})add_dependencies(talker beginner_tutorials_generate_messages_cpp)add_executable(listener src/listener.cpp)target_link_libraries(listener ${catkin_LIBRARIES})add_dependencies(listener beginner_tutorials_generate_messages_cpp)

    代码解释

    add_executable(<exable file_name> <relative file_path>)target_link_libraries(<exable file_name> ${catkin_LIBRARIES})add_dependencies(<exable file_name> ${${PROJECT_NAME}_EXPORTED_TARGETS})

    (3)编译和运行
    在workspace执行catkin_make编译指令,可以调用rosrun <pkg_name> <exable file_name>,即rosrun beginner_tutorials talker。

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

    python

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

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

    catkin_install_python(PROGRAMS scripts/talker.py scripts/listener.pyDESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})

    (3)运行
    若进行了第二步,需切换到工作空间目录执行catkin_make。
    使用rosrun <pkg_name> <filename.py>运行。

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

    进阶库学习

    navigate 导航模块

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

    roscore# roslaunch slam_sim_demo <launchfilename>roslaunch slam_sim_demo gmapping_demo.launchroslaunch slam_sim_demo view_slam.launch

    在rviz环境中使用2D Nav Goal指定目标点
    跑通的gmapping_demo层次结构如图:

    navigation本身是一个metapackage,是一个功能包的集合。
    是一个二维的导航功能包。


    灰色(可替代)
    蓝色(必须提供)

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

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

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

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

    navigation例子

    roscore

    ROS资料:

  • ROS wiki cn:http://wiki.ros.org/cn/ROS/Tutorials
  • ROS导航官方库:
  • 【奥特学院】ROS机器人入门课程《ROS理论与实践》零基础教程:https://www.bilibili.com/video/BV1Ci4y1L7ZZ,课程文档:http://www.autolabor.com.cn/book/ROSTutorials/
  • 中国大学慕课,课程代码:https://github.com/GetOverMassif/ROS-Academy-for-Beginners,课程文档:https://sychaichangkun.gitbooks.io/ros-tutorial-icourse163/content/
  • 需要做网站?需要网络推广?欢迎咨询客户经理 13272073477