【ROS2】Arduino系列之机器人控制系统

server/2025/1/15 1:07:30/

ROS是一种分布式设计框架,针对小型或微型机器人平台的控制系统,可以选择多处理器的实现策略。具体实现是“PC + 嵌入式”,可以使用嵌入式系统(比如树莓派)充当机器人本体的控制系统,而PC则实现远程监控,通过前者实现数据采集与直接的底盘控制,而后者则远程实现图形显示以及功能运算。本文包含一下内容:

1.树莓派概述;
2.实现树莓派与PC的分布式系统搭建;
3.使用 ssh 远程连接树莓派;
4.树莓派端安装并配置 ros_arduino_bridge。

一、树莓派概述

概念:Raspberry Pi(中文名为“树莓派”,简写为RPi,(或者RasPi / RPI)是为学习计算机编程教育而设计),只有信用卡大小的微型电脑,其系统基于Linux。随着Windows 10 IoT的发布,我们也将可以用上运行Windows的树莓派。

结构:它是一款基于ARM 的微型电脑主板,以SD/MicroSD卡为内存硬盘,卡片主板周围有1/2/4个USB接口和一个以太网接口(A型没有网口),可连接键盘、鼠标和网线,同时拥有视频模拟信号的电视输出接口和HDMI高清视频输出接口,以上部件全部整合在一张仅比信用卡稍大的主板上,具备所有PC的基本功能只需接通电视机和键盘,就能执行如电子表格、文字处理、玩游戏、播放高清视频等诸多功能,下图为树莓派4b。

配件:单独一块树莓派主板是无法运行的,必须集成一些配件才能实现一定的功能,树莓派周边配件是比较丰富的,比如:USB电源、SD卡、读卡器、HDMI连接线、显示屏、键盘、鼠标、保护壳、风扇等等,除此之外还有各式各样的传感器:声音传感器、温度传感器、土壤湿度传感器....对于我们教程而言,所需的配件比较简单,硬件清单如下:

1.树莓派主板
2.电源线
3.SD卡(已安装 Ubuntu 以及 ROS)
4.显示屏或 HDMI采集卡以及配套的数据线
5.鼠标、键盘

接线以及使用:

树莓派连接显示屏
树莓派连接HDMI采集卡

二、分布式框架

当前分布式框架搭建时,树莓派是作为主机,而PC则作为从机。

2.1 树莓派准备工作

为树莓派连接无线网络,并设置固定IP,实现如下:

1.硬件准备:使用显示屏或 HDMI采集卡连接树莓派并启动;
2.为树莓派连接无线网络;
3.为树莓派配置静态IP,具体操作如图:

 

2.2 ROS分布式通信

ROS是一个分布式计算环境。一个运行中的ROS系统可以包含分布在多台计算机上多个节点。根据系统的配置方式,任何节点可能随时需要与任何其他节点进行通信。

因此,ROS对网络配置有某些要求:

1.所有端口上的所有机器之间必须有完整的双向连接。
2.每台计算机必须通过所有其他计算机都可以解析的名称来公告自己。
2.2.1 准备

先要保证不同计算机处于同一网络中,最好分别设置固定IP,如果为虚拟机,需要将网络适配器改为桥接模式。

2.2.2 配置文件修改

分别修改不同计算机的 /etc/hosts 文件,在该文件中加入对方的IP地址和计算机名:

​主机端:    从机的IP    从机计算机名
从机端:    主机的IP    主机计算机名

设置完毕,可以通过 ping 命令测试网络通信是否正常。

IP地址查看名: ifconfig
计算机名称查看: hostname
2.2.3 配置主机IP

配置主机的 IP 地址,在~/.bashrc 追加:

export ROS_MASTER_URI=http://主机IP:11311
export ROS_HOSTNAME=主机IP
2.2.4 配置从机IP

配置从机的 IP 地址,从机可以有多台,每台都做如下设置:~/.bashrc 追加

export ROS_MASTER_URI=http://主机IP:11311
export ROS_HOSTNAME=从机IP
2.2.5 测试
1.主机启动 roscore(必须)
2.主机启动订阅节点,从机启动发布节点,测试通信是否正常
3.反向测试,主机启动发布节点,从机启动订阅节点,测试通信是否正常

2.3 SSH远程连接

SSH(Secure Shell)是一种通用的、功能强大的、基于软件的网络安全解决方案。计算机每次向网络发送数据时,SSH都会自动对其进行加密。数据到达目的地时,SSH自动对加密数据进行解密。整个过程都是透明的,使用OpenSSH工具将会增进你的系统安全性。SSH安装容易、使用简单。

SSH实现架构上分为客户端和服务器端两大部分,客户端是数据的发送方,服务端是数据的接收方,当前场景下,我们需要从PC端发送数据到树莓派,那么PC端属于客户端,而树莓派属于服务端,整个实现具体流程是:

1.分别安装SSH客户端与服务端
2.服务端启动SSH服务
3.客户端远程登陆服务端
4.实现数据传输
2.3.1 安装SSH客户端与服务端

默认情况下,Ubuntu系统已经安装了SSH客户端,因此只需要在树莓派安装服务端即可(如果树莓派安装的是服务版的Ubuntu,默认会安装SSH服务并已设置成了开机自启动)

 sudo apt-get install openssh-server

如果客户端需要自行安装,那么调用如下命令:

sudo apt-get install openssh-client
2.3.2 服务端启动SSH服务

树莓派启动 ssh 服务:

sudo /etc/init.d/ssh start

启动后查看服务是否正常运行:

ps -e | grep ssh

如果启动成功,会包含 sshd 与 ssh 两个程序。以后需要频繁的使用ssh登录树莓派,为了简化实现,可以将树莓派的ssh服务设置为开机自启动,命令如下:

sudo systemctl enable ssh
2.3.3客户端远程登陆服务端

登陆树莓派可以调用如下命令:

ssh 账号@ip地址

然后根据提示,录入登陆密码,即可成功登陆。如果退出登陆,可以调用exit命令:

exit
2.3.4实现数据传输

上传文件:

scp 本地文件路径 账号@ip:树莓派路径

上传文件夹:

scp -r 本地文件夹路径 账号@ip:树莓派路径

下载文件:

scp 账号@ip:树莓派路径 本地文件夹路径

下载文件夹:

scp -r 账号@ip:树莓派路径 本地文件夹路径
2.3.5 使用优化

每次登陆树莓派时,都需要输入密码,使用不方便,可以借助密钥简化登陆过程,实现免密登陆,提高操作效率,实现思想是:生成一对公钥私钥,私钥存储在本地,公钥上传至服务器,每次登陆时,本地直接上传私钥到服务器,服务器有匹配的公钥就认为是合法用户,直接创建SSH连接即可。具体实现步骤只有两步:

1.生成密钥对

本地客户端生成公私钥:(一路回车默认即可)

ssh-keygen

上面这个命令会在用户目录.ssh文件夹下创建公私钥:

id_rsa (私钥)
id_rsa.pub (公钥)
2.将公钥上传至树莓派

上传命令:

ssh-copy-id -i ~/.ssh/id_rsa.pub 账号@ip

上面这条命令是写到服务器上的ssh目录下,该目录下有文件authorized_keys保存了公钥内容。以后再登陆树莓派就无需录入密码了。

2.4 安装ros_arduino_bridge

将ros_arduino_bridge功能包上传至树莓派,并在PC端通过键盘控制小车的运动了,实现流程如下:

1.系统准备;
2.程序修改;
3.从PC端上传程序至树莓派;
4.分别启动PC与树莓派端相关节点,并实现运动控制。
2.4.1 系统准备

ros_arduino_bridge是依赖于python-serial功能包的,请先在树莓派端安装该功能包,安装命令:

$ sudo apt-get install python-serial

$ sudo pip install --upgrade pyserial
$ sudo easy_install -U pyserial
2.4.2 程序修改

ros_arduino_bridge的ROS端功能包主要是使用 ros_arduino_python,程序入口是该包launch目录下的arduino.launch文件,内容如下:

<launch><node name="arduino" pkg="ros_arduino_python" type="arduino_node.py" output="screen"><rosparam file="$(find ros_arduino_python)/config/my_arduino_params.yaml" command="load" /></node>
</launch>

需要载入yaml格式的配置文件,该文件在 config 目录下已经提供了模板,只需要复制文件并按需配置即可,复制文件并重命名,配置如下:

# For a direct USB cable connection, the port name is typically
# /dev/ttyACM# where is # is a number such as 0, 1, 2, etc
# For a wireless connection like XBee, the port is typically
# /dev/ttyUSB# where # is a number such as 0, 1, 2, etc.port: /dev/ttyACM0 #视情况设置,一般设置为 /dev/ttyACM0 或 /dev/ttyUSB0
baud: 57600 #波特率
timeout: 0.1 #超时时间rate: 50
sensorstate_rate: 10use_base_controller: True  #启用基座控制器
base_controller_rate: 10   # For a robot that uses base_footprint, change base_frame to base_footprint
base_frame: base_footprint #base_frame 设置# === Robot drivetrain parameters
wheel_diameter: 0.065 #车轮直径
wheel_track: 0.21 #轮间距
encoder_resolution: 3960#编码器精度(一圈的脉冲数 * 倍频 * 减速比)
#gear_reduction: 1 #减速比
#motors_reversed: False #转向取反# === PID parameters PID参数,需要自己调节
Kp: 5
Kd: 45
Ki: 0
Ko: 50
accel_limit: 1.0# === Sensor definitions.  Examples only - edit for your robot.
#     Sensor type can be one of the follow (case sensitive!):
#      * Ping
#      * GP2D12
#      * Analog
#      * Digital
#      * PololuMotorCurrent
#      * PhidgetsVoltage
#      * PhidgetsCurrent (20 Amp, DC)sensors: {#motor_current_left:   {pin: 0, type: PololuMotorCurrent, rate: 5},#motor_current_right:  {pin: 1, type: PololuMotorCurrent, rate: 5},#ir_front_center:      {pin: 2, type: GP2D12, rate: 10},#sonar_front_center:   {pin: 5, type: Ping, rate: 10},arduino_led:          {pin: 13, type: Digital, rate: 5, direction: output}
}
2.4.3 程序上传

请先在树莓派端创建工作空间,在PC端进入本地工作空间的src目录,调用程序上传命令:

scp -r ros_arduino_bridge/ 树莓派用户名@树莓派ip:~/工作空间/src

在树莓派端进入工作空间并编译:

colcon build
2.4.4 测试

树莓派端:启动 ros_arduino_bridge 节点:

roslaunch ros_arduino_python arduino.launch

PC端:启动键盘控制节点:

rosrun teleop_twist_keyboard teleop_twist_keyboard.py

如无异常,现在就可以在PC端通过键盘控制小车运动了,并且PC端还可以使用rviz查看小车的里程计信息。

三、树莓派安装ROS

在树莓派上搭建ROS环境需要两步实现:1.在树莓派上安装Ubuntu;2.基于Ubuntu安装ROS
版本选择:Ubuntu选用18.04;ROS选用melodic;树莓派选用4b。

3.1 Ubuntu安装

3.1.1 硬件准备
树莓派
读卡器
TF卡(建议16G以及以上)
显示屏或 HDMI采集卡 以及配套的数据线
鼠标键盘
网线
3.1.2 软件准备

Ubuntu18.04下载并解压,下载地址:https://ubuntu-mate.org/download/

win32 Disk Imager烧录软件下载并安装,下载地址:https://sourceforge.net/projects/win32diskimager/

如果TF卡已有内容,在使用之前需要执行格式化,比如可以使用SD Card Formatter,下载地址:SD Memory Card Formatter for Windows/Mac | SD Association

3.1.3 系统烧录
1.将TF卡插入读卡器,读卡器插入计算机;
2.如果TF卡已有内容,请先格式化(如无数据,此步骤略过);
3.启动win32 Disk Imager,选择先行下载的Ubuntu18.04镜像并写入TF卡;
3.1.4 系统安装

1.系统启动以及登录:取下TF卡插入树莓派,连接网线,启动树莓派,启动时是命令行界面,登陆使用默认账号密码。

默认账号:ubuntu
默认密码:ubuntu
还需要根据提示修改密码。
更改密码后,系统安装完毕,不过此时是命令行式操作,下一步需要安装桌面。

2.桌面安装:为了安装方便,建议使用ssh远程登录(需要先安装ssh3)

首先,调用命令: ifconfig 获取树莓派的 ip 地址;然后,远程调用 ssh ubuntu@ip地址登录;接下来,可以直接安装桌面,但是为了提高安装效率,建议更换下载源,使用国内资源。

阿里云源

deb https://mirrors.aliyun.com/ubuntu-ports/ disco main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu-ports/ disco main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu-ports/ disco-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu-ports/ disco-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu-ports/ disco-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu-ports/ disco-updates main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu-ports/ disco-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu-ports/ disco-backports main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu-ports/ disco-proposed main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu-ports/ disco-proposed main restricted universe multiverse

中科大源

deb https://mirrors.ustc.edu.cn/ubuntu-ports/ disco main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu-ports/ disco main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu-ports/ disco-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu-ports/ disco-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu-ports/ disco-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu-ports/ disco-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu-ports/ disco-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu-ports/ disco-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu-ports/ disco-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu-ports/ disco-proposed main restricted universe multiverse

清华源

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ disco main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ disco main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ disco-updates main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ disco-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ disco-backports main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ disco-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ disco-security main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ disco-security main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ disco-proposed main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ disco-proposed main restricted universe multiverse

修改/etc/apt/sources.list文件,将上述资源的任意一个复制进文件。

sudo nano /etc/apt/sources.list

最后,安装桌面环境(可选择:xubuntu-desktop、lubuntu-desktop、kubuntu-desktop)

sudo apt-get install ubuntu-desktop

3.重启桌面安装完毕

4.同步时间:默认情况下,树莓派系统时间是格林威治时间,而我们处于东八区,相差八个小时,需要将时间,设置为北京时间。在/etc/profile文件中增加一行export TZ='CST-8' ,并使文件立即生效,执行命令:

source /etc/profile. /etc/profile

3.2 ROS安装

在树莓派上安装ROS与PC上安装流程类似:

3.2.1 配置软件与更新

首先打开“软件和更新”对话框,具体可以在 Ubuntu 搜索按钮中搜索。打开并配置(确保勾选了"restricted", "universe," 和 "multiverse."),可参考PC实现。

3.2.2 设置安装源

官方默认安装源:

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

或来自国内中科大的安装源

sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'

或来自国内清华的安装源

sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
3.2.3 设置key
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
3.2.4 安装

首先需要更新 apt(以前是 apt-get, 官方建议使用 apt 而非 apt-get),apt 是用于从互联网仓库搜索、安装、升级、卸载软件或操作系统的工具。

sudo apt update

然后,再安装所需类型的 ROS:ROS 多个类型:Desktop-FullDesktopROS-Base。由于在分布式架构中,树莓派担当角色较为简单,在此选择 Desktop 或 ROS-Base 安装

sudo apt install ros-melodic-desktop
3.2.5 环境配置

配置环境变量,方便在任意 终端中使用 ROS。

echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
3.2.6 构建软件包的依赖关系

到目前为止,已经安装了运行核心ROS软件包所需的软件。要创建和管理您自己的ROS工作区,还需要安装其他常用依赖:

sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential

安装并初始化rosdep,在使用许多ROS工具之前,需要初始化rosdep。rosdep使您可以轻松地为要编译的源安装系统依赖:

sudo apt install python-rosdep

使用以下命令,可以初始化rosdep。

sudo rosdep init
rosdep update

注意:安装ROS过程可全程参考PC端实现。 


http://www.ppmy.cn/server/158059.html

相关文章

[人工智能自学] Python包学习-numpy

由于我并非该专业&#xff0c;我在学习之前google了几个比较靠前的人工智能学习路径&#xff1a; https://github.com/tangyudi/Ai-Learn https://github.com/apachecn/ai-roadmap/blob/master/ai-union-201904/README.md https://marlous.github.io/2019/01/18/%E4%BA%BA%E5%B…

《Spring Framework实战》9:4.1.4.依赖注入

欢迎观看《Spring Framework实战》视频教程 典型的企业应用程序不是由单个对象&#xff08;或Spring术语中的bean&#xff09;组成。即使是最简单的应用程序也有几个对象协同工作&#xff0c;以呈现最终用户所认为的连贯应用程序。下一节将解释如何从定义多个独立的bean定义到一…

Linux电源管理——Suspend-to-Idle(s2idle) 流程

目录 一、常见的 Suspend 方式 1、Suspend-to-idle 2、Standby 3、Suspend-to-RAM 4、Hibernation 二、代码分析 1、state_store 2、suspend_enter 3、s2idle_loop 4、idle loop 5、psci_enter_idle_state 6、cpu_suspend 7、开始 resume 流程 8、开启 IRQ 中断…

LeetCode热题100-环形链表【JavaScript讲解】

题目&#xff1a; 题解&#xff1a; 使用哈希表来跟踪访问过的节点&#xff0c;使用一个while循环遍历链表&#xff0c;直到current为null&#xff0c;即到达链表的末尾。在每次循环中&#xff0c;首先检查visited哈希表中是否已经存在当前节点current。如果存在&#xff0c;说…

每日一题(二):判断一个字符串是否是另一个字符串的排列

目录 一、题目 二、题目分析 &#xff08;一&#xff09;明确需求 &#xff08;二&#xff09;分析思路 三、将思路转变为一个程序 C代码 C代码 注释&#xff1a; 四、总结 一、题目 实现一个算法来识别一个字符串str2是否是另一个字符串str1的排列。 排列的解释如下&#x…

Java 模板变量替换——字符串替换器(思路Mybatis的GenericTokenParser)

Java 模板变量替换——字符串替换器&#xff08;思路Mybatis的GenericTokenParser&#xff09; 思路字符串替换器 思路 模板变量替换无非是寻找出字符串&#xff08;模板&#xff09;中的特殊标记&#xff0c;用对应的变量进行字符串替换。 提到变量替换&#xff0c;大家第一能…

天气app的收获

天气app的收获 无论如何&#xff0c;是基于MVC模式&#xff0c;但都是从UI页面开始设计&#xff0c;然后根据输入的城市名称&#xff0c;将其传入到model层&#xff0c;进行相对应的处理。 对于controler层&#xff0c;需要通过一些协议完成一些输入的反馈&#xff0c;例如输…

Codeforces Round 995 (Div. 3)【题解】D ~ G

比赛地址传送门 D.Counting Pairs 注意到确定一个数后&#xff0c;第二个数可以一个范围内任选。故排序二分查找上下界后计数 #include <bits/stdc.h> #define int long long using namespace std; typedef pair<int, int> PII; const int N 4e5 10;int n, x, …