Ros学习笔记
官方学习网址https://wiki.ros.org/ROS/Tutorials
如何阅读ROSwiki的网页https://wiki.ros.org/ROS/Tutorials/NavigatingTheWiki
环境搭建
printenv | grep ROS # 查看环境中ros有关的变量
source /opt/ros/melodic/setup.bash # 利用source bash建立环境,需要在打开的每个新 shell 上运行此命令才能访问 ROS 命令,除非将此行添加到 .bashrc或者zshrc。
echo $ROS_PACKAGE_PATH# 应得到/home/youruser/catkin_ws/src:/opt/ros/kinetic/share
工作区搭建
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make # 在“src”文件夹中创建一个 CMakeLists.txt 链接。当前目录应该有一个“build构建”和“devel开发”文件夹。在“devel”文件夹在有几个 setup.*sh
source devel/setup.bash # source devel里的bash文件可以覆盖当前的黄静。
创建包
包(package):包是ROS代码的软件组织单元。每个包都可以包含库、可执行文件、脚本或其他工件。
清单 (package.xml):清单是对包的描述。它用于定义包之间的依赖关系并捕获有关包的元信息,如版本、维护者、许可证等…
ros的文件系统管理工具
rospack
rospack find [package_name] #find命令返回package地址
rospack depends1 [package_name] #查看package的一级依赖包,在xml里也会显示
rospack depends [package_name] #查看package的所有级依赖包,在xml里不会显示
roscd
roscd [package_name]/subdir # 跳转到package所在的地址或者下面的subdir
echo $ROS_PACKAGE_PATH # 所有的package都在这里,找不到就没有
roscd log #ROS 存储日志文件的文件夹。如果还没有运行任何 ROS 程序,这将roscd log指出它尚不存在
roscd roscpp_tut >> 摁一下TAB >> roscd roscpp_tutorials/#Tab Completion包名补全
rosls
rosls [package_name]/subdir#返回package地址下目录
ros包的建立和安装
ros包的文件架构
workspace_folder/ #WORKSPACE
src/ #SOURCE SPACE。package在src里
CMakeLists.txt #'Toplevel' CMake file, provided by catkin,src里又一个cmake
package_1/
CMakeLists.txt #CMakeLists.txt file for package_1
package.xml #Package manifest for package_1 一个package必须包括xml和cmakelists
ros包的创建方法
cd ~/catkin_ws/src && catkin_create_pkg beginner_tutorials std_msgs rospy roscpp #在src目录中创建包,包括xml和cmake文件
catkin_create_pkg <package_name> [depend1] [depend2] [depend3]#注意从属关系,从属包在xml里会显示<build_depend>std_msgs</build_depend>
cd ~/catkin_ws && catkin_make #返回上一级目录make/build一下
source ~/catkin_ws/devel/setup.bash # 将工作区添加ROS环境中才能使用
package.xml的格式
1 <?xml version="1.0"?>
2 <package format="2">#开头
3 </package>#结尾
1. <description>The beginner_tutorials package</description># 任何介绍
2.<!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> --> #注释格式
<maintainer email="user@todo.todo">user</maintainer> #维护者的名字
3. <license>TODO</license>#一个许可证并在此处填写。一些常见的开源许可证是 BSD、MIT、Boost 软件许可证、GPLv2、GPLv3、LGPLv2.1 和 LGPLv3
4. <buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>#依赖
5. <exec_depend>roscpp</exec_depend>
<exec_depend>rospy</exec_depend>
<exec_depend>std_msgs</exec_depend>#为了所有指定的依赖项在构建和运行时都可用,因此为每个依赖项添加一个 exec_depend标记
含package的工作区的build
# In a catkin workspace
catkin_make #将构建在 src 文件夹中找到的任何 catkin 项目
catkin_make --source my_src #如果src不在底下,可以添加--source
catkin_make install # (optionally)
roscore
roscore 是使用 ROS 时应该运行的第一件事。
roscore
rosnode节点
rosnode list#展示所有node
rosnode info rosout#展示/rosout的信息
rosrun [package_name] [node_name]#运行包内的节点
rosrun [package_name] [node_name] __name:=my_turtle#运行包内的节点并改变node的名字
rosnode ping my_turtle#查看node运行信息
Topic
roscore #一个终端开core
rosrun turtlesim turtlesim_node#第二个终端开乌龟节点
rosrun turtlesim turtle_teleop_key#第三个终端开控制节点,两个节点通过topic通讯
rosrun rqt_graph rqt_graph #利用rqtgraph显示node之间的通讯
rostopic -h#获得如下帮助命令
rostopic bw #display bandwidth used by topic
rostopic echo [topic_name] #查看topic内的信息,比如rostopic echo /turtle1/cmd_ve
rostopic hz [topic] #报告发布数据的速率。
rostopic list #返回当前订阅和发布的所有主题的列表。
-v#详细选项
-p#publishers
-s#subscribers
rostopic pub [topic] [msg_type] [args] #将数据发布到当前广告的主题。
rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'# - 仅发布一条消息然后退出
#--以下参数都不是选项
rostopic type [topic] #返回正在发布的任何主题的消息类型。
rosmsg show [topic]#rosmsg 查看消息的详细信息
Services
服务是节点可以相互通信的另一种方式。服务允许节点发送请求并接收响应。
rosservice list #print information about active services
rosservice call [service] [args] #call the service with the provided args
rosservice type [service] #print service type
rosservice type /spawn | rossrv show #查看服务生成的信息来看看服务有参数的情况
rosservice find #find services by service type
rosservice uri #print service ROSRPC uri
rosparam
rosparam 允许您在 ROS 参数服务器上存储和操作数据。参数服务器可以存储整数、浮点数、布尔值、字典和列表。 rosparam 使用 YAML 标记语言作为语法
rosparam set[param_name] value #set parameter
rosservice call /clear#改变了参数值,必须调用清除服务以使参数更改生效
rosparam get [param_name] #get parameter
rosparam get / #展示整个 Parameter Server 的内容。
rosparam load [file_name] [namespace] #将所有参数写出到文件 params.yaml
rosparam dump [file_name] [namespace] #将所有参数写入到文件 params.yaml
rosparam delete #delete parameter
rosparam list #list parameter names
rqt_console
rqt_console 和 rqt_logger_level 进行调试
#信息级别
Fatal#致命
Error#错误
Warn #警告
Info #信息
Debug#调试
rosrun rqt_console rqt_console
rosrun rqt_logger_level rqt_logger_level
roslaunch
roslaunch 一次启动多个节点, 按照启动文件中的定义启动节点。
#在package目录下创建launch文件夹
roslaunch [package] [filename.launch]
roslaunch beginner_tutorials turtlemimic.launch
<launch>
<group ns="turtlesim1">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<group ns="turtlesim2">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<node pkg="turtlesim" name="mimic" type="mimic">
<remap from="input" to="turtlesim1/turtle1"/>
<remap from="output" to="turtlesim2/turtle1"/>
</node>
</launch>
rosed
rosed [package_name] [filename]
rosed roscpp Logger.msg #编辑roscpp包内的logger.msg文件
~/.bashrc#中 export EDITOR='nano -w'#设置编辑器
msg
msg 文件是描述 ROS 消息字段的简单文本文件。它们用于为不同语言的消息生成源代码
在pkg下的msg文件夹中,用.msg来编辑文件。.msg的名字是msg的名字
传输类型:
int8, int16, int32, int64 (plus uint*) float32, float64
string time, duration
variable-length array[]
fixed-length array[C]
实例
$ roscd beginner_tutorials
$ mkdir msg
$ echo "string first_name string last_name uint8 age uint32 score" > msg/Num.msg
在xml文件里也要编辑,将msg文件编写进去
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
创建msg文件需要在cmakelists里创建依赖message_generation,使用msg需要依赖message_runtime
# Do not just add this to your CMakeLists.txt, modify the existing text to add message_generation before the closing parenthesis
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
同时在cmakelists里还需要添加新建的msg文件,使用官方的命令
add_message_files(
FILES
Num.msg
)
现在我们必须确保调用了 generate_messages() 函数。
generate_messages(
DEPENDENCIES
std_msgs
)
rosmsg
$ rosmsg show [message type]
$ rosmsg show beginner_tutorials/Num#得到int64 num
srv
一个srv文件描述一个服务。它由两部分组成:请求和响应,用“—”线隔开。
实例
$ roscd beginner_tutorials
$ mkdir srv
不能手动写srv,一般是复制roscp一个,在这个基础上改动
$ scp [package_name] [file_to_copy_path] [copy_path]
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend
创建msg文件需要在cmakelists里创建依赖message_generation,使用msg需要依赖message_runtime
# Do not just add this line to your CMakeLists.txt, modify the existing line
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
add_service_files(
FILES
AddTwoInts.srv
)
rossrv
$ rossrv show <service type>
$ rossrv show beginner_tutorials/AddTwoInts#
#也可以不需要pkg的名字,一样可以找到所有的srv
$ rossrv show AddTwoInts
[beginner_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum
[rospy_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum
Header
ROS中还有一种特殊的类型:Header,header中包含了ROS中常用的时间戳和坐标系信息。您会经常看到 msg 文件的第一行有 Header 标头。
创建和测试Publisher and Subscriber
https://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29
https://wiki.ros.org/ROS/Tutorials/ExaminingPublisherSubscriber
创建和测试Service and Client (C++)
https://wiki.ros.org/ROS/Tutorials/WritingServiceClient%28c%2B%2B%29
https://wiki.ros.org/ROS/Tutorials/ExaminingServiceClient
bag file里的message
https://wiki.ros.org/ROS/Tutorials/reading%20msgs%20from%20a%20bag%20file
ROSwtf
https://wiki.ros.org/ROS/Tutorials/Getting%20started%20with%20roswtf