ROS入门笔记二基础

1.创建工作空间

1.什么是工作空间

工作空间(workspace)是一个存放工作开发相关文件的文件夹

  1. src:代码空间(Source Space)
  2. build:编译空间(Build Space)
  3. devel:开发空间(Development Space)
  4. install:安装空间(Install Space)

2.创建工作空间

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

创建ROS 工作空间时出现:

程序“catkin_init_workspace”尚未安装,程序“catkin_make”尚未安装。

解决方法:

source /opt/ros/kinetic/setup.bash

3.编译工作空间

  cd ~/catkin_ws/
  catkin_make

4.设置环境变量

  source devel/setup.bash

5.检查环境变量

  echo $ROS_PACKAGE_PATH

6.创建功能包

  cd ~/catkin_ws/src
  catkin_create_pkg learning_communication std_msgs rospy roscpp

7.编译功能包

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

注意:同一个工作空间下,不允许存在同名功能包;不同工作空间下,允许存在同名功能包。

ROS工作空间的Overlaying机制,即工作空间的覆盖

env | grep ros 查看ROS相关的环境变量

  • 1).工作空间的路径依次在ROS_PACKAGE_PATH环境变量中记录
  • 2).新设置的路径在ROS_PACKAGE_PATH中会自动放置在最前端
  • 3).运行时,ROS会优先查找最前端的工作空间中是否存在指定的功能包
  • 4).如果不存在,就顺序向后查找其他工作空间

~#rospack find roscpp_tutorials

系统路径下的功能包

catkin_ws# rospack find roscpp_tutorials

工作空间下的功能包

2.ROS通信编程

1.话题编程

话题编程流程

  • 创建发布者
  • 创建订阅者
  • 添加编译选项
  • 运行可执行程序

ROS通信编程---话题编程

1. 如何实现一个发布者

  • 初始化ROS节点
  • 向ROS Master注册节点信息,包括发布的话题名和话题中的现象类型
  • 按照一定频率循环发布信息

2.如何实现一个订阅者

  • 初始化ROS节点
  • 订阅需要的话题
  • 循环等待话题消息,接收到消息后进入回调函数
  • 在回调函数中完成消息处理

3.如何编译代码

  • 设置需要编译的代码和生成的可执行文件
  • 设置链接库
  • 设置依赖

CMakeLists.txt

	add_executable(talker src/talker.cpp)
	target_link_libraries(talker ${catkin_LIBRARIES})
	#add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp)
 
	add_executable(listener src/listener.cpp)
	target_link_libraries(listener ${catkin_LIBRARIES})
	#add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp)
 

4.运行可执行文件

	rosrun learning_communication talker
	rosrun learning_communication listener
 

如何定义话题

1).定义msg文件

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

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

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

3).在CMakeLists.txt添加编译选项

	a.find_package(...... message_generation)
	b.catkin_package(CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs message_runtime)
	c.add_message_file(FILES Person.msg)
	generate_messages(DEPENDENCIES std_msgs)

部分ROS版本中exec_depend需要改成run_depend

编译 catkin_make

查看自定义的消息

	rosmsg show Person

2服务编程

服务编程流程:

  • 1).创建服务器
  • 2).创建客户端
  • 3).添加编译选项
  • 4).运行可执行程序

如何自定义服务请求与应答

1).定义srv文件 AddTwoInts.srv

		   int64 a 
		   int64 b 
		   ---
		   int64 sum 

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

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

3).在CMakeLists.txt添加编译选项

	a.find_package(...... message_generation)
	b.catkin_package(CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs message_runtime)
	c.add_service_file(FILES AddTwoInts.srv)

部分ROS版本中exec_depend需要改成run_depend

ROS通信编程---服务编程

1.如何实现一个服务器

  • 1).初始化ROS节点
  • 2).创建Server实例
  • 3).循环等待服务请求,进入回调函数
  • 4).在回调函数中完成服务功能的处理,并反馈应答数据

2.如何实现一个客户端

  • 1).初始化ROS节点
  • 2).创建一个Client实例
  • 3).发布服务请求数据
  • 4).等待Server处理之后的应答结果

3.如何编译代码

  • 1).设置需要编译的代码和生成的可执行文件
  • 2).设置链接库
  • 3).设置依赖
			CMakeLists.txt 
			add_executable(server src/server.cpp)
			target_link_libraries(server ${catkin_LIBRARIES})
			add_dependencies(server ${PROJECT_NAME}_gencpp)
 
			add_executable(client src/client.cpp)
			target_link_libraries(client ${catkin_LIBRARIES})
			add_dependencies(client ${PROJECT_NAME}_gencpp)
 

4.如何运行可执行文件

1).Server节点启动后的日志信息

		rosrun learning_communication server 

2).Client启动后发布服务请求,并成功接收到反馈结果

		rosrun learning_communication client 3 5 

3).Server接收到服务调用后完成加法求解,并将结果反馈给Client

		rosrun learning_communication server 

3动作编程

1.什么是动作编程

  • 1).一种问答通信机制
  • 2).带有连续反馈
  • 3).可以在任务过程中止运行
  • 4).基于ROS的消息机制实现

2.Action的接口

  • 1).goal:发布任务目标
  • 2).cancel:请求取消任务
  • 3).status:通知客户端当前的状态
  • 4).feedback:周期反馈任务运行的监控数据
  • 5).result:向客户端发送任务的执行结果,只发布一次

3.如何自定义动作消息

1).定义action文件

		 DoDishes.action 
		  #定义目标信息
		  uint32 dishwasher_id
		  #Specify which dishwasher we want to use
		  ---
		  #定义结果信息
		  uint32 total_dishes_cleaned
		  ---
		  #定义周期反馈的消息
		  float32 percent_complete

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

			 <build_depend>actionlib</build_depend>
			 <build_depend>actionlib_msgs</build_depend>
			 <exec_depend>actionlib</exec_depend>
			 <exec_depend>actionlib_msgs</exec_depend>

3).在CMakeLists.txt添加编译选项

			 a.find_package(catkin REQUIRED actionlib_msgs actionlib)
			 b.add_action_file(DIRECTPRY action FILES DoDishes.action)
			 c.generate_messages(DEPENDENCIES actionlib_msgs)

部分ROS版本中exec_depend需要改成run_depend

4.如何实现一个动作服务器

  • 1).初始化ROS节点
  • 2).创建动作服务器实例
  • 3).启动服务器,等待动作请求
  • 4).在回调函数中完成动作服务功能的处理,并反馈进度信息
  • 5).动作完成,发送结信息

5.如何实现一个动作客户端

  • 1).初始化ROS节点
  • 2).创建动作客户端实例
  • 3).连接动作服务端
  • 4).发送动作目标
  • 5).根据不同类型的服务端反馈处理回调函数。

6.如何编译代码

  • 1).设置需要编译的代码和生成的可执行文件
  • 2).设置链接库
  • 3).设置依赖

CMakeLists.txt

			add_executable(DoDishes_client src/DoDishes_client.cpp)
			target_link_libraries(DoDishes_client ${catkin_LIBRARIES})
			add_dependencies(DoDishes_client ${PROJECT_NAME}_EXPORTED_TARGETS)
			add_executable(DoDishes_server src/DoDishes_server.cpp)
			target_link_libraries(DoDishes_server ${catkin_LIBRARIES})
			add_dependencies(DoDishes_server ${PROJECT_NAME}_EXPORTED_TARGETS)

7.运行可执行文件

rosrun learning_communication DoDishes_client
rosrun learning_communication DoDishes_server

3.实现分布式通信

ROS是一种分布式软件框架,节点之间通过松耦合的方式进行组合

1.如何实现分布式多机通信

  • 1).设置IP地址,确保底层链路的联通
  • 2).在从机端设置ROS_MASTER_URI,让从机找到ROS Master
		$export ROS_MASTER_URI=http://pc:11311 (当前终端有效)
		或
		$echo "export ROS_MASTER_URI=http://pc:11311">>~/.bzshrc (所有终端有效)

主机端启动ROS Master与海龟仿真节点

roscore
rosrun turtlesim turtlesim_node

从机端发布一个速度控制消息

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

4.ROS中的关键组件

1).Launch文件

Launch文件:通过XML文件实现多节点的配置和启动(可自动启动ROS Master)

<launch> launch文件中的根元素采用<launch>标签定义

<node> 启动节点

<node pkg="package-name" type="executable-name" name="node-name"/>
  • 1).pkg:节点所在的功能包名称
  • 2).type:节点的可执行文件名称
  • 3).name:节点运行时的名称
  • 4).output、respawn、required、ns、args

参数设置

		<param>/<rosparam>

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

<param name="output_frame" value="odom"/>

name:参数名 value:参数值

加载参数文件中的多个参数

<rosparam file="param.yaml" command="load" ns="params"/>
<arg>

launch文件内部的局部变量,仅限于launch文件使用

<arg name="" default="arg-value"/>

name:参数名 value:参数值

调用

<param name="foo" value="$(arg arg-name)" />
<node name="node" pkg="package" type="type" args="$(arg arg-name)" />

重映射<remap>

重映射ROS计算图资源的命名

	<remap from="/turtlebot/cmd_vel" to="/cmd_vel" />

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

嵌套<include>

包含其他launch文件,类似C语言中的头文件包含

	<include file="$(dirname)/other.launch">

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

2).TF坐标变换

机器人中的坐标变换

TF功能包能干什么

  • 1).五秒钟之前,机器人头部坐标系相对于全局坐标系的关系是什么样的?
  • 2).机器人夹取的物体相对于机器人中心坐标系的位置在哪里?
  • 3).机器人中心坐标系相对于全局坐标系的位置在哪里?

TF坐标变换如何实现?

  • 1).广播TF变换
  • 2).监听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

命令行工具

	rosrun tf tf_echo turtle1 turtle2	

可视化工具

	rosrun rviz rviz -d `rospack find turtle` /rviz/turtle_rviz.rviz

如何实现一个TF广播器

  • 1).定义TF广播器(TransformBroadcaster)
  • 2).创建坐标变换值
  • 3).发布坐标变换(sendTransform)

如何实现一个TF监听器

  • 1).定义TF监听器(TransformListener)
  • 2).查找坐标变换(waitForTransform、lookupTransform)

3).Qt工具箱

  • 日志输出工具---rqt_console
  • 计算图可视化工具---rqt_graph
  • 数据绘图工具---rqt_plot
  • 参数动态配置工具---rqt_reconfigure

4).Rviz可视化平台

机器人模型、坐标、运动规划、导航、点云、图像、SLAM

Rviz是一款三维可视化工具,可以很好的兼容基于ROS软件框架的机器人平台

  • a.在rviz中,可以使用XML对机器人、周围物体等任何实物进行尺寸、质量、位置、材质、关节等属性的描述,并且在界面中呈现出来。
  • b.同时,rviz还可以通过图形化的方式,实时显示机器人传感器的信息、机器人的运动状态、周围环境的变化等信息
  • c.总而言之,rviz通过机器人模型参数、机器人发布的传感信息等数据,为用户进行所有可监测信息的图形化显示。用户和开发者也可以在rviz的控制界面下,通过按钮、滑动条、数值等方式,控制机器人的行为

rviz界面包括 3D视图区、工具栏、显示项列表、视角设置区、时间显示区

rviz插件机制

5).Gazebo物理仿真环境

Features:Dynamics Simulation、Advanced 3D Graphics、Sensors and Noise、Plugins、Robot Models、TCP/IP Transport、Cloud Simulation、

Command Line Tools.

0:3D视图区 1:工具栏 2:模型列表 3:模型属性项 4:时间显示区

Gazebo是一款功能强大的三维物理仿真平台

  • a.具备强大的物理引擎
  • b.高质量的图形渲染
  • c.方便的编程与图形接口
  • d.开源免费

其典型应用场景包括:

  • a.测试机器人算法
  • b.机器人的设计
  • c.显示情景下的回溯测试

  • gazebo_ros:主要用于gazebo接口封装、gazebo服务端和客户端的启动、URDF模型生成等
  • gazebo_msgs:是gazebo的Msg和Srv数据结构
  • gazebo_plugins:用于gazebo的通用传感器插件
  • gazebo_ros_api_plugin和gazebo_ros_path_plugin:这两个gazebo的插件实现接口封装

如何使用Gazebo进行仿真

  • 1).创建仿真环境
  • 2).配置机器人模型
  • 3).开始仿真

总结