ros机器人¶
1. ros软件说明¶
rosbuild不建议使用了, 推荐使用catkin, 来组织和构建代码每次新terminal时 ,需要执行 /opt/ros/noetic/setup.bash, 全放在~/.bashrc中
rosdep install [package] 用来安装指定包的所有系统依赖项
2. 一些注意事项¶
自己添加一个catkin工作空间,my_catkin_ws, 进入其中,执行一下catkin_make, 把生成的 devel/setup.bash 也添加到 ~/.bashrc 中, 这样每次启动terminal就可以使用ros环境及命令找到 my_catkin_ws下的包信息
3. ros空间创建¶
创建一个目录(ros空间) ,这个目录下一定要用一个src目录(代码空间)
mkdir -p /[dir]/my_catkin_ws/src
空间的初始化工作
cd my_catkin_ws
catkin_make
目录结构说明
my_catkin_ws/
.catkin_workspace # ros空间说明文件
src/ # 代码空间目录
CMakeLists.txt # toplevel CMake file, provided by catkin
package_1/
CMakeLists.txt # 内部配置了catkin
package.xml # 需要和catkin兼容
...
package_n/
CMakeLists.txt # 内部配置了catkin
package.xml # 需要和catkin兼容
build/ # 代码构建目录
devel/ # 一些环境配置,source其中的setup.sh, 会将此工作区覆盖在您的环境之上
设置工作区环境
source devel/setup.sh
printenv|grep ROS
# ROS_PACKAGE_PATH: /data/robot/my_catkin_ws/src
# ROSLISP_PACKAGE_DIRECTORIES: /data/robot/my_catkin_ws/devel/share/common-lisp
4. ros文件系统¶
roscd rosls and rospack 命令工具的使用
rospack的使用
rospack find [package_name]
# /opt/ros/noetic/share/roscpp
rospack find roscpp
roscd的使用
roscd <package-or-stack> [/subdir]
# 直接进入 roscpp目录
roscd roscpp
rosls的使用
rosls <package-or-stack> [/subdir]
# 扫描roscpp下的所有文件
rosls roscpp
# 扫描roscpp/cmake下的所有文件
rosls roscpp/cmake
5. 创建一个ros package¶
在 ros空间下的 执行创建命令,并构建与配置生效
catkin_create_pkg [package_name] [deps...]
cd my_catkin_ws/src
catkin_create_pkg beginer_tutorials std_msgs rospy roscpp
cd ../
catkin_make
sh devel/setup.bash
依赖关系的查看
# 直接依赖
rospack depends1 beginer_tutorials
# 间接依赖
rospack depends1 rospy
# 循环所有依赖
rospack depends beginer_tutorials
在 my_catkin_ws 目录下 执行
catkin_make,进行基本构建
6. ROS GRAPH¶
Graph中的对象 node,topic, service, parameter
MASTER¶
Name service for ROS (i.e. helps nodes find each other)
rosout¶
ROS equivalent of stdout/stderr
roscore¶
Master + rosout + parameter server (parameter server will be introduced later)
NODE¶
是一个ros package中的可执行文件 ,使用ROS client lib与其它Nodes通信. 可以订阅和发布topic, 也能提供或使用一个service
ros client lib: rospy[python client lib], roscpp[cpp client lib]
roscorerosnoderosrun工具的使用
# 启动一个ros核心,master (provides name service for ROS),
# 并且会自动启动一个 rosout node
roscore
# 运行指定ros package中的node
rosrun [package_name] [node_name] <__name:=node重命名>
rosrun turtlesim turtlesim_node
# 查看当前正在使用的node列表
rosnode list
# 查看指定node的信息
rosnode info rosout
# 指定节点是否在线
rosnode ping rosout
# 清理不存在的node
rosnode cleanup
TOPIC¶
ROS topics: 可以让多个节点用 发布订阅模式互相发送接收消息,以达到通信的目的
rostopic命令及rqt_plot工具的使用
roscore
# 启动两个node
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
# 启动rqt_graph 可以绘制node间的通信关系
rosrun rqt_graph rqt_graph
# rostopic可以控制及展示topic方式
# 展示所有topics
rostopic list -v
# 打印topic的消息
rostopic echo [topic]
# 查看topic type
rostopic type [topic_or_field]
# rostopic中的 type 的明细
rosmsg show [msg_type]
# 发送消息
rostopic pub [option] [topic] [msg_type] [args]
# 可以查看topic按指定频率发送数据时的 实时图表信息流
rosrun rqt_plot rqt_plot
Service and Parameters¶
service是另一种node间通信方式,允许node发送一个请求或接收一个响应
parameters 参数服务,在ROS parameter server上可以存储和操作数据
rosservice,rosparam命令的使用
# 可以查看node: turtlesim中的 service 信息
rosnode info turtlesim
# 通过service轻松连接到ROS客户端/服务框架
# 查看在线的所有的service
rosservice list
# 查看在线的服务类型
rosservice type [service_name]
# 查看所有包中的服务
rossrv list
# 查看服务的明细信息
rossrv show [type_name]
# 调用服务
rosservice call [service_name]
# 可以读取、保存、删除数据
# 查看所有数据
rosparam list
# 数据修改完后,可以使用service来更新变化
rosparam set [param_name] [param_value]
rosparam get [param_name]
# 展示所有数据信息
rosparam get /
# 将数据保存到文件
rosparam dump [filename] [namespace]
rosparam load [filename] [namespace]
7. roslaunch、rosed的使用¶
# 用来调度日志的
rosrun rqt_console rqt_console
rosrun rqt_logger_level rqt_logger_level
# roslaunch 可批量启动多个node, 需要配置xx.launch文件
roslaunch [package] [filename.launch]
# rosed 可以用来编辑package中的文件 ,而不用进入包目录下
# The default editor for rosed is vim
# export EDITOR='nano -w' 来修改默认编辑器
rosed [package] [filename]
8. 创建msg和srv¶
msg: 一个msg文件描述了ros msg的fields, 它们是用来生成消息的源代码, 存放在package下的msg目录下
srv: 一个srv文件描述了一个service, 由requeste和response组成, 存放在package下的srv目录下
创建文件后, 需要在package.xml中配置好转换源码, 需要配置CMakeLists.txt package.xml: message_generation[build] message_runtime[exec] CMakeLists.txt: message_generation(){} find_package(message_generation) add_msg add_srv
msg file 中每行由 field_type + 空格 + field_name组成
field_type 有以下值:
int8, int16, int32, int64 (plus uint*)
float32, float64
string
time, duration
other msg files
variable-length array[] and fixed-length array[C]
Header: contains a timestamp and coordinate frame information that are commonly used in ROS.
例如:
Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
srv file 与 msg file类似,但是有两部分组成, resquest 和 response 使用 "--" 分隔,
例如:
int64 A
int64 B
--
int64 Sum
# 使用复制
roscp [package] [file] [copy_path]
9. 编写pub/sub程序、service程序¶
pub sub来了解topic消息传递, 不同node间如何发送/接收消息
service 来了解 其它node如何与 这个node的service 交互的
例子创建了 4个node
1. talker node 通过 chatter topic 发送消息
2. listener node 通过 chatter topic 来获取消息
2. add_two_ints_server node 里创建了一个 add_two_ints service
3. add_two_ints_client node 连接 add_two_ints service, 并调用获取结果
10. 记录ros支行中的数据,后续可以回溯¶
使用
rosbag来记录行为,并统计行为信息
# 操作其它node时 会在当前生成一个bag文件,
rosbag [options] [topic ...]
rosbag record -a
rosbag record ---node [node_name] -e '*cmd_vel' -O [bag_name]/-o [bag_name_prefix]
# 统计bag文件信息
rosbag info [bag_file]
# 重新执行bag中的行为
rosbag play [bag_file]
从bag文件中读取消息
# 可以直接读取到bag中的消息
rostopic echo -b [bag_file] [topic]
11. roswtf工具的使用¶
使用
roswtf可以检查package相关的问题
12. roslaunch细节使用¶
配置launch文件,来组织多个node的启动