0%

ROS1环境

匹配机器人和笔记本电脑的网络

让笔记本电脑和机器人内部的机载电脑连上相同的局域网络。

下面分别配置电脑和机载电脑的/etc/hosts 文件

使用hostname 分别查看笔记本电脑和机载电脑板的系统主机名。
使用ifconfig 分别查看笔记本电脑和机载电脑的IP地址。
使用sudo vim /etc/hosts打开电脑的/etc/hosts文件,添加机载电脑的主机名和IP地址。
完成的效果如下:

1
2
3
4
5
6
7
8
9
10
11
127.0.0.1	localhost
127.0.1.1 kevin-Vostro-5568

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

192.168.10.87 my_robot #该条为添加内容

my_robot 为机载电脑的主机名(由hostname命令获取)

同样的,在机载电脑上也修改/etc/hosts 文件,添加笔记本电脑的主机名和IP地址。效果如下:

1
2
3
4
127.0.0.1	localhost
127.0.1.1 my_robot
192.168.10.56 my_laptop #该条为添加内容

my_laptop 为笔记本电脑的主机名(由hostname命令获取)

阅读全文 »

下载OpenCV源码

OpenCV的release页面

Releases · opencv/opencv

选择相应的版本,下载源码

OpenCV3.4.14

下载opencv_contrib源码

找到与opencv版本一致的tag

https://github.com/opencv/opencv_contrib/tags

opencv_contrib

编译安装opencv

  1. 新建目录
1
mkdir ~/opencv_build && cd ~/opencv_build

把下载好的opencv和opencv_contrib放到opencv_build目录下。

添加代理到编译过程中的下载链接

阅读全文 »

vscode中的snippet功能简介

vscode的语言插件已经内置了一些snippet。例如:C++的插件。当你在编辑器里输入main时,会提示你可以插入的snippet。

img

但是也可以自己定义snippet,然后通过关键字来触发插入snippet

vscode支持非常多编程语言的snippet。通过ctrl+shift+p ,打开命令面板。输入snippet ,就能看到snippet的配置选项。

img

点击Configure User Snippets 后就可以选择配置哪种语言的snippet了。

img

点击语言名称可以生成相应语言的json文件。这个json文件就是用于维护snippet的。其中的cpp.json和python.json文件就是分别维护相应语言snippet的文件。snippet的内容可以按照语言类别来维护。在编辑器里插入时,vscode会检测当前编辑的是什么语言。当输入snippet的触发词时,只会触发对应语言的snippet。

阅读全文 »

C++ 标准库接口众多。在实际使用时如果不熟悉常常感到无从下手。阅读开源代码时,常常能看到使用C++新特性的优美代码,但却显得那么陌生。

如果你也遇到这样的问题。下面两个C++ API 网站正好是你需要的利器。

中文版C++ 参考手册

https://www.apiref.com/cpp-zh/index.html

img

这个网站已经支持到C++20了。

除此之外,网站内也有接口的示例代码,方便了解怎么使用。

阅读全文 »

建立Todo Tree

写代码时,常常需要标记某处是需要改动的。但是现在可能暂时没法处理。通常的习惯是,在相应的位置打上TODO,然后写明需要处理的内容。有时间后再回头处理。但是回头后怎么快速找到这些TODO的位置呢?

这里介绍VScode中的Todo Tree插件。它能自动帮你把现在工程里的TODO以文件树的形式显示在左侧边栏。

另一个TODO Highlight插件可以高亮TODOFIXME关键字。

Git插件

Git Graph

这个插件可以图形化显示分支的历史合并记录和commit内容。

ctrl+shift+p打开命令输入面板,输入git就能发现git graph了。

阅读全文 »

ROS2的通信中间件换成了DDS。这让我们可以精准地控制节点间的通信质量。通信效率也迎来了一次大的提升。

但是…

但是…

一个不小心,看到了类似这样的报错信息:

1
[WARN] [1644578813.965216245] [subscriber_qos_obj]: New publisher discovered on topic '/qos_test', offering incompatible QoS. No messages will be received from it. Last incompatible policy: RELIABILITY

本来好好的Rviz也显示不了雷达数据了。

这就是incompatible QoS搞的鬼!

两个节点的Qos设置不兼容将没法通信

阅读全文 »

这篇文章着重介绍自定义ROS2类型数据时,我们可以使用哪些基础类型。这也是我之前困惑的一个问题。所以这里简单汇总说明一下。关于消息、服务和动作接口的使用说明,请查看本次推送的第一篇推文。

自定义msg示例

定义msg数据和在C++中定义一个结构体是一样的。只是类型名称有些区别。然后不需要加分号。

1
2
3
4
Header header
float64 circle_x
float64 circle_y
float32[] ranges

自定义service数据示例

service数据包含两个部分:请求和应答。这两部分用---隔开。两部分数据可分别定义,并且可以为空类型(std_msgs/Empty)。

1
2
3
4
5
6
7
8
# Request 
geometry_msgs/PoseStamped goal
geometry_msgs/PoseStamped start
string planner_id
bool use_start # If true, use current robot pose as path start, if false, use start above instead
---
# Respond
nav_msgs/Path path
阅读全文 »

想早起,那得早睡。但具体几点睡比较好,那还真是有科学依据的。

你是否总在早上被闹钟惊醒后,感觉浑身乏力、脑袋昏沉?又或者明明睡了七八个小时,白天却还是打不起精神?其实,这很可能不是你睡得不够,而是睡眠节奏出了问题。

其实睡眠是有周期的,在完整的睡眠周期结束后起床,精神是最饱满的。

但很多人对睡眠的理解还停留在 “睡够时间就行”,但事实上,睡眠是一场有规律的循环之旅。我们的睡眠由浅睡眠、深睡眠和 REM 睡眠(快速眼动睡眠)三个阶段组成,每个完整的循环大约持续 90-120 分钟。如果在循环中途醒来,哪怕总睡眠时间足够,也会觉得疲惫。

比如,成年人需要 7-9 小时睡眠,但有人睡了 8 小时却因为在深睡眠阶段被叫醒,反而比睡 6 小时但完整经历 4 个循环的人更累。

所以我们需要一款睡眠计算器来计算合适的睡觉时间,让睡眠高效又舒适。

睡眠计算器的核心作用,就是帮你避开 “打断循环” 的坑 —— 只要输入你的年龄和起床时间(或睡觉时间),它就能算出最适合的作息,确保你在睡眠周期的 “浅睡阶段” 醒来,起床后神清气爽。

阅读全文 »