香橙派3LTS部署ROS2阿克曼开源平台

news2024/11/20 15:20:01

1.系统镜像下载

  1. 这里我们需要安装ROS2的humble版本,需要ubuntu 22.04版本的系统。

  2. 香橙派镜像下载:http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-3-LTS.html

  3. 点击Ubuntu镜像,选择jammy桌面版或者服务器版,如下图所示

2.系统镜像安装

  1. 插入读卡器,使用SD Card Formatter软件 格式化SD卡
  2. 选好盘符,点击Format,点击弹窗确认,如下图所示:

  1. 打开Win32Disklmanger软件,然后选择 你需要安装的*.img文件,点击写入,等待写入完成,如下图所示:

3.配网以及xshell连接香橙派

  1. 香橙派连接wifi,获得IP地址
  2. 客户端和香橙派连接同一个局域网
  3. 打开xshell,新建一个链接
  4. 用户名:orangepi ,密码:orangepi

4.环境准备

# 0. 可通过配置选择关闭桌面版 (非必选)
sudo orangepi-config 

# 1. ROS2安装
wget http://fishros.com/install -O fishros && . fishros   # 1 、1、2、3、1、2

# 2. 安装键盘控制功能包
sudo apt-get install ros-humble-teleop-twist-keyboard

# 3. 安装机器人描述功能包需要使用的相关功能包
sudo apt-get install ros-humble-xacro 
sudo apt-get install ros-humble-joint-state-publisher

# 4. 卸载brltty程序,防止ttyUSB端口被占用
sudo apt-get purge brltty   # 删除端口占用

# 5. 安装boost,串口通信程序需要,香橙派版默认没有安装
sudo apt-get install libboost-dev 

# 6. reboot,到这里环境就准备ok了。
reboot

## -----------------------------------------------------------------------------------
## 若出现包更新错误
E: 读错误 - read (5: 输入/输出错误)
E: 无法解析或打开软件包的列表或是状态文件。


# 英文是:

E:Read error - read (5 Input/output error),
E:The package lists or status file could not be parsed or opened.

刚开始是以为分区有错,所以用ubuntu的启动盘运行fsck -f /dev/sdX,检查根目录分区,但是问题依旧。

# 解决办法是:

sudo rm /var/lib/dpkg/status
sudo cp /var/lib/dpkg/status-old  /var/lib/dpkg/status
sudo rm -rf /var/lib/apt/lists/*

sudo apt-get update

# 问题解决。
## -----------------------------------------------------------------------------------

5.阿克曼小车驱动功能包相关准备

1.打开一个终端,新建ROS2工作空间文件夹

mkdir -p ~/ros2_ws/src

2.将分享的ROS2相应的功能包文件拷贝到src目录下

## 拷贝后文件结构如下
.
└── src
    ├── mbot_bringup
    ├── mbot_description
    └── sllidar_ros2-humble

3.打开终端,进入工作空间目录下,编译功能包

cd ~/ros2_ws
colcon build # 一起编译,若出现编译错误,可以单个单个编译功能包

colcon build --packages-select mbot_description
colcon build --packages-select mbot_bringup
colcon build --packages-select sllidar_ros2

编译成功后,终端将打印类似如下的信息

Starting >>> mbot_bringup
Starting >>> mbot_description
Starting >>> sllidar_ros2                                                        

Finished <<< mbot_bringup [2.16s]                                                          Finished <<< sllidar_ros2 [2.46s]                                                        
Finished <<< mbot_description [5.35s]

Summary: 3 packages finished [7.67s]

4.刷新环境

source ~/ros2_ws/install/setup.bash

5.设置工作空间刷新环境(一劳永逸)

echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc

6.香橙派端口号配置

1.打开终端,在/etc/udev/rules.d/目录下,新建一个名为99-robot-usb.rules文件

cd /etc/udev/rules.d/
sudo vi 99-robot-usb.rules

2.将如下内容复制到文件中

KERNELS=="1-1", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="mbot",MODE:="0777"
KERNELS=="6-1", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK+="lidar",MODE:="0777"
KERNELS=="5-1", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK+="camera",MODE:="0777"

**一定要注意:**否则运行程序时,会提示找不到端口

单片机串口的端口:命名为mbot

激光雷达驱动的端口:命名为lidar

3.然后根据你的实际情况更改,KERNELS、idVendor、idProduct对应的值。

这里主要参考我的这篇文章:linux系统下串口设备和串口号绑定

详细的细节如下:

1.问题由来

​ 在ROS小车的开发过程中,需要使用ROS通信串口模块、激光雷达的串口模块、IMU的串口模块等,为了防止每次开机这些设备的串口号发生变动,所以需要对串口号与串口设备绑定;为了更好的识别串口,我们也可以对串口号进行设置静态名称;为了更好的使用串口,我们也可以对串口进行权限设置。

一次设置,终身受益。

2.原理

在linux系统下,虽然每一个固定的端口可能由于外接设备启动的时间差异分配的ttyUSB*不同,但是对于每一个固定的端口,都有固定的 KERNELS、idProduct、idVendor,并且每一个端口的KERNELS都不相同。

所以,我们只要固定串口设备的安装位置,还是可以从端口物理性质的不同解决这个问题。

3.方法

第一步:如何查询每一个端口的KERNELS、idProduct、idVendor?

这里需要使用下面这条命令

udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)

并且当每次独立插入一个串口设备时,串口号总为/dev/ttyUSB0,若不放心,可以使用下面命令查询

ls /dev | grep ttyUSB

使用第一条命令,窗口将打印一堆设备信息,我们只需要KERNELS、idProduct、idVendor,我们向下滑找到类似下图的部分找到该端口的信息。

**注意:**查询端口信息时,请单独插入串口设备。

第二步:在/etc/udev/rules.d/目录下创建自己的99-*.rules文件

比如这里创建99-robot-usb.rules文件,使用如下命令

sudo vim /etc/udev/rules.d/99-robot-usb.rules

填入如下内容,保存

KERNELS=="3-2", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="robot",MODE:="0777"

对上述的解释

==”:比较键、值,若等于,则该条件满足;
“+=”:为一个表示多个条目的键赋值。
“:=”:对一个键赋值,并拒绝之后所有对该键的改动。目的是防止后面的规则文件对该键赋值。

第三步:重启并查看配置是否生效

重启

sudo reboot

等待开机,查看端口

ll /dev | grep ttyUSB

中断打印出如下信息,设置成功

lrwxrwxrwx   1 root root           7 Sep 20 22:30 robot -> ttyUSB0
crwxrwxrwx   1 root dialout 188,   0 Sep 20 22:30 ttyUSB0

之后我们再使用该物理位置的端口时,它的串口号就固定为 /dev/robot,并且具有可读可写可执行的权限。

注意事项:

以上只是对一个端口设置的流程,大家在多数情况下都是多个设备。聪明的你,一定知道怎么举一反三。

每次独立插入一个串口设备,获得它的KERNELS、idProduct、idVendor值,记录下来;在/etc/udev/rules.d/目录下创建自己的99-*.rules文件,一次性填入这些设备的信息以及你需要的映射的名字;然后重启即可。

7.启动功能包测试

此时,需要具备的条件

1.线路都链接正确且正常(单片机->香橙派)(激光雷达->香橙派)

2.单片机正常且烧录好程序

这里我们准备了两个launch文件,一个含激光雷达,一个不含激光雷达

mbot_with_lidar_launch.py
mbot_launch.py

以运行含激光雷达的launch文件举例,在终端输入如下指令:

ros2 launch mbot_bringup mbot_with_lidar_launch.py

终端打印如下就是正常启动了

[mbot_bringup-1] [INFO] [1666446425.232926736] [mbot_bringup]: y_:-0.006942
[mbot_bringup-1] 
[mbot_bringup-1] [INFO] [1666446425.233090570] [mbot_bringup]: th_:338.204911
[mbot_bringup-1] 
[mbot_bringup-1] [INFO] [1666446425.253658500] [mbot_bringup]: dt:0.021006
[mbot_bringup-1] 
[mbot_bringup-1] [INFO] [1666446425.253865001] [mbot_bringup]: x_:-0.004255
[mbot_bringup-1] 
[mbot_bringup-1] [INFO] [1666446425.253914877] [mbot_bringup]: y_:-0.006942

8.总结

以上的内容主要讲述的,在获取的阿克曼开源平台后,如何快速的部署软件代码的过程讲解。

如果你感觉,我的文章比较适合你,关注我,点个赞,给你不一样的惊喜。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/328.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【linux】进程概念详述

进程概念一、冯诺依曼系统二、操作系统2.1 OS层次图2.2 操作系统的意义2.2.1 系统调用与库函数的区别2.3 管理的理解三、进程3.1 进程的概念3.2 描述进程-PCB3.3 进程和程序3.4 PCB内容3.4.1 查看进程3.4.2 标识符3.4.3 状态3.4.4 程序计数器3.4.5 记账信息3.4.6 上下文信息❗️…

1.极限与连续-——“机器学习中的数学”

1.通过集合相等来讲解什么是映射关系 上面问的这个问题&#xff08;2N N2&#xff09;说明了什么&#xff1f; ——两个无穷集合&#xff0c;如果能找到一种对应关系&#xff08;映射关系&#xff09;&#xff0c;那么我们就可以说这两个集合是等价的。 数列的极限就是趋势 …

字符串转二叉树

一. 题目介绍 二. 题目分析 首先 题目让我们以先序遍历的方式用字符串建立一个二叉树 输入是一个字符串 输出是是以中序遍历二叉树打印 我们先来看最简单的输入 这里只要建立一个字符数组 然后等测试用例输入就好了 // 接受输入值char arr[100]{0};scanf("%s",…

网络原理 --- 传输层Ⅳ TCP协议中的延迟应答、捎带应答、面向字节流、TCP中的异常处理

文章目录网络原理传输层TCP协议7.延迟应答8.捎带应答9. 面向字节流10.TCP中的异常处理总结网络原理 介绍TCP/IP协议中每一层里面的核心内容~ 应用层传输层网络层数据链路层物理层 传输层TCP协议 7.延迟应答 提高传输效率的机制 又是基于流量控制,来引入的提高效率的机制 实…

数据在内存中的存储

目录 数据在内存中的存储&#xff1a;&#xff1a; 整型及其浮点型存储方式: 1.数据类型介绍 2.整形在内存中的存储&#xff1a;原码 反码 补码 3.大小端字节序介绍及判断 4.浮点型在内存中的存储 5.两道经典指针选择题 C语言编程训练(牛客网) 1.喝汽水问题 2.字符串逆序 3.打…

Python编程运算符 ——算数运算符

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.运算符 1.在Python运算符中分为 2.算数运算符 3.比较重要的运算符 4…

网络原理——No.1 传输层_TCP的确认应答机制与超时重传

JavaEE传送门JavaEE JavaEE——网络原理_应用层 网络原理——传输层_UDP 目录传输层TCPTCP 的基本特性确认应答机制超时重传传输层 端到端之间的传输, 重点关注的是起点和终点 核心的协议有两个: UDP: 无连接, 不可靠传输,面向数据报, 全双工 TCP: 有链接, 可靠传输, 面向字…

黑猫带你学UFS协议第11篇:什么是逻辑单元(LU)与逻辑块(Sector)

本文依据UFS3.1 JEDEC协议及个人工作经验整理而成,如有错误请留言。 文章为个人辛苦整理,付费内容,已加入原创维权,禁止私自转载。 文章所在专栏:《黑猫带你学:UFS协议详解》 1 LU简介 我们对与UFS、emmc一类存储芯片,最重要的功能是什么?无非就是存数据和取出数据,也…

神经网络的输入稀疏矩阵,神经网络中的矩阵运算

1、BP神经网络模型各个参数的选取问题 样本变量不需要那么多&#xff0c;因为神经网络的信息存储能力有限&#xff0c;过多的样本会造成一些有用的信息被丢弃。如果样本数量过多&#xff0c;应增加隐层节点数或隐层数目&#xff0c;才能增强学习能力。 一、隐层数 一般认为&am…

牛客前端刷题(九)—— 打包篇

还在担心面试不通过吗&#xff1f;给大家推荐一个超级好用的刷面试题神器&#xff1a;牛客网&#xff0c;里面涵盖了各个领域的面试题库&#xff0c;还有大厂真题哦&#xff01; 赶快悄悄的努力起来吧&#xff0c;不苒在这里衷心祝愿各位大佬都能顺利通过面试。 面试专栏分享&a…

greenplum 源码解析 FTS辅助进程--ReadMe

简介 在greenplum数据库中master节点有一个专属进程Fault Tolerance Service (FTS: 容错服务)&#xff0c;其主要功能是检测所有segment节点的健康信息&#xff0c;如果其检测到segment节点的primary出现异常[硬件故障/宕机]&#xff0c;会在第一时间将其对应的mirror提升为新的…

MySql(50)MySQL日志

文章目录MySQL支持的日志日志类型日志的弊端慢查询日志(slow query log)通用查询日志查看当前状态启动日志永久启动临时启动查看日志删除\刷新日志错误日志(error log)删除\刷新日志二进制日志(bin log)查看默认情况日志参数设置查看日志使用日志恢复数据删除二进制日志PURGE M…

vue3 响应式对象的 api ,你全用过了吗?

文章目录Ⅰ. ref、reactive ( 递归监听 )Ⅱ. isRef、isReactive ( 判断 )Ⅲ. toRef 和 toRefs ( 解构 )Ⅳ. toRaw 、 markRaw ( 解除代理)Ⅴ. unref ( 拷贝 )Ⅵ. shallowRef 、shallowReactive&#xff08; 非递归监听 &#xff09;Ⅶ. triggerRef &#xff08;强制更新&#x…

红黑树原理及旋转

红黑树&#xff0c;本质上来说就是一棵二叉查找树 但它在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡 保证了红黑树的查找、插入、删除的时间复杂度最坏为O(log n) 但它是如何保证一棵n个结点的红黑树的高度始终保持在h logn的呢&#xff1f;这就引出了红黑…

相似度_对抗学习:SimCSE: Simple Contrastive Learning of Sentence Embeddings

SimCSE: Simple Contrastive Learning of Sentence Embeddings 这篇论文&#xff0c;我觉得有意思。在创造对抗学习的正负例时&#xff0c;正例直接使用它本身。将同一个句子传递给预先训练好的编码器两次&#xff1a;通过应用两次dropout&#xff0c;我们可以得到两个不同的嵌…

云计算基础:云计算越来越广泛,我们应该如何去学习云计算

随着时代的发展&#xff0c;云计算越来越普及&#xff0c;越大众化&#xff0c;使用的人越来越多&#xff0c;我们应该如何去学习这门技术呢?这篇文章我们就来介绍如何学习我们的云计算。 学前介绍&#xff1a; 学前介绍 学习资料&#xff1a;HedEX Lite、产品文档、笔记、P…

非科班程序员被裁员后反而涨薪了200%,这两个月他都经历了哪些?

今年年初开始&#xff0c;裁员潮一浪接着一浪翻滚而来&#xff0c;让互联网人胆颤心惊&#xff0c;时刻担心下一波裁员是否就要降临到自己身上。 小帅&#xff08;化名&#xff09;是一个原本月薪8k&#xff0c;在小外包公司做政府项目的一名普通员工&#xff0c;前不久就被裁员…

数据仓库建模(四):维度表的设计

数据仓库建模&#xff08;四&#xff09;&#xff1a;维度表的设计一、维度表的整体结构1.1 维度表的结构设计1.2 维度代理键1.3 自然键、超久键和超自然键1.4 下钻与上卷1.5 维度退化1.6 非规范化的扁平维度1.7 多层次维度1.8 维度属性的标识与状态信息1.9 维度表中的空值属性…

趣学算法(2)

14天阅读挑战赛 目录前言一 几类时间复杂度二 兔子数列1.问题分析2.方法13.方法24.方法3最后前言 这篇文章是《趣学算法》的读书笔记&#xff0c;也对数据结构与算法的初步介绍&#xff0c;阅读这篇文章&#xff0c;我会带你改进一个算法。 一 几类时间复杂度 常见的算法时间复…

Vue项目的记录(十三)

1.登录注册静态组件 assets这个文件夹放所有的组件公用的静态资源 在样式当中也可以使用符号&#xff0c;&#xff08;src目录的别名&#xff09;&#xff0c;要注意的是在前面你加上~ 2.注册业务 这里的验证码&#xff0c;正常来说应该是要后台发送到用户手机上&#xff0c…