学习笔记--古月居ROS入门21讲

ROS中的核心概念:

节点(Node)——执行单元
节点管理器(ROS Master)——控制中心
话题(Topic)——异步通信
机制消息(Message)——话题数据
服务(Service)——同步通信机制
参数(Parameter)——全局共享字典
功能包(Package)——ROS软件中基本单元
功能包清单(Package manifest)——记录功能包的基本信息
元功能包(Meta Package)——组织多个用于同一目的功能包

ros常用命令行工具常用命令

rostopic
rosservice
rosnode
rosparam
rosmsg
rossrv

Topic

查看话题列表

$ rosnode list

发布话题消息

$ rostopic pub -r 10 /turtle1/ cmd_vel geometry_msgs /Twist "
x: 1.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0"

发布服务请求

$ rosservice call /spawn "x: 5.0
y: 5.0
theta: 0.0
name: 'turtle2'"

话题记录

$ rosbag record -a -O cmd_record

话题复现

$ rosbag play cmd_record.bag

tab 一下可以补全
tab 双击可以查看指令
crtl+alt+t 快捷打开终端

工作空间:
src:代码空间(Source Space)
build:编译空间(Build Space)
devel:开发空间(Development Space)
install:安装空间(Install Space)

创建工作空间

$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace

编译工作空间

$ cd ~/catkin_ws
$ catkin_make

设置环境变量

$ source devel/setup.bash

检查环境变量

$ echo $ROS_PACKAGE_PATH

创建功能包

$ catkin_create_pkg <package_name> [depend1] [depend2] ……
$ cd ~/catkin_ws src
$ catkin_create_ pkg test_pkg std_msgs rospy roscpp

编译功能包

$ cd ~/catkin_ws
$ catkin_make
$ source ~/catkin_ws/devel/setup.bash

Publisher

创建功能包

$ cd ~/catkin_ws/src
$ catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim

把c++程序文件放在功能包文件夹中的src文件夹中,此处功能包为learning_topic
把python文件放入scripts文件夹中,没有该文件夹就创建一个,然后设置该文件的权限,勾选执行权限
然后再在learning_topic文件夹中的CMakeLists.txt文件的BUILD中的最后一行加上

add_executable(velocity_publisher src/velocity_publisher.cpp) 
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})

第一句为把cpp文件编译成velocity_publisher可执行文件
第二句做链接

编译

$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun learning_topic velocity_publisher

ctrl+H 显示隐藏文件
在home文件夹中一个.bashrc文件中最后一行加上

source /home/pfq/catkin_ws/devel/setup.bash	

后重新启动终端就可以不用每次用source devel/setup.bash设置环境变量了

如何实现一个发布者:

  • 初始化 ROS 节点;
  • 向 ROS Master 注册节点信息包括发布的话题名和话题中的消息类型;
  • 创建消息数据;
  • 按照一定频率循环发布消息 。

subscriber

然后再在learning_topic文件夹中的CMakeLists.txt文件的BUILD中的最后一行加上

add_executable(pose_subscriber src/pose_subscriber.cpp)
target_link_libraries(pose_subscriber ${catkin_LIBRARIES})

编译运行订阅者

$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun learning_topic pose_subscriber

运行python程序

$ rosrun learning_topic pose_subscriber.py

运行python时不用编译

话题消息定义与使用

编译msg文件
在功能包文件中创建msg文件,并在该文件中创立person.msg文件,该文件中放置类似于宏定义的代码

string name
uint8 sex
uint8 age
uint8 unknown = 0
uint8 male = 1
uint8 female = 2

在 package.xml 中添加功能包依赖

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

在 CMakeLists.txt 添加编译选项

find_package ( …… message_generation)      ##在find_package括号中加message_generation编译依赖

add_message_files(FILES Person.msg)
generate_messages(DEPENDENCIES std_msgs)

catkin_package (…… message_runtime)       ##在catkin_package括号中的CATKIN_DEPENDS geometry_msgs roscpp rospy rospy std_msgs turtlesim 后面加message_runtime执行依赖

用catkin_make编译后就完成了msg文件的编译在CMakeList.txt中的build最后加上如下代码

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)

编译并运行发布者和订阅者

$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun learning_topic person_subscriber
$ rosrun learning_topic person_publisher

客户端 Client 的编程实现

创建功能包

$ cd ~/catkin_ws/src
$ catkin_create_pkg learning_service roscpp rospy std_msgs geometry_msgs turtlesim

如何配置CMakeLists.txt 中的编译规则设置 需要编译的代码和生成的可执行文件;设置链接库;在build中加如下代码

add_executable(turtle_spawn src/turtle_spawn.cpp)
target_link_libraries(turtle_spawn ${catkin_LIBRARIES})

编译并运行客户端

$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun learning_service turtle_spawn

服务端 Server 的编程实现
CMakeList.txt中加如下代码

add_executable(turtle_command_server src/turtle_command_server.cpp)
target_link_libraries(turtle_command_server ${catkin_LIBRARIES})

编译运行服务器

$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun learning_service turtle_command_server
$ rosservice call /turtle_command "{}"

服务数据的定义与使用

Person.srv文件,三根线下面为response,线上为request

string name
uint8 age
uint8 sex
uint8 unknown = 0
uint8 male = 1
uint8 female = 2
---
string result

person.srv文件的CMakeList.txt配置同.msg配置一样,只需要把代码add_message_files(FILES Person.msg)中的Person.msg改成Person.srv即可

配置服务器客户端代码编译规则

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)

编译运行

$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun learning_service person_server
$ rosrun learning_service person_client

参数的使用与编程方法

创建功能包

$ cd ~/catkin_ws/src
$ catkin_create_pkg learning_parameter roscpp rospy std_srvs

rosparam

列出当前所有参数
$ rosparam list
显示某个参数值
$ rosparam get param_key
设置某个参数值
$ rosparam set param_key param_value
保存参数到文件
$ rosparam dump file_name
从文件读取参数
$ rosparam load file_name
刷新参数
$ rosservice call /clear "{}"
删除参数
$ rosparam delete param_key

配置代码编译

add_executable(parameter_config src/parameter_config.cpp)
target_link_libraries(parameter_config ${catkin_LIBRARIES})

编译运行

$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun learning_parameter parameter_config

ROS中的坐标系管理系统

机器人中的坐标变换海龟示例

$ sudo apt-get install ros-melodic-turtle-tf
$ roslaunch turtle_tf turtle_tf_demo.launch
$ rosrun turtlesim turtle_teleop_key
$ rosrun tf view_frames

可视化多种方法显示坐标数据
$ rosrun tf tf_echo turtle1 turtle2
rviz可视化工具
$ rosrun rviz rviz -d 'rospack find turtle_tf'/rviz/turtle_rviz.rviz
进入界面后display中的fix frame中改成world,然后再点击add添加tf即可显示海龟坐标

launch启动文件的使用方法

Launch文件: 通过XML文件实现多节点的配置和启动可自动启动ROS Master
< launch >:launch文件中的根元素采用标签定义

< node >:启动节点

  • pkg:节点所在的功能包名称
  • type:节点的可执行文件名称
  • name:节点运行 时 的名称
  • output 、 respawn 、 required 、 ns 、 args

< param >:设置ROS 系统运行中的参数,存储在参数服务器中。

  • name :参数名
  • value :参数值

< rosparam >:加载参数文件中的多个参数。

< arg >:launch文件内部的局部变量,仅限于 launch 文件使用

<arg name=" arg-name" default="arg-value" />
#调用方式如下:
<param name="foo" value="$(arg arg name)" />
  • name :参数名
  • value :参数值

< remap >:重映射ROS 计算图资源的命名。

  • from :原命名
  • to :映射之后的命名

< include >:包含其他launch 文件,类似 C 语言中的头文件包含。

  • file :包含的其他 launch文件路径

更多标签可参见: http://wiki.ros.org/roslaunch/XML

常用可视化工具的使用

日志输出工具:rqt_console
计算图可视化工具:rqt_graph
数据绘图工具:rqt_plot
图像渲染工具:rqt _image_view

进阶
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

学习视频:
古月居ROS入门21讲视频链接:https://www.bilibili.com/video/BV1zt411G7Vn
或者B站搜索古月居

你可能感兴趣的:(linux)