赞
踩
1. ROS2 VS ROS1
2. 终端命令行
Linux常用命令:路径:pwd cd../ 文件夹:mkdir cp rm mv ls 文件:touch cp rm mv gedit
ROS2命令行:ROS1中的命令行相对分散,而ROS2对命令行做了大幅度的集成,所有操作都集成在一个ros2的总命令中,第一个参数表示不同的操作目的,具体操作干什么,还可以在后边继续跟一系列参数内容。
ROS常用命令_ros命令_EngineerX_的博客-CSDN博客
1. 设置编码
- $ sudo apt update && sudo apt install locales
- $ sudo locale-gen en_US en_US.UTF-8
英文环境(可不设置)
- $ sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
- $ export LANG=en_US.UTF-8
改为中文:语言支持-将汉语拖动到最上方-应用到整个系统 火狐浏览器-设置-语言-中文
2. 添加源
$ sudo gedit /etc/hosts
添加 185.199.108.133 raw.githubusercontent.com
- $ sudo apt update && sudo apt install curl gnupg lsb-release
- $ sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
- $ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
3. 安装ROS2
- $ sudo apt update
- $ sudo apt upgrade
- $ sudo apt install ros-humble-desktop
4. 设置环境变量
- $ source /opt/ros/humble/setup.bash
- $ echo " source /opt/ros/humble/setup.bash" >> ~/.bashrc
5.测试
示例一 : 启动两个终端,分别运行数据的发布者节点和订阅者节点,一发一收
- $ ros2 run demo_nodes_cpp talker
- $ ros2 run demo_nodes_py listener
ctrl+c 暂停运行
示例二 :启动两个终端,分别运行海龟仿真节点和键盘控制节点,上下左右键控制运动
- $ ros2 run turtlesim turtlesim_node
- $ ros2 run turtlesim turtle_teleop_key
Vscode插件:C/C++、Python、CMake、vscode-icons、ROS、Msg Language Support、URDF
1.创建功能包
在工作空间WorkSpace的src文件下新建功能包
- $ mkdir -p ~/dev_ws/src # 新建文件夹
- $ cd ~/dev_ws/src
- $ ros2 pkg create --build-type ament_cmake learning_pkg_c # C++
- $ ros2 pkg create --build-type ament_python learning_pkg_python # Python
功能包不是普通的文件夹,必然存在package.xml,它包含功能包的版权描述和各种依赖的声明。
C++类型功能包:CMakerLists.txt是编译规则,要在该文件中设置如何编译,使用CMake语法。
Python类型功能包:setup.py包含一些版权信息,要在该文件中的“entry_points”配置程序入口。
2.自动安装依赖
src里的代码多少都会有一些依赖,我们可以手动一个一个安装,也可以使用rosdep工具自动安装
- $ sudo apt install -y python3-pip
- $ sudo pip3 install rosdepc
- $ sudo rosdepc init
- $ rosdepc update
- $ cd ..
- $ rosdepc install -i --from-path src --rosdistro humble -y
3.编译工作空间
ROS1中使用的rosbuild和catkin问题诸多,ROS2重新优化后的编译系统叫做ament和colcon。
$ sudo apt install python3-colcon-ros
在工作空间目录下编译,编译成功后就可看到自动生产的build、log、install文件夹了。
$ colcon build
4.设置环境变量
- $ source install/local_setup.sh # 仅在当前终端生效
- $ echo " source ~/dev_ws/install/local_setup.sh" >> ~/.bashrc # 所有终端均生效
- # ~/dev_ws修改为自己的工作空间完整路径
节点类似于XXX模块,执行具体任务的进程,每个节点都是独立运行的可执行文件,可使用不同的编程语言,可分布式运行在不同主机,通过节点名称进行管理。
1.创建节点流程
完成代码的编写后需要配置功能包:更改setup.py程序入口或者CMakerLists.txt配置
2.节点命令的常用操作
- $ ros2 node list # 查看节点列表
- $ ros2 node info <node_name> # 查看节点信息
-
- $ ros2 run [功能包名称] [节点名称] # 运行节点
- # 运行前需要先 colcon build 重新编译
ROS有三种常用的通信机制,分别是话题、服务、动作,通过每一种通信种定义的接口,各种节点才能有机的联系到一起。
在机器人开发过程中,类似的通信应用比比皆是,ROS针对绝大部分通用场景,都设计了标准的话题和服务数据类型, 在ROS安装路径 /opt/ros/humble/share文件夹中涵盖众多标准定义。很多时候这些标准定义也无法满足我们的需求,这个时候,我们就要自定义通信接口了。
话题使用的是.msg文件,由于是单向传输,只需要描述传输的每一帧数据是什么就行
服务使用的是.srv文件,包含请求和应答两部分定义,通过中间的“---”区分
动作使用的是.action文件,分成三个部分来描述机器人的一个运动过程,动作的目标比如是开始运动,运动的结果比如最终旋转的90度是否完成,反馈比如每隔1s反馈一下当前转动角度
接口命令行操作:
- $ ros2 interface list # 查看系统接口列表
- $ ros2 interface show <interface_name> # 查看某个接口的详细定义
- $ ros2 interface package <package_name> # 查看某个功能包中的接口定义
话题是节点间传递数据的桥梁,发布/订阅模型、发布者和订阅者的数量不唯一(注意区分发布优先级)、异步通信机制(发布者不知订阅者何时收到)、.msg文件定义通信的消息结构。
(1)发布者流程总结
(2)订阅者流程总结
(3)话题命令行操作
- $ ros2 topic list # 查看话题列表
- $ ros2 topic info <topic_name> # 查看话题信息
- $ ros2 topic hz <topic_name> # 查看话题发布频率
- $ ros2 topic bw <topic_name> # 查看话题传输带宽
- $ ros2 topic echo <topic_name> # 查看话题数据
- $ ros2 topic pub <topic_name> <msg_type> <msg_data> # 发布话题消息
-
- $ rqt_graph # 查看话题示意图
(4)应用场景
话题类似订阅公众号、报纸等,适合传感器、控制指令等周期性(定时器)、单向传输的数据。
服务是节点间的你问我答,客户端/服务器模型、服务器唯一,客户端可以不唯一、同步通信机制、.srv文件定义请求和应答的数据结构。
(1)客户端流程总结
(2)服务器流程总结
(3)服务命令行操作
- $ ros2 service list # 查看服务列表
- $ ros2 service type <service_name> # 查看服务数据类型
- $ ros2 service call <service_name> <service_type> <service_data> # 发送服务请求
(4)应用场景
服务类似浏览网页,适合一问一答,同步性要求更高的数据。
动作是完整行为的流程管理,客户端/服务器模型、服务器唯一,客户端可以不唯一、同步通信机制、.action文件定义请求和应答的数据结构。
(1)客户端流程总结
(2)服务器流程总结
(3)动作命令行操作
- $ ros2 action list # 查看服务列表
- $ ros2 action info <action_name> # 查看服务数据类型
- $ ros2 action send_goal <action_name> <action_type> <action_data> <--feedback> # 发送服务请求
(4)应用场景
客户端发送给一个动作目标,服务器控制机器人开始运动,并周期反馈,结束后反馈结束信息。
参数是ROS机器人系统中的全局字典,可以多个节点中共享数据,可实现动态监控。
(1)参数操作
(2)参数命令行操作
- $ ros2 param list # 查看节点参数列表
- $ ros2 param describe <节点名> <参数名> # 查看某个参数的描述信息
- $ ros2 param get <节点名> <参数名> # 查询某个参数的值
- $ ros2 param set <节点名> <参数名> <参数值> # 修改某个参数的值
- $ ros2 param dump <节点名> >> <节点名>.yaml # 将某个节点的参数保存到参数文件中
- $ ros2 param load <节点名> <节点名>.yaml # 一次性加载某一个文件中的所有参数
1.分布式数据传输
只要两个计算机安装好ROS2,并且处于同一网络中,他们就可以实现通信。
2.分布式网络分组
ROS2提供了一个DOMAIN的机制,就类似分组一样,处于同一个DOMAIN中的计算机才能通信。
- $ gedit .bashrc
- $ export ROS_DOMAIN_ID=<your_domain_id> # 添加至末尾
- $ source .bashrc
DDS的全称是Data Distribution Service,也就是数据分发服务,是一种通信的标准。DDS是机器人的神经网络,它的加入让ROS2的通信系统焕然一新,多众多样的通信模式配置,可以更好的满足不同场景下的机器人应用。
DDS中的基本结构是Domain,Domain将各个应用程序绑定在一起进行通信,回忆下之前我们配置树莓派和电脑通信的时候,配置的那个DOMAIN ID,就是对全局数据空间的分组定义,只有处于同一个DOMAIN小组中的节点才能互相通信。这样可以避免无用数据占用的资源。
DDS中另外一个重要特性就是质量服务策略,QoS。它是一种网络传输策略,应用程序指定所需要的网络传输质量行为,QoS服务实现这种行为要求,尽可能地满足客户对通信质量的需求。具体会有哪些策略?比如:
1.命令行中配置DDS
启动第一个终端,我们使用best_effor创建一个发布者节点,循环发布任意数据。
在另外一个终端中,如果我们使用reliable模型订阅同一话题,无法实现数据通信。
如果修改为同样的best_effort,才能实现数据传输。
- $ ros2 topic pub /chatter std_msgs/msg/Int32 "data: 42" --qos-reliability best_effort
- $ ros2 topic echo /chatter --qos-reliability reliable
- $ ros2 topic echo /chatter --qos-reliability best_effort
查看ROS2系统中每一个发布者或者订阅者的QoS策略:
$ ros2 topic info /chatter --verbose
2.DDS编程示例
(1)发布者流程总结
(2)订阅者流程总结
Launch启动文件,它是ROS系统中多节点启动与配置的一种脚本。
1.多节点启动
$ ros2 launch <功能包名> <launch文件>
- from launch import LaunchDescription # launch文件的描述类
- from launch_ros.actions import Node # 节点启动的描述类
-
- def generate_launch_description(): # 自动生成launch文件的函数
- return LaunchDescription([ # 返回launch文件的描述信息
- Node( # 配置一个节点的启动
- package='learning_topic', # 节点所在的功能包
- executable='topic_helloworld_pub', # 节点的可执行文件
- ),
- Node( # 配置一个节点的启动
- package='learning_topic', # 节点所在的功能包
- executable='topic_helloworld_sub', # 节点的可执行文件名
- ),
- ])
相当于一个launch文件替代执行了启动两个终端,分别运行话题的发布者节点&订阅者节点:
$ ros2 run learning_topic topic_helloworld_pub
$ ros2 run learning_topic topic_helloworld_sub
2.命令行参数配置
ros2命令后可配置一些传入程序的参数,使用launch文件一样可以做到。
- Node( # 配置一个节点的启动
- package='rviz2', # 节点所在的功能包
- executable='rviz2', # 节点的可执行文件名
- name='rviz2', # 对节点重新命名
- arguments=['-d', rviz_config] # 加载命令行参数
- )
3.资源重映射
为了提高软件的复用性,ROS提供了资源重映射的机制,解决对资源重新命名的问题。
- Node( # 配置一个节点的启动
- package='turtlesim', # 节点所在的功能包
- executable='mimic', # 节点的可执行文件名
- name='mimic', # 对节点重新命名
- remappings=[ # 资源重映射列表
- ('/input/pose', '/turtlesim1/turtle1/pose'), # 将/input/pose话题名修改为/turtlesim1/turtle1/pose
- ('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'), # 将/output/cmd_vel话题名修改为/turtlesim2/turtle1/cmd_vel
- ]
- )
4.ROS参数设置
ROS系统中的参数,也可以在Launch文件中设置。
- Node( # 配置一个节点的启动
- package='turtlesim', # 节点所在的功能包
- executable='turtlesim_node', # 节点的可执行文件名
- namespace='turtlesim2', # 节点所在的命名空间
- name='sim', # 对节点重新命名
- parameters=[config] # 加载参数文件
- )
5.Launch文件包含
在复杂的机器人系统中,launch文件也会有很多,此时我们可以使用类似编程中的include机制,让launch文件互相包含。
- def generate_launch_description(): # 自动生成launch文件的函数
- parameter_yaml = IncludeLaunchDescription( # 包含指定路径下的另外一个launch文件
- PythonLaunchDescriptionSource([os.path.join(
- get_package_share_directory('learning_launch'), 'launch'),
- '/parameters_nonamespace.launch.py'])
- )
-
- parameter_yaml_with_namespace = GroupAction( # 对指定launch文件中启动的功能加上命名空间
- actions=[
- PushRosNamespace('turtlesim2'),
- parameter_yaml]
- )
-
- return LaunchDescription([ # 返回launch文件的描述信息
- parameter_yaml_with_namespace
- ])
6.功能包编译配置
- ...
-
- data_files=[
- ('share/ament_index/resource_index/packages',
- ['resource/' + package_name]),
- ('share/' + package_name, ['package.xml']),
- (os.path.join('share', package_name, 'launch'), glob(os.path.join('launch', '*.launch.py'))),
- (os.path.join('share', package_name, 'config'), glob(os.path.join('config', '*.*'))),
- (os.path.join('share', package_name, 'rviz'), glob(os.path.join('rviz', '*.*'))),
- ],
-
- ...
机器人坐标系管理神器
- $ sudo apt install ros-humble-turtle-tf2-py ros-humble-tf2-tools
- $ sudo pip3 install transforms3d
查看TF树
$ ros2 run tf2_tools view_frames
订阅5s内的坐标结构,默认在当前终端路径下生成一个frames.pdf文件
查询坐标变换信息
$ ros2 run tf2_ros tf2_echo turtle2 turtle1
终端中就会循环打印坐标系的变换数值了,由平移和旋转两个部分组成,还有旋转矩阵。
坐标系可视化
$ ros2 run rviz2 rviz2 -d $(ros2 pkg prefix --share turtle_tf2_py)/rviz/turtle_rviz.rviz
静态TF变换
两者之间的相对位置不会发生改变,通过创建一个静态的TF广播器对象进行维护。
TF监听
创建坐标变换的监听器,查询两个坐标系之间的位置关系。
机器人一般是由硬件结构、驱动系统、传感器系统、控制系统四大部分组成,机器人建模的过程,其实就是按照类似的思路,通过建模语言,把机器人每一个部分都描述清楚,再组合起来的过程。
URDF全称是统一机器人描述格式,可清晰描述机器人自身的模型,还可描述机器人的外部环境。
URDF使用的是XML格式,关键是通过<link>和<joint>,理清楚每一个连杆和关节的描述信息。
1.连杆Link的描述
<link>标签用来描述机器人某个刚体部分的外观和物理属性,外观包括尺寸、颜色、形状,物理属性包括质量、惯性矩阵、碰撞参数等。
<visual>,描述机器人的外观:
<collision>,描述碰撞参数:
2.关节Joint描述
ROS中关于平移的默认单位是m,旋转是弧度(不是度),所以这里的3.14就表示可以在-180度到180度之间运动,线速度是m/s,角速度是rad/s。
3.建模过程
机器人的模型放置在功能包中,包含的文件夹如下:
模型可视化效果
Rviz中显示自己建立的机器人模型,可以使用鼠标拖拽观察。
$ ros2 launch learning_urdf display.launch.py
查看URDF模型结构
在模型的路径下,使用urdf_to_graphviz来分析URDF模型,运行成功后会产生一个pdf文件
$ urdf_to_graphviz mbot_base.urdf # 在模型文件夹下运行
Gazebo是ROS系统中最为常用的三维物理仿真平台,支持动力学引擎,可以实现高质量的图形渲染,不仅可以模拟机器人及周边环境,还可以加入摩擦力、弹性系数等物理属性。
1.安装与运行
$ sudo apt install ros-humble-gazebo-*
将离线模型下载并放置到~/.gazebo/models路径下(开启查看隐藏文件):
$ ros2 launch gazebo_ros gazebo.launch.py
2.XACRO机器人模型优化
之前设计好的URDF模型此时还不能直接放到Gazebo中,需要我们做一些优化。
XACRO文件——URDF文件格式的升级版本,建模过程就像写代码一样,功能更为丰富了。
$ sudo apt install ros-humble-xacro
3.Ignition
随着技术的进步,Gazebo仿真平台也在不断迭代,新一代的Gazebo命名为Ignition
- $ sudo apt install ros-humble-ros-ign
- $ ros2 launch ros_ign_gazebo_demos rgbd_camera_bridge.launch.py
Rviz是可视化平台,核心功能是显示数据。
1.运行
$ ros2 run rviz2 rviz2
2.仿真插件配置
关于传感器的仿真,都需要使用Gazebo提供的插件。插件需要先配置,再运行。
ROS提供的另外一种模块化可视化工具——rqt,简单的模块化的可视化工具。
安装与运行
- $ sudo apt install ros-humble-rqt
- $ rqt
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。