当前位置:   article > 正文

ROS(7)ROS2命令与学习_ros2发布话题命令

ros2发布话题命令

1、Visual studio code需要插件

  • python3
  • c/c++
  • Cmake
  • vscode-icons
  • ROS
  • Msg Language Support
  • URDF 模型
  • IntelliCode 代码补全
  • Markdown All in One

2、克隆项目

mkdir -p ~/dev_ws/src
cd dev_ws/src/

git clone https://gitee.com/guyuehome/ros2_21_tutorials.git

sudo apt install python3-pip
sudo pip3 install rosdepc  

cd ..

初始化rosdepc

sudo rosdepc init & rosdepc update

安装依赖项

rosdepc install -i --from-path src --rosdistro foxy -y  (注意:执行此句报错)
搜索src中项目所有功能包的依赖项,自动安装依赖项

安装编译器工具colcon

sudo apt install python3-colcon-ros

确定在工作空间根目录,如dev_ws

colcon build    扫描功能包,扫描依赖,开始编译
编译后生成build、install和log文件夹

配置环境变量

source install/local_setup.sh

.bashrc文件中,最后一行添加
source ~/dev_ws/install/local_setup.sh


3、创建功能包

ros2 pkg create --build-type <build-type><package_name>

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

编译功能包

cd ~/dev_ws/src
colcon build  # 编译工作空间所有功能包
source install/local_setup.bash


4、运行节点

ros2 run learning_node(功能包) node_helloworld(节点)

面向对象编程

ros2 run learning_node node_helloworld_class
rclpy.init(arg=args)  python接口初始化
node = HelloWorldNode("节点名")  创建ROS2节点对象并进行初始化
rclpy.spin(node)  循环等待ros2退出
node.destroy_node()  销毁节点对象  当按下ctrl+c时
rclpy.shutdown()  关闭ros2 python接口

机器视觉应用

sudo apt install python3-opencv
ros2 run learning_node node_object
读取摄像头图像,动态检测
ros2 run learning_node node_object_webcam
cv2.VideoCapture(0)  获取摄像头实时信息
while rclpy.ok(): ret,image = cap.read() 读取一帧图像 if ret==True: object_detect(image) 检测

ros2 node list 查看运行的节点列表
ros2 node info /node_object_webcam  查看节点信息,有哪些发布者订阅者


5、发布/订阅模型  话题:节点间传递数据的桥梁

订阅者或发布者可以不唯一 多对多
异步通信机制
.msg文件定义通信的消息结构
发布者Publisher->Topic:chatter Message:String Data:Hello world->订阅者Subscriber

实现复杂话题通信

Publisher->Topic:image_raw Message:Image Data:Image Data->Subscriber
ros2 run learning_topic topic_webcam_pub
ros2 run learning_topic topic_webcam_sub

ros2标准相机驱动

sudo apt install ros-版本(foxy)-usb-cam
ros2 run usb_cam usb_cam_node_exe
info信息  bw带宽(两帧中的数据量) 
ros2 topic echo bw /image_raw 打印图像带宽

rqt_graph  节点视图


6、服务通信  客户端/服务器(C/S)模型

服务:节点间的你问我答

同步通信机制;服务器端唯一,客户端可以不唯一;.srv文件定义请求和应答数据结构

ros2 run learning_service service_adder_server

ros2 run learning_service service_adder_client 2 3

Client——Service:service_object_client Request Data:true Response Data:x,y——Server

ros2 run use_cam usb_cam_node_exe

ros2 run learning_service service_object_server

ros2 run learning_service service_object_client

创建服务器对象

self.server = self.create_service(接口类型(srv数据类型), 服务名, 服务器回调函数self.object_position_callback)

创建客户端对象

self.client = self.create_client(接口类型(srv数据类型), 服务名)

while not self.client.wait_for_service(timeout_sec=1.0):

        self.get_logger().info('service not available, waiting again...')

通信接口

.msg文件  话题

int32 x

int32 y

.srv文件  服务

请求数据

int64 a

int64 b

---

应答数据

int64 sum

.action文件  动作

目标

bool enable

---

结果

bool finish

---

反馈

int32 state

 ros2 interface list

ros2 interface show std_srvs/srv/SetBool    查看接口信息内容

ros2 interface package learning_interface  查看功能包中的接口

动作

如:机器人转个圈--》当转到90度--》旋转完毕

动作:完整行为的流程管理

客户端/服务器(C/S)模型

Action包含:Goal Service Request Response -- Feedback Topic -- Result Service Request Response

ros2 run turtlesim turtlesim_node

ros2 run turtlesim turtle_teleop_key

ros2 action info /turtle1/rotate_absolute

ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta:-1.57}"

ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta:-1.57}" --feedback

全局字典 参数

  • 全局共享字典
  • 由键和值组成
  • 可实现动态监控

ros2 param list

ros2 param describe turtlesim background_b

ros2 param set/get turtlesim background_b (100)

ros2 param dump turtlesim >> turtlesim.yaml 重定向,将信息保存到yaml中

ros2 param load turtlesim turtlesim.yaml  读取参数并更新

ros2 run learning_parameter param_declare

ros2 param set param_declare robot_name turtle

self.declare_parameter(参数名,参数值)  创建一个参数,设置参数默认值

self.get_parameter(参数名).get_parameter_value().string_value  从ROS2系统中读取参数的值

rclpy.parameter.Parameter(参数名,rclpy.Parameter.Type.STRING('参数值'))  设置参数为制定值

self.set_parameters(参数列表)

ros2 run usb_cam usb_cam_node_exe

ros2 run learning_parameter param_object_detect

ros2 param set param_object_detect red_h_upper 180

分布式通信

Computer A  树莓派  电机驱动、摄像头

Computer B 笔记本  监控、操作

树莓派端配置

  • 装系统 Ubuntu MATE: https://ubuntu-mate.org/download/
  • 装ROS2
  • 代码下载,编译代码
  • 远程桌面

分布式数据传输

ros2 run demo_nodes_cpp talker(树莓派端)

ros2 run demo_nodes_py listener(PC端)

ssh 树莓派端主机名+ip地址

vim ~/.bashrc

export ROS_DOMAIN_ID=设置数字(9)

source ~/.bashrc

小海龟仿真

ros2 run turtlesim turtlesim_node (PC端)

ros2 run turtlesim turtle_teleop_key  (树莓派端)

运行dev_ws中代码

cd ~/dev_ws

source install/local_setup.sh 或 写入到~/.bashrc中

DDS:机器人的神经网络

点对点模式  TCP,REST,WS*,OPC UA CORBA,Thrift

Broker模式(Brokered ESB Daemon)  MQTT,XMPP,AMQP,Kafka

广播模式 FieldbuS,CANbus,OPC UA Pub-Sub

数据为中心模式 shared Data Model  DataBus  DDS

DDS, Data Distribution Service 数据分发服务

专门为实时系统设计的数据分发/订阅鲍屯

强调以数据为中心,提供丰富的服务质量策略(QoS),以保障数据进行实时、高校、灵活地分发,可满足各种分布式实时通信应用需求

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 topic info /chatter --verbose

ros2 run learning_qos qos_helloworld_pub

ros2 run learning_qos qos_helloworld_sub

from rclpy.qos impor QoSProfile, QoSReliabilityPolicy, QoSHistoryPolicy  # ros2 QoS类

Launch

Launch文件:实现多节点的配置和启动

ros2 launch learning_launch simple.launch.py

  1. from launch import LaunchDescription
  2. from launch_ros.actions import Node
  3. def generate_launch_description():
  4. return LaunchDescription([
  5. Node(
  6. package='learning_topic',
  7. executable='topic_helloworld_pub'
  8. ),
  9. Node(
  10. package='learning_topic',
  11. executable='topic_helloworld_sub'
  12. ),
  13. ])
  1. import os
  2. from ament_index_python.packages import get_package_share_directory # 查询功能包路径的方法
  3. from launch import LaunchDescription # launch文件的描述类
  4. from launch_ros.actions import Node # 节点启动的描述类
  5. def generate_launch_description(): # 自动生成launch文件的函数
  6. rviz_config = os.path.join( # 找到配置文件的完整路径
  7. get_package_share_directory('learning_launch'),
  8. 'rviz',
  9. 'turtle_rviz.rviz'
  10. )
  11. return LaunchDescription([ # 返回launch文件的描述信息
  12. Node( # 配置一个节点的启动
  13. package='rviz2', # 节点所在的功能包
  14. executable='rviz2', # 节点的可执行文件名
  15. name='rviz2', # 对节点重新命名
  16. arguments=['-d', rviz_config] # 加载命令行参数
  17. )
  18. ])

重映射

  1. from launch import LaunchDescription # launch文件的描述类
  2. from launch_ros.actions import Node # 节点启动的描述类
  3. def generate_launch_description(): # 自动生成launch文件的函数
  4. return LaunchDescription([ # 返回launch文件的描述信息
  5. Node( # 配置一个节点的启动
  6. package='turtlesim', # 节点所在的功能包
  7. namespace='turtlesim1', # 节点所在的命名空间
  8. executable='turtlesim_node', # 节点的可执行文件名
  9. name='sim' # 对节点重新命名
  10. ),
  11. Node( # 配置一个节点的启动
  12. package='turtlesim', # 节点所在的功能包
  13. namespace='turtlesim2', # 节点所在的命名空间
  14. executable='turtlesim_node', # 节点的可执行文件名
  15. name='sim' # 对节点重新命名
  16. ),
  17. Node( # 配置一个节点的启动
  18. package='turtlesim', # 节点所在的功能包
  19. executable='mimic', # 节点的可执行文件名
  20. name='mimic', # 对节点重新命名
  21. remappings=[ # 资源重映射列表
  22. ('/input/pose', '/turtlesim1/turtle1/pose'), # 将/input/pose话题名修改为/turtlesim1/turtle1/pose
  23. ('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'), # 将/output/cmd_vel话题名修改为/turtlesim2/turtle1/cmd_vel
  24. ]
  25. )
  26. ])

setup.py中data_files需要配置

TF坐标

sudo apt install ros-foxy-turtle-tf2-py ros-foxy-tf2-tools

sudo pip3 install transform3d

ros2 launch turtle_tf2_py turtle_tf2_demo.launch.py

ros2 run turtlesim turtle_teleop_key

ros2 run tf2_tools view_frames

ros2 run tf2_ros tf2_echo turtle2 turtle1

ros2 run rviz2 rviz2 -d

(ros2 pkg prefix --share turtle_tf2_py)/rviz/turtle_rviz.rviz

URDF机器人建模方法

机器人组成:硬件结构、驱动系统、控制系统、传感系统

硬件:底盘、外壳、电机

Unified Robot Description Format统一机器人描述格式

使用XML格式描述机器人模型,包括link和joint自身及相关属性的描述信息

<link>  描述机器人某个刚体部分的外观和物理属性

描述连杆尺寸size、颜色color、形状shape、惯性矩阵inertial matrix、碰撞参数collision properties等

每个Link会成为一个坐标系

<joint>描述两个link之间的关系,包括

  • continuous 旋转关节,可以围绕单轴无限旋转
  • revolute  旋转关节,类似continuous,但是有旋转的角度极限
  • prismatic  滑动关节,沿某一轴线移动的关节,带有位置极限
  • fixed  固定关节,不允许运动的特殊关节
  • floating  浮动关节,允许进行平移、旋转运动
  • planar  平面关节,允许在平面正交方向上平移或旋转

包括关节运动的位置和速度限制,描述机器人关节的运动学和动力学属性

<robot name=''>

urdf  存放机器人模型的URDF或xacro文件

meshes  放置URDF中引用的模型渲染文件

launch  保存相关启动文件

rviz  保存rviz的配置文件

ros2 launch learning_urdf display.launch.py

查看描述URDF模型结构

urdf_to_graphviz mbot_base.urdf   在模型文件夹下

7、Gazebo  三维物理仿真平台

  • 具备强大的物理引擎
  • 高质量的图像渲染
  • 方便的编程与图形接口
  • 开源免费

用于测试机器人算法、机器人的设计、现实情景下的回溯测试

sudo apt install ros-foxy-gazebo-*

ros2 launch gazebo_ros gazebo.launch.py

使用虚拟机时,需要强制使用cpu渲染

~/.bashrc

export SVGA_VGPU10=0

URDF模型升级版本——XACRO模型文件

sudo apt install ros-foxy-xacro

精简模型代码:创建宏定义、文件包含

提供可编程接口:常量、变量、数学计算、条件语句

常量定义 <xacro:property name="M_PI" value="3.14159">

常量使用 <origin xyz="0 0 0" rpy="${M_PI/2} 0 0">

数学计算 <origin xyz="0 ${(motor_length+wheel_length)/2} 0" rpy="0 0 0">

注意:所有数学运算都会转换成浮点数进行,以保证运算精度

宏定义 <xarco:macro name="name" param="A B C"> ... </xacro:macro>

宏调用 <name A="A_value" B="B_value" C="C_value" />

文件包含 <xacro:include filename="$(find mbot_description)/urdf/mbot_base_gazebo.xacro" />

ros2 launch learning_gazebo load_urdf_into_gazebo.launch.py

ros2 run teleop_twist_keyboard teleop_twist_keyboard

Rviz 三维可视化显示

ros2 launch learning_gazebo load_mbot_camera_into_gazebo.launch.py

Gazebo 仿真平台:创造数据

Rviz 可视化平台:显示数据

RQT:模块化可视化工具

sudo apt install ros-foxy-rqt

rqt

自动驾驶

https://www.autoware.org/

https://autowarefoundation.gitlab.io/autoware.auto/AutowareAuto/

https://moveit.ros.org/

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号