- Published on
ROS
- Authors

- Name
- Lin Zaizai
ROS入门记录
1. 安装ROS
首先按照鱼香ROS进行ROS安装,因为找不到humble版本,只能安装jazzy版本了,且由于树莓派上是Ubuntu-Server,没有GUI,所以安装的也是基础版ROS
wget http://fishros.com/install -O fishros && . fishros安装好后开始测试,ROS2是没有roscore的,选择demo_nodes_cpp进行测试,一开始出现了package not found报错,后面意识到选的是基础版安装,因此可能没有预装这些包,所以另外进行安装
sudo apt-get update sudo apt-get install ros-$ROS_DISTRO-demo-nodes-py sudo apt-get install ros-$ROS_DISTRO-demo-nodes-cpp source /opt/ros/$ROS_DISTRO/local_setup.bash$ROS_DISTRO是环境变量,是ros的版本名
使用demo_nodes_cpp talker/listener测试
ros2 run demo_nodes_cpp talker ros2 run demo_nodes_cpp listener测试效果如下

配置摄像头,用以下命令检测摄像头状态
vcgencmd get_camera正常来说是输出以下信息
supported=1 detected=1, libcamera interfaces=0但是我的树莓派起初一直获取不到摄像头,后来安装raspi-config后将legacy-camera打开即可

测试摄像头
ffmpeg -f v4l2 -i /dev/video0 -frames:v 1 output.jpg
输出图像为output.jpg,下图为我的第一张树莓派摄像图

2. 节点、话题与服务
节点是负责一个单一的模块化功能,如控制轮子马达或发布来自激光测距仪的传感器数据,节点间通过话题、服务、动作或者参数进行通信,在ROS2中,单个可执行文件(C++、Python等)可以包括一个或多个节点
ros2 run <package_name> <executable_name>
命令ros2 run会从一个软件包中启动一个可执行文件。
ros2 node list
输出所有正在运行的节点名称
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle
重映射,在海龟模拟中,可以重新分配默认节点属性,如节点名称、话题名称、服务名称等,以自定义的值,这里重新定义了节点的名称
ros2 node info <node_name>
输出节点信息
ros2 topic list [-t]
输出话题列表,-t返回相同的主题列表,括号附加了主题类型,如输出如下
/parameter_events [rcl_interfaces/msg/ParameterEvent]
/rosout [rcl_interfaces/msg/Log]
/turtle1/cmd_vel [geometry_msgs/msg/Twist]
/turtle1/color_sensor [turtlesim/msg/Color]
/turtle1/pose [turtlesim/msg/Pose]
可以通过rqt-graph可视化查看节点、话题以及动作的关系

ros2 topic echo <topic_name>
查看话题上发布数据,即订阅该话题
ros2 topic info /turtle1/cmd_vel
查看话题信息,输出其话题传递的数据类型和发布者,订阅者数量,如:
Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 2
节点使用消息在主题上发送数据,发布者和订阅者必须发送和接受相同的类型的消息来进行通信
ros2 interface show <message_type>
因此可以通过以上命令来查看该数据类型的格式,如海龟模拟的数据类型geometry_msgs/msg/Twist为例
# This expresses velocity in free space broken into its linear and angular parts.
Vector3 linear
float64 x
float64 y
float64 z
Vector3 angular
float64 x
float64 y
float64 z
这告诉你/turtlesim节点期望接收一个带有两个向量linear和angular的消息,每个向量都有三个元素。如果你回想一下我们使用echo命令看到/teleop_turtle传递给/turtlesim的数据,它具有相同的结构:
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
可以根据消息结构来将数据发布到一个话题上
ros2 topic pub [--once/ --race 1] <topic_name> <msg_type> '<args>'
'<args>'是一个可选参数,需要以YAML语法输入,而--one是发布一次数据就退出,--race是以指定频率进行循环输出,--race 1就是一秒发布一次
ros2 topic hz /turtle1/pose
该命令可以查看数据发布的频率,输出如下
average rate: 59.354
min: 0.005s max: 0.027s std dev: 0.00284s window: 58
使用rclpy创建一个节点,vscode连接远程服务器

使用gpiozero调用gpio接口
使用opencv获取摄像头,并获取摄像头参数
>>> import cv2
>>> cap = cv2.VideoCapture(0, cv2.CAP_V4L2)
>>> cap.get(3)
640.0
>>> cap.get(4)
480.0
如果出现以下报错:
qt.qpa.xcb: could not connect to display
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, xcb.
Aborted (core dumped)
就说明找不到图形化窗口,因为是服务器版没有GUI,因此调用不了可视化窗口
虚拟环境
要使用pip就必须使用虚拟环境
python3 -m venv .venv(虚拟环境文件夹)
激活环境
source .vnev/bin/activate