最近有人问了我一个C语言中使用指针时遇到的问题。下面是一个简化后的代码示例。 #include <stdio.h> int fix_var = 90; void update_ptr(int *a) { int* temp = a; a = &fix_var; printf("adress of temp: %d \n", tem
这里介绍两个可以免费使用GPU的地方。 百度飞桨AI Studio 百度飞桨AI Studio提供的BML Codelab环境可以免费使用GPU。并且百度飞桨AI Studio中也开源了很多项目。只需要运行感兴趣的项目就会自动将该项目fork到自己的项目列表中。后面可在个人中心“我的项目”中查看。每天运行项目获得免费的GPU使用时长。 运行环境时会跳出可选的运行环境。 每日运行
Doxygen是一个代码文档生成工具。它从代码文件中提取注释并可生成多种文档形式。如:网页文档HTML,RTF (MS-Word),PDF等等。同时也可生成函数之间的调用和文件的依赖关系图表。 Doxygen除了支持C++语言外还支持C, Objective-C, C#, PHP, Java, Python, IDL (Corba, Microsoft, and UNO/OpenOffice f
你的机器人安全吗? ROS1中的通信数据基本是开放的。只要我们知道机器的IP。然后使用下面的命令在自己的笔记本电脑里声明一下机器人系统中ROS_MASTER ROS_MASTER 的地址。 export ROS_MASTER_URI="http://192.7.8.48:11311" export ROS_MASTER_URI="http://192.7.8.48:11311" 注
现在是信息爆炸时代,打开手机,各种文章扑面而来。我们的精力是有限的。如果有人帮忙把文章总结好给我们,这不就节省了很多时间嘛!我们也就可以阅读更多的文章了。 恰好大语言模型在总结文章方面非常有天赋。 下面来看看示例。 prod_review = """ Got this panda plush toy for my daughter's birthday, \ who loves it a
这节介绍大模型判断文字的语义,或者说对内容进行情感分析的能力。同时也演示了大模型如何提取出文字中的关键信息。 在传统的机器学习方案中,要做到对文字内容的情感分析,需要先对一系列的文字内容(如评论)进行人工标注。把这些文字内容人工分类成“正向”和负向“,然后再喂给一个机器学习模型去训练,得到一组参数。模型训练好后再部署好,把需要判断的未标注文字内容给到训练好的模型,让它判断一下文字内容的情感倾向。
大型语言模型的一个令人兴奋的方面是,你可以利用它来构建一个定制的聊天机器人,并且只需付出少量的努力。ChatGPT 的网页界面可以让你与一个大型语言模型进行对话。但其中一个很酷的功能是,你也可以利用大型语言模型构建你自己的定制聊天机器人,例如扮演一个人工智能客服代理或餐厅的人工智能点餐员的角色。本篇文章将揭晓如何做到这一点。 下面是两种调用OpenAI接口的函数。get_completion只支
文字扩展是将较短的文本片段,例如一组指令或主题列表,交给大型语言模型生成更长的文本,例如基于已有的内容生成一封电子邮件或一篇关于某个主题的文章的任务。又或者你列出大纲,标题,让大模型填充对应的内容。 另外,还有一些很好的用途,例如将大型语言模型用作头脑风暴的伙伴。 但这里必须要提醒的是,ChatGPT生成的内容不一定准确,所以使用的时候要认真甄别。比如著名的stack overflow网站就曾
当我们在调试程序时,通常很难一次就把程序正常跑起来。这是普遍现象。但我们会借助一些工具和手段,有步骤有流程地去调整程序,最终让程序按照我们想要的样子正常执行。 对于提示词来说也是一样的。当我们向ChatGPT提问时,一开始它给我们的答案可能并不理想。但是当我们逐步去调整提示词,慢慢地,它的回答就会接近我们想要的答案。 所以这里最重要的是我们如何去迭代提示词? 迭代提示词的框架 这个过程
在本篇文章中,我们将探讨如何使用大语言模型进行文本转换任务,例如语言翻译、拼写和语法检查、语气调整和格式转换。 翻译 ChatGPT接受多种语言的训练,使得模型具备翻译能力。以下是如何使用这种能力的一些示例。 prompt = f""" Translate the following English text to chinese: \ ```Hi, I would like to
下面是调用openai的completion接口的函数。但在本文中并不是重点。了解一下就好。 import openai import os from dotenv import load_dotenv, find_dotenv _ = load_dotenv(find_dotenv()) openai.api_key = os.getenv('OPENAI_API_KEY')
函数都写不好,确实有些丢人。如何把函数写的整洁呢?看了会书深有启发。 这里使用C++语言来作为示例,但对其他语言的函数书写也有借鉴意义。 函数书写的原则 写函数的第一规则是要短小。第二条规则是还要更短小。 下面是两段功能一致的代码,分别展示了不同的实现方式: 第一段代码将所有的实现都写在了一个函数里,实现了一个简单的计算平均值的功能: include <iostream>
优化问题描述 假设一个机器人初始起点在0处,然后机器人向前移动,通过编码器测得它向前移动了1m,到达第二个地点x1。接着,又向后返回,编码器测得它向后移动了0.8米。但是,通过闭环检测,发现它回到了原始起点。可以看出,编码器误差导致计算的位姿和观测到有差异,那机器人这几个状态中的位姿到底是怎么样的才最好的满足这些条件呢? 首先构建位姿之间的关系,即图的边: 线性方程组中变量小于方程的
desmos是一个网页工具。通过它,我们可以方便地查看复杂函数的图形,绘制数据表,解方程和进行函数动态分析等等。 工具网址: https://www.desmos.com/calculator?lang=zh-CN 图像示例 两点之间插值 https://www.desmos.com/calculator/td5cwbuocd?lang=zh-CN 抛物线和切线 https://
机器人软件系统中使用的通讯框架多种多样。比如,百度Apollo使用的Cyber RT,ROS1中的TCPROS/UDPROS通信机制,ROS2中使用的DDS等等。 下面介绍一种轻量,易用的通讯框架LCM(Lightweight Communications and Marshalling)。 LCM是一套用于消息传递和数据编码的库和工具,目标是构建高带宽和低延的实时通讯系统。它提供了一个发布/
下面的安装过程是在ubuntu20.04上进行的。 安装gnuplot需要依赖lua5.2。所以先安装lua5.2。 安装lua5.2 下载安装包 wget http://www.tecgraf.puc-rio.br/lua/ftp/lua-5.2.0.tar.gz 编译安装lua5.2 解压后进入源码目录 make linux sudo make install 安装g
你的机器人安全吗? ROS1中的通信数据基本是开放的。只要我们知道机器的IP。然后使用下面的命令在自己的笔记本电脑里声明一下机器人系统中ROS_MASTER的地址。 export ROS_MASTER_URI="http://192.7.8.48:11311" 注意,这里的ip(192.7.8.48)需要设成实际机器的ip。 这样我们就可以获取机器人系统的所有通信数据。 并且很危险的
byobu的图标像是中国的风屏,颇有中国风。哈哈! 官方网址: https://www.byobu.org/ Ubuntu下安装byobu sudo apt-get install byobu 运行byobu 安装好后在命令窗口中输入byobu即可。 Byobu常用快捷键 F2:新窗口 F3:前一个窗口 F4:后一个窗口 Ctrl + F2:垂直拆分窗口 Shi
什么是二次凸优化问题 可以转化成满足如下方程的优化问题被称为二次凸优化(QP)问题。 min_x 0.5 * x'Px + q'x s.t. l <= Ax <= u 其中P是对称正定矩阵。所以目标函数的全局最小值就是其极小值。在二维的情况下,目标函数的图像类似下面的图。这里大概有一个印象就好。约束类型可以是等式约束和不等式约束。当需要设置等式约束时可以将需要相等的行设置
这里记录一下使用cppcheck进行C++代码静态检测的方法和步骤。 本机安装cppcheck sudo apt-get update && sudo apt-get install cppcheck 使用cppcheck来检查代码 新建一个目录,并在目录中加入如下内容的cpp文件,用于测试静态代码分析工具。 测试代码 #include <iostream&g
下面的一个例子演示了两个节点之间如何实现零拷贝通讯。 注意,下面测试例子的ROS2版本为Galactic。 #include <chrono> #include <cinttypes> #include <cstdio> #include <memory> #include <string> #include <uti
C++ 标准库中的三种时钟 std::chrono::system_clock using namespace std::chrono_literals; const auto start = std::chrono::system_clock::now(); #include <iostream> #include <iomanip> #inc
ROS2的构建系统ament_cmake是基于CMake改进而来的。本篇文章我们详细介绍一下ament_cmake常用的语句。 一个功能包的诞生 使用ros2 pkg create <package_name>可以生成一个功能包的框架。 一个功能包的构建信息将会包含在CMakeLists.txt和package.xml这两个文件中。package.xml文件中包含该功能包的依
RRT与PRM一样,也是概率完备且不最优的。概率完备是指只要解存在就一定能在某一时刻找到。但解不一定是最优的。RRT与PRM相比,有一个优势就是,它在构建图的过程中就在寻找路径。 RRT的主要算法流程 这份基于matlab的代码很好的展示了RRT的算法流程: https://github.com/emreozanalkan/RRT RRT的优劣分析 优势: 相对于PRM更具有目
jenkins是老牌的CI/CD工具。下面记录一下在云服务器上的安装过程。 基于docker安装jenkins 下面记录了如何在云服务器上安装jenkins。 新建一个jenkins_docker文件夹,在文件夹里新建一个data文件夹。并给data文件夹读写权限。 chmod -R a+w data/ 新建一个docker-compose.yml文件。添加下面的内容: versi
下面介绍一下如何在ROS2节点中使用多线程。 使用多线程就涉及到回调组(CallbackGroup)了。 使用示例 创建回调组的函数如下: /// Create and return a callback group. RCLCPP_PUBLIC rclcpp::CallbackGroup::SharedPtr create_callback_group(
编译选项有很多,这里列出一些常用的编译选项设置,并说明作用。 指定使用的C++版本 set(CMAKE_CXX_STANDARD 17) 可以根据需求设置11, 14, 17, 20等等C++版本。 设置编译选项 add_compile_options(-Wall -Wextra -Wpedantic -Wno-unused-parameter -g) 告警选项:
我们使用backward_ros功能包来快速实现用GDB调试ROS2程序。 backward_ros功能包介绍 backward_ros功能包是对backward-cpp包的ROS2封装,以便可以简单快速地使用GDB工具。 backward-cpp包的介绍可以查看其仓库: https://github.com/bombela/backward-cpp 使用backward_ros功能包实
编译完ros2程序后,我们会发现install目录下有两个脚本local_setup.bash 和 setup.bash。执行程序前,通常需要source一下install目录下的脚本,以便环境变量准备就绪。这样ros2 run和ros2 launch就能找到对应的执行文件和依赖。 下面的内容是从setup.bash中截取出来的一段。可以发现它会先source一下/opt/ros/galacti
BehaviorTree.CPP是一个开源的C++行为树库。在游戏领域,行为树已经比较流行了。主要用于维护游戏角色的各种动作和状态。但在机器人领域还很少使用的。Navigation2中引入了行为树来组织机器人的工作流程和动作执行。 行为树是树状的结构,它的逻辑流程是由xml文件描述的。我们可以用其配套的工具Groot来可视化行为树。如下图所示: 行为树本身并不具体实现机器人的执行内容,它只
Navigation2整体架构 注意:下面的解释说明是以Navigation2 v1.0.12来进行的。其对应的ROS2版本为Galactic。 Nav2具有下列工具: ● 加载、提供和存储地图的工具(地图服务器Map Server) ● 在地图上定位机器人的工具 (AMCL) ● 避开障碍物从A点移动到B点的路径规划工具(Nav2 Planner) ● 跟随路径过程中控制机
安装Hexo 要使用Hexo必须先安装Git和Node.js。本文是在Ubuntu20环境下进行操作的。使用其它系统也可以将下面的操作作为参考。 安装Git sudo apt-get install git-core 安装Node.js 推荐安装当前最新版。不同的Hexo版本依赖不同版本的Node.js。下面是版本对照表。 这里建议安装Node.js最新稳定版。 Node.j
仿真系统简介 机器人的开发需要很多的测试。而测试就需要搭建场地。测试项目一多,需要的场地的形式也会更多。搭建这样的场地不仅成本高,耗费的人力和物力都相当可观。有些场景在真实环境中不容易出现,但却可以在仿真环境中制造出来。 通过对静态环境的模拟和动态环境的模拟,仿真系统可以帮助开发人员和测试人员触及到很多长尾的情况。而做到这些的代价要比在真实环境中的测试低很多,效率也更高。不管是服务机器人领域还
新一代的turtlebot终于来了。[撒花撒花] turtlebot是开源的低成本移动机器人平台,希望以低成本的方式帮助更多的开发者学习实践机器人技术。 这次发布的TurtleBot 4共有两个版本:TurtleBot 4 Standard和TurtleBot 4 Lite。 它们是以iRobot Create3作为移动底盘,配备了OAK-D摄像头和2D激光雷达。计算平台是Raspber
运行一个示例 安装依赖 sudo apt-get install ros-galactic-turtle-tf2-py ros-galactic-tf2-tools ros-galactic-tf-transformations pip3 install transforms3d 运行示例 在不同的命令窗口中运行下面的命令 启动小乌龟窗口 ros2 launch turtle
不知道阅读本篇文章的你有没有被环境配置搞的焦头烂额过? 想要验证一个功能包,但却需要安装各种依赖。装就装吧!但是安装的依赖可能更新本机中的一些配置或软件版本,导致过去可以运行的软件这么折腾一下后就不能再运行了。 这时可能又后悔又懊恼。严重的可能要重新安装电脑系统。 本文描述了一种在Docker环境中开发和调试ROS程序的方法。旨在解决环境配置和软件依赖给我们带来的困扰。 我们使用Docke
ROS2最新的5年长期支持版ROS 2 Humble Hawksbill 发布了。它是第一个运行在Ubuntu 22.04 (Jammy Jellyfish)上的版本。 介绍文章: https://discourse.ros.org/t/ros-2-humble-hawksbill-released/25729 ROS2 Humble Hawksbill版本新特性: https://
launch 文件 launch文件可以同时配置和启动多个ros节点。ROS2中的launch文件可以用Python、xml、yaml来写。 但ROS2中的Python launch文件更为灵活,功能也更加强大。可以用它执行一些其他的任务(比如新建目录,配置环境变量)。所以官方推荐的是使用python来写。而launch文件一般会放在功能包中的launch文件夹下面。如果想感受一下各种方式写l
建立Todo Tree 写代码时,常常需要标记某处是需要改动的。但是现在可能暂时没法处理。通常的习惯是,在相应的位置打上TODO,然后写明需要处理的内容。有时间后再回头处理。但是回头后怎么快速找到这些TODO的位置呢? 这里介绍VScode中的Todo Tree插件。它能自动帮你把现在工程里的TODO以文件树的形式显示在左侧边栏。 另一个TODO Highlight插件可以高亮TODO,FI
这篇文章着重介绍自定义ROS2类型数据时,我们可以使用哪些基础类型。这也是我之前困惑的一个问题。所以这里简单汇总说明一下。关于消息、服务和动作接口的使用说明,请查看本次推送的第一篇推文。 自定义msg示例 定义msg数据和在C++中定义一个结构体是一样的。只是类型名称有些区别。然后不需要加分号。 Header header float64 circle_x float64 circle_
本文介绍ROS2中话题和服务的内容。并配合示例代码来实践以便加深理解。 安装依赖 安装相应的工具: colcon 编译工具安装 sudo apt install python3-colcon-common-extensions git 设置colcon_cd,方便用colcon_cd 包名 快速打开到包的目录。需要在工作空间目录下使用,其他路径下使用会出现卡住的情况。 echo "
ROS1环境 匹配机器人和笔记本电脑的网络 让笔记本电脑和机器人内部的机载电脑连上相同的局域网络。 下面分别配置电脑和机载电脑的/etc/hosts文件 使用hostname 分别查看笔记本电脑和机载电脑板的系统主机名。使用ifconfig 分别查看笔记本电脑和机载电脑的IP地址。使用sudo vim /etc/hosts打开电脑的/etc/hosts文件,添加机载电脑的主机名和IP地址。
ROS2养成计划(一)发展历程和开发环境安装 ROS发展历程介绍 2006 年,无比好奇的一群人走在一起,组建了一个机器人研究实验室:柳树车库(Willow Garage) 2010年5月26日,人类历史上第一个机器人毕业典礼在硅谷这条蜿蜒的柳树街68号的小路旁,临时搭建的一座帐篷中举办。 四年思考的三个问题: 第一:为什么人类需要机器人? 斯科特·哈森的答案是:机器人可以帮助
Plotjuggler简介 PlotJuggler是一个类似于rqt_plot的基于Qt的数据可视化工具。但PlotJuggler拥有更强大和好用的功能。你可以导入文本文件让它显示文本文件中的数据。你也可以导入ros的bag包,它能自动解析bag包中的数据。并可以回放bag包的数据,然后用Rviz来显示数据。PlotJuggler的功能有很多,这里只介绍几种我常用的功能。应该足以应付日常的机器人
ROS2 中代码的更新与维护方法 安装vcs sudo apt-get install python3-vcstool 下载代码 #在ros2_ws目录下运行,代码会存在src目录下(以ros2仓库作为示例) mkdir -p ros2_ws/src cd ros2_ws vcs import src < ros2.repos 更新已经下载的代码 #在ros2_ws
ROS2的通信中间件换成了DDS。这让我们可以精准地控制节点间的通信质量。通信效率也迎来了一次大的提升。 但是… 但是… 一个不小心,看到了类似这样的报错信息: [WARN] [1644578813.965216245] [subscriber_qos_obj]: New publisher discovered on topic '/qos_test', offering incompa
下面的操作是基于galactic 代码下载 #安装git和编译工具 sudo apt-get install git python3-vcstool build-essential python3-colcon-common-extensions mkdir -p turtlebot3_ws/src cd turtlebot3_ws/ #下载turtlebot3代码 git cl
Costmap_2d 的插件 Costmap_2d 的插件都是继承于CostmapLayer。具体的关系如下图所示: StaticLayer StaticLayer内主要是通过接收map_server发布的地图话题来加载静态地图的。所以StaticLayer内是可以在线更改静态地图的。 ObstacleLayer ObservationBuffer ObservationBuffer
costmap是什么? costmap翻译过来是代价地图的意思。由SLAM算法生成栅格地图。我们为栅格地图中的每一个栅格分配一个代价值,这样就形成了costmap。路径规划算法则可以在具有代价的栅格地图上生成路径。规划路径的生成则是强依赖于代价值。为了生成合适的路径,我们需要为每个栅格分配合适的代价值。最开始想到的是在单层的costmap中更新每个栅格的代价,然后直接给路径规划算法。但这样会引起
C++ 标准库接口众多。在实际使用时如果不熟悉常常感到无从下手。阅读开源代码时,常常能看到使用C++新特性的优美代码,但却显得那么陌生。 如果你也遇到这样的问题。下面两个C++ API 网站正好是你需要的利器。 中文版C++ 参考手册 https://www.apiref.com/cpp-zh/index.html 这个网站已经支持到C++20了。 除此之外,网站内也有接口的示例代码
废话不多说,我们直接开始。 搭建测试环境 为了避免花太多时间折腾环境问题。这里使用Docker来跑测试的示例。 安装Docker # step 1: 安装必要的一些系统工具 sudo apt-get update sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-co
map的数据类型 map话题的类型是nav_msgs::msg::OccupancyGrid。使用下面的命令可以查询该类型的数据结构。 ros2 interface show nav_msgs/msg/OccupancyGrid nav_msgs::msg::OccupancyGrid的数据结构: # This represents a 2-D grid map std_msgs/H
对于Docker,我只想说早用早享受~ 安装Docker # step 1: 安装必要的一些系统工具 sudo apt-get update sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common # step 2: 安装GPG证书 curl -fsSL
下载OpenCV源码 OpenCV的release页面 Releases · opencv/opencv 选择相应的版本,下载源码 ![OpenCV3.4.14] 下载opencv_contrib源码 找到与opencv版本一致的tag https://github.com/opencv/opencv_contrib/tags 编译安装opencv 新建目录 mkd
查看Action 信息的常用命令Action主要用于长时间运行的任务。它们由三部分组成:目标、反馈和结果。 查看action列表 ros2 action list 查看action列表和类型 ros2 action list -t 查看action信息 ros2 action info <action_name> 显示action ros2 interfac
开发环境的建立 安装虚拟机和Ubuntu20 参考如下链接: https://fishros.com/d2lros2foxy/#/chapt2/2.1%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85_%E8%99%9A%E6%8B%9F%E6%9C%BA%E7%89%88%E6%9C%AC 安装VMware Tool Ubuntu 主机 https://k
有顺序的的启动节点,暂停节点,关闭节点是ROS1的一个痛点。因为在ROS1中节点启动是无序的。ROS1系统设计时并没有考虑节点启动时可能存在的互相依赖。 但在实际生产使用环境中,某些节点能正常工作是需要其他一些节点已经启动了的。 比如:需要定位功能能正常运行,前提是map_server节点已经正常加载地图文件并且已经把地图话题发布出来。 又或者你想从建图功能切到导航功能。在ROS1中,需要先
使用ros2 lifecycle --h命令可以看到lifecycle相关的命令有哪些。 获取LifecycleNode节点的状态 ros2 lifecycle get /lifecycle_node_demo_node 其中/lifecycle_node_demo_node为节点名称 设置LifecycleNode节点的状态 ros2 lifecycle set /lifecycl
一个帮大家填坑的机器人开发攻城狮。公众号:《首飞》
积分
粉丝
勋章
第三方账号登入
看不清?点击更换
第三方账号登入
QQ 微博 微信