ROS2学习笔记:C++最小支持Parameters的节点

通过如下命令新建一个package框架: ros2 pkg create –build-type ament_cmake –license Apache-2.0 cpp_parameters –dependencies rclcpp 支持Parameters的最小节点源代码: #include <chrono> #include <functional> #include <string> #include <rclcpp/rclcpp.hpp> using namespace std::chrono_literals; class MinimalParam : public rclcpp::Node { public: MinimalParam() : Node(“minimal_param_node”) { auto param_desc = rcl_interfaces::msg::ParameterDescriptor{}; param_desc.description = “This parameter is mine!”; this->declare_parameter(“my_parameter”, “world”, param_desc); timer_ = this->create_wall_timer( 1000ms, std::bind(&MinimalParam::timer_callback, this)); } void […]

ROS2学习笔记:C++最小支持Parameters的节点 Read More »

电波表调时区

前几天在老家看到墙上一块小时候就有的石英钟,好多年过去了走得还非常准,于是我问爸妈这块表哪儿来的,爸爸回答道是他当时从县里百货大楼买的,80块钱,日本表,年龄应该和我一样大了,并且还说不仅准还省电,一节5号电池用一两年。于是我又端详了一会儿,三十多年过去了,这块表依旧能感觉出来其真材实料的质感。想到我现在也有了自己的家,但是家里墙上一块表也没有,有想法我也有了买个能够经历岁月洗礼的挂钟的想法。 于是我从日本亚马逊直邮了一个SEIKO精工品牌的表,看照片就很喜欢,等拿到实物更加是觉得精美但又克制,是我期待的能够在家里用几十年的挂钟。 我买的这款可以接收送信所发出的无线电波实现时间校正,塔台虽在日本福岛和九州,可中国沿海大部分城市也能在空旷地方收到信号,我试了在北京也是能接收的,从而实现精准时间设置。可是自动对时有一个巨大的问题就是同步的时间是日本时间,和中国时差有1小时,所以“分秒”会很精确但是时间上比北京时间快一小时。 于是我得想办法调个时区。 首先将电池拆下再重新装回,在室内接收到电波之前,表针会自动回到12点时刻,此刻立刻再次拿掉电池。然后将背面的几个螺丝拆掉,这样子稍微晃一晃外边一圈的木框就能轻轻拿下来: 拆完木框后轻轻将表盘玻璃也可以扣开,该玻璃和表盘是通过双面胶固定的: 接下来就该调时区了,断电情况下,分针和秒针保持不变,将时针往前拨一小时,即将12点拨成11点: 再将玻璃片以及木框擦干净,原位装回,这样就时区调好啦: 最后装回电池,放在窗户边开阔处,等待电波同步,至此就一台非常精准北京时间的电波挂钟就设置完啦。拿在手里越看越喜欢我选的这个款式,你们觉得怎么样呀。  

电波表调时区 Read More »

在Jetson Orin Nano上基于Ollama私有化部署OpenClaw

媳妇工作需要调研AI,尤其OpenClaw在工作场景中的应用。不少帖子建议买个Mac Mini小巧省电24小时待机,我手头正好有个闲置的Nvidia Jetson Orin Nano 开发板,性能也强的很67 TOPS,打算拿来用作本地部署的载体。在此记录一下过程,小伙伴有闲置Jetson也可以参考一下利用起来。 对于一个新拿到手的Jetson Orin Nano Developer Kit,官方的NVIDIA SDK Manaer真是好使用,媲美树莓派的官方系统烧录工具,基本上就说鼠标点点点就行了。如果硬盘足够的话建议在工具页面将所有的依赖都一次性都勾上都安装好,省的系统装好后再费劲解决CUDA、cuCNN等依赖。 系统装好后,插上网线,从路由器端找一下IP,登录就可以开始装OpenClaw和基于Ollama的本地大模型了。先使用Ollama本地部署大模型,目前Ollama已经给Jetson适配过了从而调用GPU,如果看脚本中也可以看到对于Jetson使用的是Jetpack的环境而不是自己装的CUDA环境,直接运行就OK: curl -fsSL https://ollama.com/install.sh | sh 从安装进度可以看到过程中下载安装了Jeston独有的一些库: jetson@ubuntu:~$ curl -fsSL https://ollama.com/install.sh | sh >>> Cleaning up old version at /usr/local/lib/ollama >>> Installing ollama to /usr/local >>> Downloading ollama-linux-arm64.tar.zst ######################################################################## 100.0% >>> Downloading ollama-linux-arm64-jetpack6.tar.zst ######################################################################## 100.0% >>> Creating ollama user… >>> Adding

在Jetson Orin Nano上基于Ollama私有化部署OpenClaw Read More »

Copilot初始化技巧

最近的一个学习项目使用VS Code和Copilot为主要开发环境,Vibe Coding真是大大提高生产力,这个项目几乎99%的代码都是AI写的,整体来说是一个结伴编程的模式,我充当整体架构把控,AI帮我每个模块每个模块来实现。这个项目很复杂,持续了几个月,而VS Code的Copilot上下文很可怜,所以我充分使用了大量markdown文档记录进度记录plan,也用到了copilot-instructions.md 来让Copilot每次对话开始时主动读取一些规范性背景性得文档。可是实际用下来到你觉到大模型仅止步于此,并没有主动执行读各个模块的plan/progress的步骤。所以每次重启IDE后,模型感觉都很弱智,说了解背景也了解一点,但是不多。 解决首次开IDE后AI大模型对于记忆丢失的问题,一个解决方法是将项目重要背景以及当前进展写入copilot-instructions.md,但是这会使这个文件超级臃肿,另外一方面是我现在用到了,创建一个prompt脚本,每次新打开IDE手动运行一下,一方面让Copilot真正读一下其他的几个plan/progress文档,另一方面给我们一个当前状态的总结。 /session-start 使用这套模式主要是由于Copilot对于历史记忆做的不好,另外这套模式能够生效的一个前提是plan/progress文档能够及时且准备更新,我是通过一个skills完成的,当和大模型说特定命令,大模型就会逐个将模块中各自的以及项目整体的plan/progress根据当前的修改完成更新: 这是我使用VS Code Copilot的一些心得,如果对你有用,帮忙点个赞吧。      

Copilot初始化技巧 Read More »

Jetson Orin Nano安装Pytorch CUDA环境

最近在学习大模型在机器人上边的应用,想着通过一个能够自己设备训练的模型以及Jetson来体验一遍整个模型从训练到部署的全流程。前期都是在一台高性能工作站上边学习的,X86下对于配置环境以及解决依赖等问题相对还是好解决的,毕竟用户基数大。多数情况遇到的一些运行问题,结合大模型以及Github的评论区,很快就有解决方案的。之前了解到Jetson是英伟达自己出的产品,CUDA环境方面应该不是啥大问题,可事实真的很打脸,在我将模型训练摸索差不多,在服务器可以稳定运行后,打算挪到Jetson上边运行过程中真的费了好大的劲。于是我记录一下,说不定有其他朋友遇到同样的问题。 我拿来学习的是SmolVLA这个机器人大模型,使用的是最最常用的Pytorch框架,这个在Jetson上安装CPU版本很顺利,基本上从pip或者conda直接安装都OK,关键在对于Jetson的CUDA加速版本的Pytorch,由于是ARM架构而不是常见的X86, pip及conda库默认是没有的。想完全按照大模型指导推荐的版本安装几乎是不可能,我摸索了几天终于是找到了行得通的解决方案。 首先安装Jetson 平台专用的软件开发套件(SDK),通过这个过程可以装上绝大多的依赖库: sudo apt install nvidia-jetpack 然后通过命令检查当下的CUDA版本: nvidia-smi 最后在半官方的论坛安装编译好的适配Jetson ARM架构的Pytorch以及Torchvision包: pip install torch torchvision –index-url https://pypi.jetson-ai-lab.io/jp6/cu126 在上边步骤完成后,Python导入torch会提示有一个cuDSS相关的动态链接库找不到,从Nvidia官方论坛下载: https://developer.nvidia.com/cudss-downloads 至此已经可以在Jetson上使用CUDA加速版本的Torch来运行模型了。总结下来简单的几步,但是卡了我好几天,反思下来就说对大模型太过于依赖,甚至是过于信任大模型实时网页搜索的能力。可能是由于Jetson资源相对较少,被多数X86环境配置帖子稀释的原因,大模型给的绝大多数链接都是不能用的,要不货不对板好不失效。并且解决方向也有问题,遇到Pytorch 2.6找不到就推荐降级,而低版本的ARM版本CUDA Torch Torchvision也全网很难找到资源。可能Torch还好,对于Torchvision编译好的wheel包真的很少很少。在我找到https://pypi.jetson-ai-lab.io/jp6/ 半官方的资源站后,提供的是最新版Pytorch 2.10版本,安装后提示缺cuDSS相关的包,此时大模型给出的强烈建议是不要用最新的2.10版本torch,说唯一可行的就说用旧版本,因为2.10太新了缺乏的包绝大多数情况需要自己编译,这个在jetson本身条件下几乎不可能。我被说服了用了一整天时间找旧版本的包,真是找不到。没辙我去到了Nvidia官网看论坛,想着是这么常见的问题,不应该只有我遇到。果然翻了几个帖子就看到Nvidia官网已经提供了最新的cuDSS编译好的安装包。 想在这里感慨以下就是大模型用多了对于搜索引擎的使用能力都快倒退了。很多时候大模型对于网络资源搜索很有限,搜出来结果很肤浅,并且一些论坛似乎对于大模型也不友好,很多搜不到或者说需要登陆才能查看。对于一些相对小众的领域,感觉逛论坛寻找解决方案还是必不可少的,大模型并不是每个细枝末节都是专家,尤其涉及软硬件结合的,感觉coding工具发挥能力就被很大限制了。     Reference: https://pypi.jetson-ai-lab.io/ https://docs.nvidia.com/deeplearning/frameworks/install-pytorch-jetson-platform/index.html https://forums.developer.nvidia.com/t/jp-6-1-torchvision-error-when-built-from-source/314940 https://forums.developer.nvidia.com/t/problem-with-installing-torchvision-on-jetson-orin-nano/312860 https://forums.developer.nvidia.com/t/https-forums-developer-nvidia-com-t-installing-torch-and-torchvision-on-orin-nano-335317-u-joel-alejandro11366/346925/2 https://pypi.jetson-ai-lab.io/jp6/cu126 https://developer.nvidia.com/cudss-downloads?target_os=Linux&target_arch=aarch64-jetson&Compilation=Native&Distribution=Ubuntu&target_version=22.04&target_type=deb_local https://forums.developer.nvidia.com/t/help-me-with-correct-pytorch-and-torchvision-versions-requirement-for-jetpack-6-2-1-orin-super/343688/15 https://forums.developer.nvidia.com/t/pytorch-and-torvision-version-issue-runtimeerror-operator-torchvision-nms-does-not-exist/312446  

Jetson Orin Nano安装Pytorch CUDA环境 Read More »

OpenClaw一周体验

最近一只大龙虾在科技圈好火,甚至说早已出圈了,各种平时不是科技内容的公众号,也开始说这只无所不能,甚至“成了精的”了的龙虾。我初步用了一周时间,现在记录一下自己的体验。 我对于OpenClaw的理解是赋予了大模型本地电脑的命令执行能力,尤其通过Terminal这个接口,能做很多事情了,而不仅仅是之前聊聊天只是给用户一个建议,真正执行还需要用户自己去做。 首先是安装步骤,这个工具目前还远达不到常见软件的使用便利度,在终端安装并且通过命令行配置真会劝退很多人,后边还涉及模型接入和Skills补充,如果不是工科背景,真挺有挑战的。现在网上安装指导已经多如牛毛了,不是我要记录的重点,我想分享的,是这期间对多个模型不同能力的感受,并且我还是不是完全敢赋予它我本地电脑全部权限,现在我是将其部署在我的服务器上的,主要尝试其一些远程能协助我的功能。 从一开始到现在我相对深入尝试过5个模型:GPT-40, Claude Opus 4.6, Kimi 2.5, Kimi 2.5 Coding, Gemini-3-pro-preview,我在这几个模型中都尝试了这几个问题: 告诉我现在的金价/告诉我北京天气:测试工具联网搜索整合信息的能力; 给我每分钟告诉我一次天气/当前时间:测试工具集合大模型定时任务的效果 一开始用的是GPT-4o,主要是其在我的CoPilot订阅中免费(后来得知只是在VS Code中免费,像在OpenClaw中通过API也不免费),配置好后几轮沟通下来感觉像个智障,完全没有网上帖子说的神乎又神自己去解决问题的能力,而是连基本的能力都不会,我问个天气问不出来,最后给我编了一个,还好比较诚实后来告诉是编的。。。同时我让它给我设个定时任务,每1分钟给我发个消息,也搞不定。感觉如果说给我这样一个助力,我真的不敢用,给我收集信息不敢信的同时,对于提醒也收不到。 然后看OpenClaw官方说最最推荐的模型是Claude Opus 4.6,我订阅的CoPilot也可以使用这个模型,于是我切过去试了相同的问题,真正让我感受到不同的天赋真是不能比,因为是天与地的差别。我问了金价,并且让给我定时报时,真的是一次成功,没有任何的纠结可言,这让我稍微感受到了助理的感觉,同样我的环境没有做任何改变,只是换了一个模型,信息也能推送了,网络也能搜索了,而不像前一位GPT-4o同学,抱怨环境不好,抱怨工具有问题,然后任务没完成的同时,抛回给我一大堆问题让我去给他解决,而Claude Opus 4.6就像是一位很聪明的助力,咔咔咔不废话把任务完成(联网查询金价,通过飞书推送时间),然后顺便说了我的飞书配置有些问题,但是不影响当前的任务已经做完了。这感觉非常像职场上不同风格的下属了,把任务交给能力强的人比如Opus 4.6就很放心,即使中间有不少挑战(比如我配置的飞书有瑕疵),该下属也能灵活应变将其搞定从而完成任务。而把任务交给一个能力欠佳的人比如GPT-4o,推进途径遇到很多麻烦一次又一次回来麻烦领导,最后好多任务完不成(比如定时通知),好不容易完成的一个(比如查询天气),老板也不敢信任,因为那个天气真的是编的。。。 后来我又尝试了Gemini-3-pro-preview,像一个还算聪明,但是很马虎的下属。同样的问题,查询天气一次搞定,但是推送时间上,首先第一次推送到飞书,通道对了,但是给我推送的是欧洲柏林时间,我指出其问题后,时间确实改对了是北京时间了,但是又把这个信息推送到了trace而不是飞书,真是不靠谱。如果是这样的下属,我感觉至少是聪明,马虎的问题还是一定程度有解决的空间的。 最后我还试了Kimi 2.5 和Kimi Code,这两者差异不大,总体靠谱程度感觉介于Claude Opus 4.6和Gemini-3-pro-preview之间。上边两个问题基本OK,除了在时区上有点栽。 总结下来就最聪明的大模型在智能助手上感觉确实到了能有正收益的临界点,一些信息收集整理,真可以交给这位助手来解决。目前我是部署在服务器上,我感觉按照Claude Opus 4.6给我的正反馈,安装在自己个人电脑让其逐步开始帮我处理一些文件整理,材料整备等内容,真的是可以去信赖了。但是如果是GPT-4o我感觉会吓死人的,部署在自己电脑上指不定会出什么幺蛾子。我感觉这真的是像极了职场,老板招聘员工时候一方面很缺人一方面又招不来人,因为很多时候宁缺毋滥,让一个很蠢的人来帮自己做事,作为老板们可能还不如自己做。今天我一直以老板以领导的角度来思考问题,都快差点忘了我却是那个给老板打工的人,努力让自己成为Claude Opus,很很多时候感觉自己是GPT-4o。 在切换多个模型过程中,我还问了新模型有没有记得我对于OpenClaw的一些嘱咐,通过回答可以了解到OpenClaw对于用户个人信息其实就是将其总结然后存在本地的一个md文件中,在新的会话或者换了模型后,这些核心信息也会加载到与大模型沟通的内容中。这个过程是带提炼总结压缩的,尤其是上下文太长的时候,其中可能就会丢失信息,最近新闻提到一个安全专家的邮件都被删了,据说就是由于信息压缩把一些很重要内容搞丢了造成的。 再总结一下费用方面,对于OpenClaw部署,多数人是安装在自己的电脑上,也有一些人可能买了Mac Mini,(确实在把玩Skills发现如果在Mac工作环境下应该体验更好),这块应该投入还好,VPS也不贵,电脑大家都有,即使新买个Mac Mini也是一次性的。关键是大模型费用,真的挺烧Token挺贵的。我的CoPilot订阅是一个月10刀,Claude Opus 4.6是三倍Token用量,也就是说我10刀用100个来往交流就烧没了!事实上也是这样,我差不多用了两天,我的CoPilot就提示超额度了。。。其次我还尝试了Kimi,如果使用moonshot的API订阅的话,基本上每一次对话就是几毛钱的费用,不知道随着使用得越久上下文越长,每一次的沟通就是一个很夸张的费用。后来尝试了Kimi Code 49元/月的订阅,感觉比从moonshot订阅得到的额度大多了,其是按照周用量和频现来要求的,也比CoPilot合理很多。感觉是对于普通OpenClaw用户最合适的选择。 我的一周体验大致总结差不多了,给我的整体感受是这个真的是一个跨度很大的能力跃迁,并且成熟速度惊人OpenClaw几乎一天一更新,感觉用不了多长时间,就能够很大程度上成为普通用户友好的智能助手,投入到每天具体的牛马工作中。我的计划是继续在服务器用一段时间,然后在之后某个时间点将其引入我的个人电脑上,尝试提升我的效率,将一些我一直想做但是没时间做的事情,看看能否交给OpenClaw帮我完成。 大致就先记录到这里啦,如果你也最近对这只龙虾很上头,我们可以多交流交流,分享经验心得一起玩一起玩。

OpenClaw一周体验 Read More »

ROS2学习笔记:Python最小支持Parameters的节点

通过如下命令新建一个package框架: ros2 pkg create –build-type ament_python –license Apache-2.0 python_parameters –dependencies rclpy Python的示例代码为: import rclpy import rclpy.node class MinimalParam(rclpy.node.Node): def __init__(self): super().__init__(‘minimal_param_node’) self.declare_parameter(‘my_parameter’, ‘world’) self.timer = self.create_timer(1, self.timer_callback) def timer_callback(self): my_param = self.get_parameter(‘my_parameter’).get_parameter_value().string_value self.get_logger().info(‘Hello %s!’ % my_param) my_new_param = rclpy.parameter.Parameter( ‘my_parameter’, rclpy.Parameter.Type.STRING, ‘world’ ) all_new_parameters = [my_new_param] self.set_parameters(all_new_parameters) def main(): rclpy.init() node = MinimalParam() rclpy.spin(node) if

ROS2学习笔记:Python最小支持Parameters的节点 Read More »

ROS2学习笔记:Python最小服务端/客户端节点

按照之前学习到的建立workspace以及package框架的指令,创建我们的这个最小服务端客户端节点的框架: ros2 pkg create –build-type ament_python –license Apache-2.0 py_srvcli –dependencies rclpy example_interfaces 当节点之间使用服务进行通信时,发送数据请求的节点称为客户端节点,响应请求的节点称为服务节点。请求和响应的结构由 .srv 文件决定。在使用ros2命令生成一个package框架时候,需要一个参数example_interfaces来生成需要的.srv文件。对于我们一个两数相加的服务例子,在.srv需要如下内容: int64 a int64 b — int64 sum 前边两个是客户端request的参数,最后是服务端response的参数。然后开始准备我们具体的代码。 服务端代码为: from example_interfaces.srv import AddTwoInts import rclpy from rclpy.node import Node class MinimalService(Node): def __init__(self): super().__init__(‘minimal_service’) self.srv = self.create_service(AddTwoInts, ‘add_two_ints’, self.add_two_ints_callback) def add_two_ints_callback(self, request, response): response.sum = request.a + request.b self.get_logger().info(‘Incoming request\na:

ROS2学习笔记:Python最小服务端/客户端节点 Read More »

ROS2学习笔记:C++最小服务端/客户端节点

当节点之间使用服务进行通信时,发送数据请求的节点称为客户端节点,响应请求的节点称为服务节点。请求和响应的结构由 .srv 文件决定。在使用ros2命令生成一个package框架时候,需要一个参数example_interfaces来生成需要的.srv文件。对于我们一个两数相加的服务例子,在.srv需要如下内容: int64 a int64 b — int64 sum 前边两个是客户端request的参数,最后是服务端response的参数。然后开始准备我们具体的代码。 服务端示例代码为: #include “rclcpp/rclcpp.hpp” #include “example_interfaces/srv/add_two_ints.hpp” #include <memory> void add(const std::shared_ptr<example_interfaces::srv::AddTwoInts::Request> request, std::shared_ptr<example_interfaces::srv::AddTwoInts::Response> response) { response->sum = request->a + request->b; RCLCPP_INFO(rclcpp::get_logger(“rclcpp”), “Incoming request\na: %ld” ” b: %ld”, request->a, request->b); RCLCPP_INFO(rclcpp::get_logger(“rclcpp”), “sending back response: [%ld]”, (long int)response->sum); } int main(int argc, char **argv) { rclcpp::init(argc, argv);

ROS2学习笔记:C++最小服务端/客户端节点 Read More »