ardupilot开发 --- ROS 篇

0. 前言

关于ROS/ROS2;

1. ROS/ROS2

1.1 概念碎片

  • LTS:long term support ,一般指长期支持的版本;
  • LTS 版本意味着更稳定,Latest 版本意味着键兼更多的platforms和拥有更新更多的ROS packages;
  • 尽管已经有了LTS版本,每年还是会发布新版本;
  • ROS版本与操作系统版、工具包版本(如QT、PCL、openCV等)、软件版本等相关性很大,建议新手使用推荐的 tier 1,否者容易出现 issues;
  • tier 1:官方推荐的运行某ROS版本的指定操作系统和工具包版本:please read REP-2000;
  • 在Docker container上安装ROS:https://hub.docker.com/_/ros/
  • ROS? ROS2? ROS已被ROS2取代;
  • ROS的官方文档为 https://wiki.ros.org/
  • ROS2的官方文档为https://docs.ros.org/,注意前缀与ROS的不同!

1.2 ROS2安装

建议:如果必须用ROS2否则安装ROS;
if installing on a desktop PC, install ROS Desktop-Full, on a companion computer ROS-Base is enough。
官方教程:https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html#uninstall

1.3 ROS安装

建议安装ROS Noetic Ninjemys 版本;
if installing on a desktop PC, install ROS Desktop-Full, on a companion computer ROS-Base is enough;
建议在wsl上安装,wsl安装Ubuntu-20.04;
官方教程:https://wiki.ros.org/cn/ROS/Installation

  • 配置Ubuntu软件仓库:基本上不需要更改!可跳过此步骤直接安装ROS!
    页面配置:https://help.ubuntu.com/community/Repositories/Ubuntu
    命令行配置:https://help.ubuntu.com/community/Repositories/CommandLine
  • 安装:https://wiki.ros.org/cn/ROS/Installation
  • 使用文档:https://wiki.ros.org/
    可以切换成中文页面;

2. ROS知识点

2.1 碎片

  • 计算图(Computation Graph):是一个由ROS进程组成的点对点网络,它们能够共同处理数据。ROS的基本计算图概念有节点(Nodes)、主节点(Master)、参数服务器(Parameter Server)、消息(Messages)、服务(Services)、话题(Topics)和袋(Bags),它们都以不同的方式向图(Graph)提供数据。
  • 节点(Nodes):节点是一个可执行文件,它可以通过ROS来与其他节点进行通信。
  • 消息(Messages):订阅或发布话题时所使用的ROS数据类型。
  • 话题(Topics):节点可以将消息发布到话题,或通过订阅话题来接收消息。
  • 主节点(Master):ROS的命名服务,例如帮助节点发现彼此。
  • rosout:在ROS中相当于stdout/stderr(标准输出/标准错误)。
  • roscore:主节点 + rosout + 参数服务器(会在以后介绍)。
  • roscore是你在运行所有ROS程序前首先要运行的命令。
  • 从帮助文档中选择性观看: tutorials and demos
  • 如果你在查找和使用ROS软件包方面遇到了问题,请确保已经正确配置了环境。有个好办法可以检查,确保ROS_ROOT 和 ROS_PACKAGE_PATH这两个环境变量正确设置:$ printenv | grep ROS
    其中:
    printenv命令:打印部分或所有的环境变量
    grep命令:在 Shell 中,grep 命令是一种用于在文件中查找指定字符串的强大工具
    管道符 “ | ” :管道符是一个神奇的工具,它可以轻易地连接两个毫不相关的程序,把一个程序的结果交给另一个来处理,甚至,不停地交接处理,如 ps –ef | grep python
    如果没有的话,这个时候你就需要重新source一下了:$ source /opt/ros/noetic/setup.bash
  • 检查环境变量是否配置正确:printenv | grep ROS
    ardupilot开发 --- ROS 篇_第1张图片
    否则要手动source一下:source /opt/ros//setup.bash 如 source /opt/ros/noetic/setup.bash
  • 有用的文件系统工具(命令):
    1)软件包的所在路径:rospack find 包名 如 rospack find mavros
    2)切换目录(cd)到某个软件包或者软件包集当中:roscd 包名 如 roscd mavros
    3)rosls mavros
    4)包名或节点名,Tab补全
  • catkin文档
  • 软件包,又称catkin软件包,至少由 package.xml、CMakeLists.txt、文件夹,组成;
  • catkin_make是在标准CMake工作流程中依次调用了cmake和make
  • 使用catkin_create_pkg脚本来创建一个新的catkin软件包(暂时不包含任何可执行cpp文件,只有基本架构文件)
    参考:https://wiki.ros.org/cn/ROS/Tutorials/BuildingPackages
mkdir -p ~/ros_learn_ws/src
cd ~/ros_learn_ws/src
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
cd ~/ros_learn_ws
catkin_make
source ~/ros_learn_ws/devel/setup.bash
printenv | grep ROS

ardupilot开发 --- ROS 篇_第2张图片

  • 包依赖关系
    1)直接依赖关系:$ rospack depends1 beginner_tutorials
    或在package.xml中查看:$ roscd beginner_tutorials && cat package.xml
    2)检测出所有嵌套的依赖包:$ rospack depends beginner_tutorials
  • 简化package.xml的冗余项:https://wiki.ros.org/cn/ROS/Tutorials/CreatingPackage
  • catkin_make 是一个命令行工具,它简化了标准catkin工作流程。你可以认为catkin_make是在标准CMake工作流程中依次调用了cmake和make。
    如果你不熟悉什么是标准CMake工作流程,可以认为是以下几个步骤:
    ardupilot开发 --- ROS 篇_第3张图片
  • catkin_make的高级用法
  • 编译软件包
    编译 ros工作空间 / src 下的所有软件包:
cd ~/ros_learn_ws
catkin_make

2.2 节点(node)

  • roscore
    是你在运行所有ROS程序前首先要运行的命令。
  • rosnode
    rosnode list :列出当前运行的所有节点;
    rosnode --help
  • /rosout节点
    在ROS中相当于stdout/stderr(标准输出/标准错误)
  • rosrun
    可以让你用包名直接运行软件包内的节点(而不需要知道包的路径)。
    用法:rosrun [package_name] [node_name]
    如:rosrun turtlesim turtlesim_node
    重新分配节点名称: rosrun turtlesim turtlesim_node __name:=my_turtle

2.3 主题(Topics)

  • 主题(Topics):节点可以将消息发布到话题,或通过订阅话题来接收消息

  • 多对多通讯

  • 查看节点间的主题发布与订阅:rqt_graph 工具或 rqt
    ardupilot开发 --- ROS 篇_第4张图片

  • rostopic echo [topic]
    显示在某个话题上发布的数据

  • rostopic 空格 双击 tab 键
    查看可用选项

  • rostopic list
    列出当前已被订阅和发布的所有话题
    rostopic list [option]
    rostopic list -h/-b/-p/-s/-v

  • rostopic type
    查看某主题发布的的message类型
    rostopic type [topic]
    rostopic type /turtle1/cmd_vel

  • rosmsg show
    查看某message的详细信息
    rosmsg show [message]
    rosmsg show geometry_msgs/Twist

  • rostopic pub
    把自定义数据发布到主题上
    rostopic pub [topic] [msg_type] [args]
    rostopic pub --help
    rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist - - ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, 1.8]’
    其中,这一选项(两个破折号 – )用来告诉选项解析器,表明之后的参数都不是选项。如果参数前有破折号(-)比如负数,那么这是必需的。
    参数’[2.0, 0.0, 0.0]’ '[0.0, 0.0, 1.8]'是用YAML语法表示的,语法介绍请参考:YAML命令行文档

  • rostopic hz
    报告发布到主题数据发布的速率
    rostopic hz [topic]
    rostopic hz /turtle1/pose

  • rqt_plot
    rqt_plot命令可以在滚动时间图上显示发布到某个话题上的数据
    请参考:https://wiki.ros.org/cn/ROS/Tutorials/UnderstandingTopics

2.4 服务

  • 除了主题的发布和订阅,服务(Services)是节点之间通讯的另一种方式。服务允许节点发送一个请求(request)并获得一个响应(response)。
  • 一对一通讯
  • rosservice list
    输出活跃服务的信息
  • rosservice type
    输出服务的类型,查看请求某服务时是否需要参数 ,若是empty(空)则表明调用这个服务时不需要参数
    rosservice type [service]
    rosservice type /clear
    查看类型的具体数据结构:rossrv show [data type]
    rosservice type /spawn | rossrv show
  • rosservice call
    请求某服务、用给定的参数调用服务
    rosservice call [service] [args]
    请求无参数的服务:rosservice call /clear
    请求有参数的服务:rosservice call /spawn 2 2 0.2 “”
  • rosservice find
    按服务的类型查找服务
  • rosservice uri
    输出服务的ROSRPC uri

2.5 参数服务器(Parameter Server)

  • rosparam能让我们在ROS参数服务器(Parameter Server)上存储和操作数据。参数服务器能够存储整型(integer)、浮点(float)、布尔(boolean)、字典(dictionaries)和列表(list)等数据类型。rosparam使用YAML标记语言的语法。一般而言,YAML的表述很自然:1是整型,1.0是浮点型,one是字符串,true是布尔型,[1, 2, 3]是整型组成的列表,{a: b, c: d}是字典。
  • rosparam list
    列出当前服务器上的所有参数
  • rosparam set
    设置参数服务器中的某参数
    rosparam set [param_name]
    rosparam set /turtlesim/background_r 150
    使设置的参数生效:rosservice call /clear
  • rosparam get
    获取某参数的当前值
    rosparam get [param_name]
    rosparam get /turtlesim/background_g
    显示所有参数的值:rosparam get /
  • rosparam load
    从文件中加载参数
    rosparam load [file_name] [namespace]
  • rosparam dump
    向文件中转储参数
    rosparam dump [file_name] [namespace]
    rosparam dump params.yaml
  • rosparam delete
    删除参数
    rosparam delete [file_name]

2.6 使用rqt_console和rqt_logger_level进行调试

  • rqt_console连接到了ROS的日志框架,以显示节点的输出信息。rqt_logger_level允许我们在节点运行时改变输出信息的详细级别,包括Debug、Info、Warn和Error`
  • rosrun rqt_console rqt_console
  • rosrun rqt_logger_level rqt_logger_level
  • https://wiki.ros.org/cn/ROS/Tutorials/UsingRqtconsoleRoslaunch

2.7 使用roslaunch来启动定义在.launch文件中的节点

  • roslaunch --help
  • roslaunch [package] [filename.launch]
  • 存放launch文件的目录不一定非要命名为launch,事实上都不用非得放在目录中,roslaunch命令会自动查找经过的包并检测可用的启动文件。然而,这种推荐的标准做法被认为是“最佳实践”。
  • https://wiki.ros.org/cn/ROS/Tutorials/UsingRqtconsoleRoslaunch

2.8 使用rosed在ROS中编辑文件

  • rosed默认的编辑器是vim。其实Ubuntu默认还有一个初学者更友好的编辑器gedit,你可以把下面这行加到~/.bashrc文件中来更改默认编辑器:export EDITOR=‘gedit-w’
  • rosed是rosbash套件的一部分。利用它可以直接通过软件包名编辑包中的文件,而无需键入完整路径。
  • rosed [package_name] [filename]
    rosed roscpp Logger.msg
  • Tab补全
    在不知道准确文件名的情况下,你也可以轻松地查看和编辑包中的所有文件
    rosed [package_name] < tab >< tab >
    rosed roscpp < tab >< tab >

2.9 消息(msg)

2.9.1 一些概念

  • .msg文件本质是文本文件,用于描述ROS消息的字段,用于帮助生成对应的.cpp或.py源代码。
  • .msg文件一般存放在软件包的msg目录下,msg文件就是简单的文本文件,每行都有一个字段类型和字段名称。可以使用的类型包括:
    int8, int16, int32, int64 (以及 uint*)
    float32, float64
    string
    time, duration
    其他 msg 文件
    variable-length array[] 和 fixed-length array[C]
    Header 它含有时间戳和ROS中广泛使用的坐标帧信息,一般定在第一行
  • 例如:
    Header header
    string child_frame_id
    geometry_msgs/PoseWithCovariance pose
    geometry_msgs/TwistWithCovariance twist
    其中,使用了Header、字符串原语和其他两个消息的示例: 上面是一个msg文件的样例,它使用了Header,string,和其他另外两个消息的类型。
  • 消息格式的完整规范在消息描述语言中。

2.9.2 创建消息

  • 1)创建一个.msg文件
    roscd beginner_tutorials
    mkdir msg
    echo “int64 num” > msg/Num.msg

  • 2)编辑.msg文件
    rosed beginner_tutorials Num.msg
    添加:
    string first_name
    string last_name
    uint8 age
    uint32 score

  • 3)启用 message_generation 功能
    修改 beginner_tutorials / package.xml 文件,如果没有则添加,如果被注释了则取消注释:
    message_generation
    message_runtime

  • 4)为 find_package 添加 message_generation 依赖项
    在CMakeLists.txt中查找find_package,在末尾添加message_generation,其他不变:
    find_package(catkin REQUIRED COMPONENTS
      …
    message_generation
    )

  • 5)确保导出消息运行时的依赖关系
    在 CMakeLists.txt 中找到catkin_package,取消该行的注释,并加入一项 message_runtime :
    ardupilot开发 --- ROS 篇_第5张图片

  • 6)手动添加.msg文件
    在 CMakeLists.txt 中找到 add_message_files,取消注释,并将 Message1.msg、Message2.msg修改成(1)中创建的msg名称,如Num.msg :
    add_message_files(
     FILES
     Num.msg
    )

  • 7)确保CMake知道何时需要重新配置项目
    在ROS Groovy及早期版本中:注释generate_messages()
    在ROS Hydro及更新版本中:
    在 CMakeLists.txt 中找到 generate_messages,取消注释:
    generate_messages(
     DEPENDENCIES
     std_msgs
    )

  • 8)重新编译软件包以生成 msg
    cd ~/ros_learn_ws
    catkin_make

  • 9)查看生成的消息
    rosmsg show [message type]
    rosmsg show beginner_tutorials/Num
    或:rosmsg show Num
    rosmsg -h
    rosmsg show -h

2.10 创建服务

2.10.1 一些概念

  • .srv文件描述一个服务。它由两部分组成:请求(request)和响应(response)。
  • 与.msg类似,.srv也用于帮助生成对应的.cpp或.py源代码。
  • .srv文件则存放在srv目录下。
  • srv文件和msg文件一样,只是它们包含两个部分:请求和响应。这两部分用一条 “- - - ” 线隔开。下面是一个.srv文件的示例,其中,A和B是请求时的输入参数, Sum是响应结果:
    在这里插入图片描述

2.10.2 创建服务步骤

  • 1)创建一个.srv文件
    roscd beginner_tutorials
    mkdir srv
    echo “int64 A” > srv/MySrv.srv

  • 2)编辑.srv文件
    rosed beginner_tutorials MySrv.srv
    编辑:
    在这里插入图片描述

  • 3)启用 message_generation 功能
    修改 beginner_tutorials / package.xml 文件,如果没有则添加,如果被注释了则取消注释:
    message_generation
    message_runtime

  • 4)为 find_package 添加 message_generation 依赖项
    在CMakeLists.txt中查找find_package,在末尾添加message_generation,其他不变:
    find_package(catkin REQUIRED COMPONENTS
      …
    message_generation
    )

  • 5)确保导出消息运行时的依赖关系
    在 CMakeLists.txt 中找到catkin_package,取消该行的注释,并加入一项 message_runtime :
    ardupilot开发 --- ROS 篇_第6张图片

  • 6)手动添加.srv文件
    在 CMakeLists.txt 中找到 add_service_files,取消注释,并将 Service1.srv、Service2.srv 修改成(1)中创建的srv名称,如MySrv.srv:
    add_service_files(
     FILES
     MySrv.srv
    )

  • 7)确保CMake知道何时需要重新配置项目
    在ROS Groovy及早期版本中:注释generate_messages( )
    在ROS Hydro及更新版本中:
    在 CMakeLists.txt 中找到 generate_messages,取消注释:
    generate_messages(
     DEPENDENCIES
     std_msgs
    )

  • 8)重新编译软件包以生成 msg
    cd ~/ros_learn_ws
    catkin_make

  • 9)查看生成的消息
    rossrv show < service type >
    rossrv show beginner_tutorials/MySrv
    或 rossrv show MySrv

待续…20231207, 学习MavSDK去了…

3. ROS2知识点

  • The ROS 1 bridge can connect topics from ROS 1 to ROS 2 and vice-versa. See the dedicated documentation on how to build and use the ROS 1 bridge.
  • 从帮助文档中选择性观看: tutorials and demos

问题合集

  • 如果roscore运行后没有初始化,很有可能是网络配置的问题。参见网络配置 - 单机器配置。
  • 如果roscore不能初始化并提示缺少权限,可能是因为~/.ros目录属于root用户(只有root用户才能访问),可以用以下命令递归地更改该目录的所有权:
    $ sudo chown -R ~/.ros
  • 当打开一个新的终端时,环境将会重置,/.bashrc文件将会生效。如果你在运行rosnode等命令时出现一些问题,那么可能需要将一些环境设置文件添加到/.bashrc或手动source一下。
  • catkin: command not found
    https://blog.csdn.net/weixin_58045467/article/details/126511275
  • 关于:the rosdep view is empty: call ‘sudo rosdep init’ and ‘rosdep update’
    以及 rosdep: command not found
    https://blog.csdn.net/qq_44339029/article/details/130494206
sudo apt install python3-rosdep
sudo rosdep init
rosdep update

解决问题的途径

参考:https://wiki.ros.org/Support

  • ROS 新闻,不用于发布问题:http://discourse.ros.org
  • Troubleshooting
  • FAQ
  • Robotics Stack Exchange
  • 其他:https://wiki.ros.org/cn/community
    ardupilot开发 --- ROS 篇_第7张图片

关于软件包

  • 官方地址:ROS Index
  • 先选中对应的ROS版本:
    ardupilot开发 --- ROS 篇_第8张图片
  • 搜索软件包(注意ROS版本)
    ardupilot开发 --- ROS 篇_第9张图片
  • 查看软件包的使用文档、开发文档
    1)使用文档
    包搜索后点进去的页面就是使用文档,需要关注的点为:
    ardupilot开发 --- ROS 篇_第10张图片
    2)开发文档:
    ardupilot开发 --- ROS 篇_第11张图片

你可能感兴趣的:(Ardupilot)