ros学习

ros在使用之前要先输入roscore命令,然后在新打开的终端里进行相关操作

ros工作空间的创建
 mkdir -p ~/ros_workspace/src

 cd ~/ros_workspace/src catkin_init_workspace
 cd ..

 catkin_make source ./devel/setup.bash
 
ros功能包的创建(创建功能包hello)
 cd ~/ros_workspace/src

 catkin_create_pkg hello std_mags rospy roscpp cd ..
 catkin_make
 source ./devel/setup.bash //也可以是 . devel/setup.bash

ros工作空间覆盖问题

新创建的工作空间路径在ROS_PACKAGE_PATH中会放到最前面

不同空间中的同名功能包,ROS_PACKAGE_PATH前面的会覆盖后面的

ros的文件系统工具(以功能包roscpp为例)

rospack find roscpp //查找功能包所在路径

 roscd roscpp //切换到功能包目录 rosls roscpp //显示功能包目录
 roscd log //切换到日志文件目录
 roscd和rosls具有命令补全功能
 rospack depends1 roscpp //查找功能包的直接依赖项
 rospack depends roscpp //查找功能包的所有依赖项
 
ros节点(以turtlesim功能包,及其中的turtlesim_node节点为例)
 rosnode list //列出正在运行的节点(e.g./turtlesim)
 rosnode info /rosout //列出节点信息
 rosrun turtlesim turtlesim_node //运行tuetlesim_node节点
 rosrun turtlesim turtlesim_node __name:my_turtle //改变节点名字
 rqt_graph //绘制节点关系图
 
ros话题
 rostopic bw //显示话题带宽 rostopic echo [topic_name] // 在屏幕上显示话题信息
 rostopic list //打印激活话题的信息
 //默认列出所有话题订阅者和发布者
 -v //列出详细信息
 -p //列出发布者
 -s //列出订阅者 rostopic type [topic_name] //打印话题的消息类型
 //可以用rostopic type [topic_name] | rosmsg show 来查询类型详细信息 rostopic pub //向话题发布数据
 //习惯用法:rostopic pub [topic] [msg_type] [args]
 rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
 rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'


-1:发布一次消息,然后退出
-r 1:设定消息的发布频率
-1和-r 1只能出现一个
后面的参数遵循YAML的语法

rostopic hz [topic_name] //显示话题的发布频率
 rqt_plot //画出发布在话题上的数据,随时间的变化图

 

ros服务和ros参数

rosservice list //列出所有激活状态的服务 rosservice type [service_name] //显示服务的类型
 rosservice type [service_name] | rossrv show //显示服务类型的具体信息
 rosservice call [service_name] ([parameters]) //调用服务
 rosparam list //列出所有激活状态的参数
 rosparam get [parameter_name] //获取参数值
 rosparam get / //获取所有的参数值
 rosparam set [parameter_name] [parameter_vaule] //设置参数值
 rosparam dump [***.yaml] ([namespace]) //把参数写到.yaml文件里

 rosparam load [***.yaml] [namespace] //把.yaml文件加载到新的命名空间里

 

ros调试

rqt_console //显示节点的输出信息
 rqt_logger_level //更改激活状态节点的日志信息级别

日志级别(按重要性排序):Fatal/Error/Warn/Info/Debug
通过设定级别,可以获得相应级别和更高级别的信息

roslaunch [package_name] [***.launch] //启动.launch文件
ros文件编辑
 export EDITOR='gedit -w' //设定以何种编辑器打开文件,当前终端有效,默认使用vim
 rosed [package_name] [file_name] //直接编辑文件,无需cd到指定路径
 rosed [package_name] <Tab> <Tab> //显示功能包中的可编辑文件


ros msg和srv文件创建(以hello功能包为例)

msg文件:自定义与语言无关的消息类型,位于msg文件夹,描述ros消息字段
srv文件:自定义服务数据,位于srv文件夹,描述服务,包括请求和应答两个部分

roscd hello
 mkdir msg
 echo "int64 num" > msg/Num.msg
 <build_depend>message_generation</build_depend>
 <exec_depend>message_runtime</exec_depend> find_package(catkin REQUIRED COMPONENTS
 roscpp
 rospy
 std_msgs
 message_generation
 ) catkin_package(
 ...
 CATKIN_DEPEND message_runtime ...
 ...) add_message_files(
 FILES
 Num.msg
 ) generate_messages(
 DEPENDENCIES
 std_msgs
 )  rosmsg show [message_type] //确认ros可以看到这个消息
 rosmsg show hello/Num roscd hello
 mkdir srv
 roscp [ros_package] ***.srv srv/***.srv
 add_service_files(
 FILES
 ***.srv
 ) rossrv show [service_type] //确认ros可以看到这个服务
 rossrv show hello/*** cd ~/catkin_ws
 catkin_make install //重新编译

用C++写一个简单的publisher和subscriber

src/talker.cpp src/listener.cpp
 cmake_minimum_required(VERSION 2.8.3)
 project(hello)

 ## Find catkin and any catkin packages
 find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation)

 ## Declare ROS messages and services
 add_message_files(FILES Num.msg)
 add_service_files(FILES ***.srv)

 ## Generate added messages and services
 generate_messages(DEPENDENCIES std_msgs)

 ## Declare a catkin package
 catkin_package()

 ## Build talker and listener
 include_directories(include ${catkin_INCLUDE_DIRS})

 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(listener ${PROJECT_NAME}_generate_messages_cpp) 
 cd ~/catkin_ws

 catkin_make source ./devel/setup.bash

 roscore rosrun hello talker
 rosrun hello listener

 

用C++写一个简单的Service和Client

hello/src/server.cpp hello/src/client.cpp
 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)

 

ros的分布式多机通讯

<1>查询两台机器的IP地址,确保他们处于同一个网络当中
 <2>分别在两个机器中的/etc/hosts文件中加入对方的IP地址和机器名字
 <3>在从机中设置ROS_MASTER_URI
 export ROS_MASTER_URI=http://lihan:11311 //当前终端有效
 echo "export ROS_MASTER_URI=http://lihan:11311" >> ~/.bzshrc //所有终端有效rosbag数据记录与回放
 mkdir ~/bag_files

 cd ~/bag_files rosbag record -a //开始记录ros信息,-a(all)指记录所有的信息
 //在数据运行的终端上,按下“ctrl+c”终止数据记录 rosbag info [***.bag] //记录的ros信息简介
 rosbag paly [***.bag] //回放.bag文件中记录的ros信息