ros学习

一 ros基础操作

roboware-studio命令打开ros的ide,方便操作

1.海龟控制

roscore 打开ros
rosrun turtlesim turtlesim_node 打开乌龟
rosrun turtlesim turtle_teleop_key 打开键盘控制界面
rqt_graph 查看节点图
rosnode 查看节点
rosnode list 列出节点
rosnode info /turtlesim 查看某个节点到具体信息
rostopic list 打印话题列表

rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twt "linear: x: 2.0 y: 1.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 2.0"
-r 10 是循环 上面到命令可以用来控制海龟 turtle1是海龟名

rosservice call /spawn "x: 0.0 y: 2.0 theta: 0.0 name: 'sss'"
产生新海龟,海龟名字为sss

rosbag record -a -0 cmd_record 保存路径到文件cmd_record
rosbag play cmd_record.bag 重现文件的内容

2.程序文件控制海龟

工作空间是一个存放工程开发相关文件的文件夹:
src:代码空间
build:编译空间
devel:开发空间
install:安装空间

创建工作空间:
mkdir -p~/catkin_ws/src //catkin_ws/src为文件路径
cd~/catkin_ws/src //意思是在该路径下执行下面那句话
catkin_init_workspace
编译工作空间:
cd~/catkin_ws/ //意思是在该路径下执行下面那句话
catkin_make
catkin_make install //生成install文件

引入功能包: //在新建的src文件下面执行
catkin_create_pkg test_pkg roscpp rospy std_mags //test_pkg是要引入的功能包,后面是以来到语言

设置环境变量: // 在catkin_ws文件下面执行
source devel/setup.bash 或者 source ~/catkin_ws/devel/setup.bash
检查环境变量:
echo $ROS_PACKAGE_PATH

二 话题

1.发布者Publisher

用于发布信息,通过Topic,传输给订阅者Subscriber,来控制海龟运动。

在/catkin_ws/src文件目录下执行:

catkin_create_pkg 文件名 rospy std_msgs geometry_msgs turtlesim //在要上面创建到src文件中,输入该指令,建立功能包。

上面rospy是在python文件时用的,写c++文件时用roscpp

然后在**/catkin_ws/src/文件名/scr路径**下建立cpp文件,写代码。

创建的功能包的CMakeLists.txt文件修改信息,加入两句话:

add_executable(velocity_publisher src/velocity_publisher.cpp) //代码编译

target_link_libraries(velocity_publisher ${catkin_LIBRARIES})//代码做链接

其中的 velocity_publisher是cpp的文件名,当有多个cpp文件要编译时,就要多复制几遍,但是文件名要修改。

回到工作空间到根目录下:即catkin_ws

执行:

catkin_make

source devel/setup.bash //设置环境变量

打开新终端执行:

roscore //这三句话开三个终端执行/home/mol/study/ros_learn/catkin_ws/src

再打开新终端执行:

rosrun turtlesim turtlesim_node

在设置环境变量的终端中执行:

rosrun learning_topic velocity_publisher

2.订阅者subscriber

同上面过程一样,只不过要更换cpp代码。

因为不知道什么时候会有数据进来,所以设置回调函数,一有消息进来就立即调用函数。(类似中断)

回调函数要完成消息处理,不要嵌套,要高效进行。

写完cpp文件后,要更改CMakeLists文件。

3.自定义话题消息的数据类型

定义msg文件为Person.msg,内容为:(在功能包中(/catkin_ws/src/文件名 路径下)创建smg文件夹,将Person.msg存在该文件夹中)

包含的变量:

string name uint8 sex uint8 age

宏定义:

uint8 unknown = 0 uint8 male = 1 uint8 female = 2

在package.xml文件中添加功能包依赖:(放最下面)

message_generation
message_runtime

在CMakeLists.txt添加编译选项
• find_package( … message_generation)

• add_message_files(FILES Person.msg)

generate_messages(DEPENDENCIES std_msgs)

• catkin_package(… message_runtime)

在catkin_ws下执行:catkin_make

编写cpp文件:person_publisher.cpp和person_subscriber.cpp

将下面代码写入CMakeLists文件中:(因为代码中的一些程序是要关联一些自动生成的文件,所以多了一句:add_dependencies)

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

错误:自己改写代码时,定义了string变量,但是ROS_INFO用%s输出乱码,需要将变量进行.c_str(),即:

ROS_INFO("sex:%s", sex); 改为: ROS_INFO("sex:%s", sex.c_str());

**发布者与订阅者要分别写在两个cpp文件中,要使两者关联,就使订阅名与发布名相同。**在一个文件中订阅者不会收到信息,因为他需要循环等待信息到来,而同时发布者又在不断发送信息,所以不可以写在同一文件中。

三 服务

1.Client客户端

Client会发布请求Request给Server端,Server端收到请求并进行执行,返回一个Response。

例子:参生新的海龟,自己写Client代码,Server是海龟节点turtlesim,发送的Request信息格式是turtlesim::Spawn

产生功能包:

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

在CMakeLists.txt文件中加入:

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

如果是写py代码,就不需要在CMakeLists.txt文件添加东西,直接在终端执行以上程序就可以。

2.Server服务端

例子:客户端相当于控制海龟的运动和停止,信息数据类型为:std_srvs:Trigger,该数据类型的Request为空,Response有两个值。终端输入:rossrv show std_srvs/Trigger得到:

---

bool success
string message

其中---是分割线,上面是Request的数据信息,为空,下面是Response的数据信息,有两个值,设置回调函数时要注意Response内容写对。

可以通过rossrv list来查看所有的srv的数据类型,就是服务或者话题之间消息传输所用的类型。

代码中需要创建Publisher,用于控制海龟运动还是停止,Server接受信息后通过Publisher控制海龟。(python代码需要多线程)

在CMakeLists.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 "{}"

最后一句是启动Client,输入Request数据为空,即"{}"。其中call和后面的/turtle… 是有空格的。/turtle_command是代码中自己定义的服务名称。

3.自定义服务数据类型

定义srv文件,建立文件夹./learning_service/srv,然后在该文件夹中建立Person.src文件,写入:

string name uint8 age uint8 sex

uint8 unknown =0 uint8 male= 1

uint8 female = 2`

---

string result

其中---是分割Request和Response的。

然后在package.xml中添加功能包依赖:
message_generation
message_runtime

在CMakeLists.txt添加编译选项
• find_package( … message_generation)
• add_service_files(FILES Person.srv)
generate_messages(DEPENDENCIES std_msgs)
• catkin_package(… message_runtime)

然后写cpp文件,在CMakeLists.txt添加:

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

1. 参数的使用与编程方法

ROS Master中有一个参数服务器Parameter Server,是一个全局字典,保存每个节点中的配置参数,这些参数每个节点都可以访问。

介绍一些命令行的使用(rosparam)

⚫ 列出当前多有参数
$ rosparam list
⚫ 显示某个参数值
$ rosparam get param_key
⚫ 设置某个参数值
$ rosparam set param_key param_value
⚫ 保存参数到文件,默认路径是主文件夹路径,就是/home/mol/下,也可以:/home/mol/study/ros_learn/param.yaml
$ rosparam dump file_name
⚫ 从文件读取参数,file_name是文件路径
$ rosparam load file_name
⚫ 删除参数
$ rosparam delete param_key

可以利用海龟测试上面命令行,roscore然后rosrun turtlesim turtlesim_node,然后再打开一个终端就可以测试上面命令行。

当数据比较多时,使用YAML文件来储存数据。

写parameter_config.cpp文件,CMakeLists.txt中加入

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

2. ROS中的坐标系管理系统

机器人的坐标系变换:
P A = T B A ∗ P B P^A=T^A_B*P^B PA=TBAPB
ros中的 TF 功能包:可以管理所有的坐标系,保存10秒内所有坐标系的位置信息,能够获取各个坐标系之间的转换关系。

TF 坐标变换如何实现:广播 TF 变换; 监听 TF 变换。

用海龟案例测试:

$ sudo apt-get install ros-kinetic-turtle-tf 安装功能包
$ roslaunch turtle_tf turtle_tf_demo.launch 启动一个launch文件,该文件是一个脚本,可以一次性提供很多节点
$ rosrun turtlesim turtle_teleop_key 打开按键控制
$ rosrun tf view_frames 可视化系统中 tf 的关系,生成一个PDF文件,存在根目录/home/mol/下

在执行第二和四步的时候会出现错误:ImportError: dynamic module does not define module export function (PyInit__tf2),是因为python版本问题导致的,可以通过退出base环境来解决:conda deactivate,然后再执行第二步。

也可以通过rosrun tf tf_echo turtle1 turtle2,查看坐标系turtle1和坐标系turtle2的变换关系:

Translation: [0.203, -0.123, 0.000]

Rotation: in Quaternion [0.000, 0.000, 0.963, 0.269] in RPY (radian) [0.000, -0.000, 2.596] in RPY (degree) [0.000, -0.000, 148.745]

Translation是表示平移量,Rotation表示旋转角:Quaternion四元素描述; radian弧度描述; degree角度描述。

也可以通过可视化工具:rosrun rviz rviz -drospack find turtle_tf/rviz/turtle_rviz.rviz

打开后在左下角 add 按键添加 TF ,选world坐标系。

3. tf坐标系广播与监听

创建功能包:

$ cd ~/catkin_ws/src
$ catkin_create_pkg learning_tf roscpp rospy tf turtlesim

编写代码文件:turtle_tf_broadcaster.cpp和turtle_tf_listener.cpp

turtle_tf_broadcaster.cpp是实现 tf 的广播功能,获取海龟相对于世界坐标系的位置,然后储存。

turtle_tf_listener.cpp是实现 tf 的监听功能,通过上面代码获取的海龟位置来得到两个海龟间的相对位置,并用 Publisher 实现海龟2向海龟1靠近。

配置CMakeLists.txt中的编译规则

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})

$ 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

__name:=turtle1_tf_broadcaster是重映射机制,因为代码中已经有了节点名字,但是这个代码要运行两次,同名的节点不允许出现,所以这里将节点重命名。

4. launch启动文件的使用方法

launch文件可以实现多个节点之间的配置和启动,可以自动启动ros-master

launch 文件中的根元素采用标签定义: 内容

启动节点:

  • pkg:节点所在的功能包名称
  • type:节点的可执行文件名称
  • name:节点运行时的名称,这里可以和代码中的不同,可以自己随意命名,节点名有重映射机制
  • output 、respawn 、required 、ns 、args

output是控制节点是否要输出显示信息;respawn是控制节点挂掉是否要重启;required是控制节点是否是一定要启动的,ns是命名空间,给每个节点设置命名空间,避免命名冲突;args是给节点输入参数。

参数设置

设置ROS系统运行中的参数,存储一个参数到参数服务器中:


• name:参数名
• value:参数值
加载参数文件中的多个参数:

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

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

重映射

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


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

嵌套

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


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

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

创建功能包:catkin_create_pkg learning_launch 不需要添加依赖

进入功能包路径,创建文件夹launch

$ cd ~/catkin_ws
$ catkin_make

$ roslaunch learning_launch simple.launch

代码中turtlesim_parameter_config.launch文件中,放在节点里面和外面是不一样的,通过rosparam 查看节点可以看到,在节点内加入的参数带有/turtlesim_node,节点外的则没有。

c++和py代码在launch中设置节点是不一样的,因为py没有可执行文件,详细的看:start_tf_demo_c++.launch和start_tf_demo_py.launch

五 可视化工具

QT

roscore

rosrun turtlesim turtlesim_node

rqt_ 加 Tab键可以看到 ros 中 qt 工具箱的工具:

rqt_bag rqt_dep rqt_image_view rqt_plot rqt_console rqt_graph rqt_logger_level rqt_shell

  • 其中的rqt_console 是显示系统的日志信息,比如警告等。

  • rqt_plot (电脑有误,无法打开),

  • rqt_image_view:显示摄像头图片

非常综合的工具:rqt,他综合了rqt相关工具的结合,rqt_plot可以通过plugins->visualization->plot打开,它可以打开各种检测窗口。

Rviz

机器人开发过程中的数据可视化界面,显示数据,必须要先有数据,所以加入的要链接数据获取的话题。其他看ppt或网上搜索。

roscore

rosrun rviz rviz

Gazebo

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

roslaunch gazebo_ros willowgarage_world.launch

你可能感兴趣的:(ros,自动驾驶)