记录学习ROS的学习过程!
参考视频:https://www.bilibili.com/video/BV1zt411G7Vn?p=6
一丶背景介绍
ROS社区功能包,可进行二次开发。
Powering the word’s robots 机器人领域的普遍标准
提高机器人研发中的软件复用率!
资源:
ROS wiki:记录ROS信息文档的主要论坛
邮件列表(Mailing list):交流ROS更新的主要渠道
ROS Answers :咨询ROS相关问题的网站
博客:htttp://www.ros.org/news
二丶核心概念
1.通信机制
松耦合分布式软件框架,可以分布式完成节点,使用统一的通信标准。
-
节点(Node)—— 执行单元
执行具体任务的进程、独立运行的可执行文件;
不同节点可使用不同的编程语言,可分布式运行在不同的主机;
节点在系统中的名词必须是唯一的。 -
节点管理器(ROS Master)—— 控制中心
为节点提供命名和注册服务;
跟踪和记录话题/服务通信,辅助节点相互查找、建立连接
提供参数服务器,节点使用此服务器存储和检索运行时的参数。
-
a) 话题通信
- 话题 —— 异步通信机制
节点间用来传输数据的重要总线;
使用发步/订阅模型数据由发布者传输到订阅者,同一个话题的订阅者或发布者可以不唯一。 - 消息 —— 话题数据
具有一定的类型和数据结构,包括ROS提供的标准类型和用户自定义类型;
使用编程语言无关的,msg文件定义,编译过程中生成对应的代码文件。
- 话题 —— 异步通信机制
-
b) 服务通信
- 服务 —— 同步通信机制
使用客户端/服务器(C/S)模型,客户端发送请求数据,服务器完成处理后返回应答数据;
使用编程语言无关的,srv文件定义请求和应答数据结构,编译过程中生成对应的代码文件。
- 服务 —— 同步通信机制
2.参数
- 参数 —— 全局共享字典
可通过网络访问的共享、多变量字典;
节点使用此服务器来存储和检索运行时的参数;
适合存储静态、非二进制的配置参数,不适合存储动态配置的数据。
3.文件系统
- 功能包:ROS软件中的基本单元,包含节点源码、配置文件、数据定义等
- 功能包清单:记录功能包的基本信息,包含作者信息、许可信息、依赖选项、编译标志等
- 元功能包:组织多个用于同一目的功能包
三丶命令行工具的使用
1.以小海龟为例
启动节点管理器(ROS Master)
roscore
运行学习功能包中的小海龟节点
rosrun turtlesim turtlesim_node
运行键盘控制节点
rosrun turtlesim turtle_teleop_key
显示系统计算图的工具
rqt_graph
2.rosnode
显示系统所有节点相关信息的指令
列出系统中所有的节点
其中 rosout 采集所有节点的日志信息,提交显示,默认的话题。
列出某个节点的信息
3.rostopic
使用rostopic给小海龟发布信息
话题名 + 消息结构(Twist) + 具体数据(Linear 线速度 + angular 角速度)
但pub指令只会发布一次,因此小海龟只会运动一次,
添加频率 -r 10,每秒十次。
4.rosmsg
查看消息数据结构
5.rosservice
再添加一只海龟!(过年了!)
rosservice call /spawn "x: 3.0
y: 3.0
theta: 0.0
name: 'like'"
通过 rostopic list 看查看到第二只海龟,也可以控制第二只海龟
6.话题记录
记录当前系统中所有话题数据,并在下次复现。
其中 -a 是代表记录所有数据(all),-O是保存成压缩包的形式,后面是名称。默认保存在home文件夹下。
但是在查看.bag文件时,发现只出现.bag.active文件,查找原因可能是电脑在记录信息是没有完成最终录制,虽然可以转换成.bag文件,但是会有部分消息的丢失。
#切换到”xxx.bag.active”文件所在的目录下
rosbag reindex cmd_record.bag.active
rosbag fix cmd_record.bag.active cmd_record.abg
在第二步结束后,除了原来的以.bag.active为后缀的文件之外,还会生成一个以.bag.org.active为后缀的文件,注意该文件只是中间文件,第三部输入的时候不要对该文件进行修复。在第三步结束之后,会生成正常的.bag文件。
参考博客:https://blog.csdn.net/Tansir94/article/details/81513517
四丶创建工作空间
工作空间是一个存放工程开发相关文件的文件夹。
- src:代码空间
- build:编译空间
- devel:开发空间
- install:安装空间
1.创建工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
2.编译工作空间
cd ~/catkin_ws/
catkin_make
3.设置环境变量
source devel/setup.bash
4.检查环境变量
echo $ROS_PACKAGE_PATH
五丶创建功能包
放置ros源码最小单元,所有源码必须放在功能包中,并不能直接在src中。
catkin_create_pkg <package_name> [depend1][depend2][depend3]
1.创建功能包
cd ~/catkin_ws/src
catkin_create_pkg test_pkg std_msgs rospy roscpp
2.编译功能包
cd ~/catkin_ws
catkin_make
source ~/catkin_ws/devel/setup.bash
同一个工作空间下,不允许存在同名功能包。
不同的工作空间下,运行存在同名功能包。
六丶发布者Publisher的编程实现
1.创建功能包
cd ~/catkin_ws/src
catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim
2.编写cpp文件
3.配置发布者代码编译规则
如何配置CmakeLists.txt的编译规则
- 设置需要编译的代码和生成的可执行文件;
- 设置连接库;
add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})
4.编译并运行发布者
cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore
rosrun turtlesim turtlesim_node
rosrun learning_topic velocity_publisher
永久配置环境 Ctrl+h 显示隐藏文件 修改 .bashrc
source /home/like/catkin_ws/devel/setup.bash
七丶订阅者Subscriber的编程实现
1.编写cpp文件*
2.配置发布者代码编译规则
add_executable(pose_subscriber src/pose_subscriber.cpp)
target_link_libraries(pose_subscriber ${catkin_LIBRARIES})
八丶话题消息的定义与使用
1.自定义话题消息
➢ 定义msg文件;
➢ 在package.xml中添加功能包依赖
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
➢ 在CMakeLists.txt添加编译选项
• find_package( …… message_generation)
• add_message_files(FILES Person.msg)
generate_messages(DEPENDENCIES std_msgs)
• catkin_package(…… message_runtime)
➢ 编译生成语言相关文件
2.创建发布者代码
3.创建订阅者代码
4.配置编译规则
add_executable(person_publisher src/person_publisher.cpp)
target_link_libraries(person_publisher ${catkin_LIBRARIES})
add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp)
add_executable(person_subscriber src/person_subscriber.cpp)
target_link_libraries(person_subscriber ${catkin_LIBRARIES})
add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp)
5.编译并运行
cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore
rosrun learning_topic person_subscriber
rosrun learning_topic person_publisher
九丶客户端Client的编程实现
1.创建功能包
cd ~/catkin_ws/src
catkin_create_pkg learning_service roscpp rospy std_msgs geometry_msgs turtlesim
2.编写cpp代码
3.配置编译规则
add_executable(turtle_spawn src/turtle_spawn.cpp)
target_link_libraries(turtle_spawn ${catkin_LIBRARIES})
4.编译并运行
cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore
rosrun turtlesim turtlesim_node
rosrun learning_service turtle_spawn
十丶服务端Server的编程实现
1.编写Server代码
2.配置编译规则
add_executable(turtle_command_server src/turtle_command_server.cpp)
target_link_libraries(turtle_command_server ${catkin_LIBRARIES})
3.编译并运行服务器
cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore
rosrun turtlesim turtlesim_node
rosrun learning_service turtle_command_server
rosservice call /turtle_command "{}"
十一丶服务数据的定义与使用
1.自定义服务数据
➢ 定义srv文件;
➢ 在package.xml中添加功能包依赖
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
➢ 在CMakeLists.txt添加编译选项
• find_package( …… message_generation)
• add_service_files(FILES Person.srv)
generate_messages(DEPENDENCIES std_msgs)
• catkin_package(…… message_runtime)
➢ 编译生成语言相关文件
2.编写程序代码
3.配置编译环境
add_executable(person_server src/person_server.cpp)
target_link_libraries(person_server ${catkin_LIBRARIES})
add_dependencies(person_server ${PROJECT_NAME}_gencpp)
add_executable(person_client src/person_client.cpp)
target_link_libraries(person_client ${catkin_LIBRARIES})
add_dependencies(person_client ${PROJECT_NAME}_gencpp)
4.编译并运行
cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore
rosrun learning_service person_server
rosrun learning_service person_client
十二丶参数的使用与编程方法
1.创建功能包
cd ~/catkin_ws/src
catkin_create_pkg learning_parameter roscpp rospy std_srvs
2.参数命令行使用
rosparam
# 列出当前多有参数
rosparam list
# 显示某个参数值
rosparam get param_key
# 设置某个参数值
rosparam set param_key param_value
# 保存参数到文件
rosparam dump file_name
# 从文件读取参数
rosparam load file_name
# 删除参数
rosparam delete param_key
3.编程实现方法
4.配置编译规则
add_executable(parameter_config src/parameter_config.cpp)
target_link_libraries(parameter_config ${catkin_LIBRARIES})
5.编译并运行
cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore
rosrun turtlesim turtlesim_node
rosrun learning_parameter parameter_config
十三丶ROS中的坐标系管理系统
1.机器人坐标变换
1.小海龟跟随实验
#sudo apt-get install ros-melodic-turtle-tf
sudo apt-get install ros-kinetic-turtle-tf
roslaunch turtle_tf turtle_tf_demo.launch
rosrun turtlesim turtle_teleop_key
rosrun tf view_frames
2.查树中任意两个坐标系之间的关系
rosrun tf tf_echo turtle1 turtle2
3.可视化工具
rosrun rviz rviz -d `rospack find turtle_tf`/rviz/turtle_rviz.rviz
十四丶TF坐标系广播与监听的编程实现
1.创建功能包
~/catkin_ws/src
catkin_create_pkg learning_tf roscpp rospy tf turtlesim
2.编写程序代码
2.配置编译规则
add_executable(turtle_tf_broadcaster src/turtle_tf_broadcaster.cpp)
target_link_libraries(turtle_tf_broadcaster ${catkin_LIBRARIES})
add_executable(turtle_tf_listener src/turtle_tf_listener.cpp)
target_link_libraries(turtle_tf_listener ${catkin_LIBRARIES})
3.编译并运行
cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore
rosrun turtlesim turtlesim_node
rosrun learning_tf turtle_tf_broadcaster __name:=turtle1_tf_broadcaster /turtle1
rosrun learning_tf turtle_tf_broadcaster __name:=turtle2_tf_broadcaster /turtle2
rosrun learning_tf turtle_tf_listener
rosrun turtlesim turtle_teleop_key
十五丶launch启动文件的使用方法
Launch文件:通过XML文件实现多节点的配置和启动(可自动启动ROS Master)
⚫ROS : https://www.ros.org
⚫ROS Wiki : http://wiki.ros.org/
⚫ROSCon 2012 ~ 2019 : https://roscon.ros.org
⚫ROS Robots : https://robots.ros.org/
⚫Ubuntu Wiki : https://wiki.ubuntu.org.cn
⚫古月居 :http://www.gyh.ai
⚫zhangrelay的专栏 :https://blog.csdn.net/ZhangRelay
⚫易科机器人实验室:http://blog.exbot.net/
⚫开源机器人学学习指南:https://github.com/qqfly/how-to-learn-robotics