四足

基于模型预测控制与全身控制的控制器

  • 虚拟模型控制(VMC: Virtual Model Control)

通过模拟虚拟组件来产生所需的关节力矩,这些关节力矩产生的效果与虚拟组件产生的效果相同,因此实现了模拟组件与真实机器 人连接的控制效果

  • 全身控制(WBC)

为实现一组任务,所有驱动关节 都能得到控制信号的控制系统都可以称作全身控制

  • WBC 使用了浮动基逆动力学

模型预测控制(MPC)试图在未来的一个滚动时域内,使用优化算法来跟踪给定的期望 轨迹

设计一个基于模型预测控制与全身控制的控制器。在 模型预测控制中,将整个机器人简化为一个单刚体模型并分析其动力学,建立状态方程、 预测方程,将控制问题转化为一个优化问题,最终求出足底反力。在全身控制中,采用了多刚体动力学。四足机器人全身控制将整体的任务按照重要程度分为四个子任务,利 用雅可比矩阵的零空间特性,保证低优先级的任务无法影响高优先级任务的控制。

legged_controller是入口

激光雷达

https://www.researching.cn/ArticlePdf/m00002/2022/59/18/1815006.pdf

武汉理工大学的初秀民、柳晨光等科研人员在《机械工程学报》2022年第4期发表了《无人水面艇三维激光雷达目标实时识别系统》

Virtual RobotX (VRX)

Virtual RobotX (VRX) 是一个开源的模拟环境,专门设计用于模拟无人水面车辆(USVs)在海洋环境中的操作

多功能 VRX 仿真环境作为一个可扩展的框架,致力于促进无人水面舰艇 (USV) 自主性的设计、开发和评估。VRX 仿真环境已被海事机器人研发社区所接受,不断发展以适应感知、学习和控制的进步,同时探索 USV 功能的新应用。

image-20241113101048510

image-20241113101258443

image-20241113102818405

在这里插入图片描述

可以在世界中添加障碍等元素

可以创建自定义WAM-V推进器和传感器

不知道水下能不能仿真

Webots水下机器人仿真

uuv_simulator水下机器人仿真

https://github.com/uuvsimulator/uuv_simulator

矩阵就是坐标变换

矩阵的行列式就是是三维空间中立方体的体积的缩放比例

旋转矩阵式正交矩阵(三个列向量是一组标准正交基(单位向量+正交))

旋转矩阵的行列式恒为1(旋转矩阵不会缩放)

旋转矩阵逆等于转置

[旋转矩阵,欧拉角,四元数,旋转向量和齐次变换矩阵]

这几个名词都是用来描述一个物体的位置和姿态的

旋转矩阵的初衷就是人们希望给定一个向量x,然后我对它旋转,能直接通过矩阵乘法的形式得到旋转后的向量坐标。也就是说y=Ax。这个方便计算机计算,因此旋转矩阵常用于编程。旋转矩阵是一个正交矩阵(AT=A−1AT=A−1)而且行列式是1。既然有了旋转矩阵那么为何还要欧拉角呢?这是因为我给你一个旋转矩阵,人看不懂它到底转了多少角度啊。计算机很容易算出来,但是对人来说非常困难。比如飞机驾驶员你让他以旋转矩阵的形式给飞机下指令,那人家不得疯了。而欧拉角那就非常直观,欧拉角就是我飞机头抬头多少(俯仰角pitch),向左拐还是向右拐(偏航角yaw),以及滚筒动作的角度(滚转角roll)。因此欧拉角一般是方便用户操作,或者程序员检查运算结果是否正确。然后有了欧拉角为何还要四元数呢?因为欧拉角有问题,即万向锁问题。欧拉角的意思是说旋转可以分解为绕机身,机翼,垂直机身三个轴旋转。注意了是依次旋转,每次旋转后的旋转轴姿态已经变化。看下图,比如你先绕机翼那个轴转90度,然后你会发现原先(第一幅图)的滚转角(即绕原先的机身转)与现在的偏航角(绕垂直机身的那个轴)重合了。也就是说滚转这个方向等与偏航了,两个自由度合并成一个了。这样一个麻烦就是如果一个给定旋转矩阵可能会计算出多个欧拉角。于是乎,数学家就用四元数来代替欧拉角。

旋转向量其实和欧拉角类似也会存在万向锁的,任何只用三个变量来描述姿态的方法都会产生万向锁。旋转向量就是方向与旋转轴相同,模为旋转角度的一个向量。之所以会用旋转向量是因为旋转矩阵用9个元素来描述三维的旋转,太浪费了。所以想用三个元素的向量来描述三维运动,这个向量就是旋转向量。齐次变换矩阵就是既包含旋转又包含平移的变换矩阵(它是4x4),旋转矩阵只包含旋转(它是3x3),齐次变换矩阵的左上角是旋转矩阵,右侧那列是平移量

printf("%d\n",2.0);
输出:
2123684520
printf("%0.1f\n",2);
输出:
0.0
int n,m=0;
可以这样

不需要鼠标选取

直接光标所在行

Ctrl + /           注释(取消注释)选择的行

Shift + Enter        开始新行

Ctrl + Y          删除当前插入符所在的行

Ctrl + D          复制当前行、或者选择的块

Ctrl + Delete        删除到字符结尾

Ctrl + Backspace      删除到字符的开始

Ctrl + Shift + NumPad+   展开所有的代码块

Ctrl + Shift + NumPad-    收缩所有的代码块

ALT+ ←/→ 切换文件

SHIFT + ALT ←/→ 返回上次编辑的位置

CTRL+ALT+: emjo

/opt/glibc-2.34/lib/ld-linux-x86-64.so.2 --library-path /opt/glibc-2.34/lib:/lib/x86_64-linux-gnu ./yazi
q退出
char *rev
和
char review[]是一样的

char *rev[]
是数组里还是数组
    while (number > 0) {
        int digit = number % 10;  // 获取最低位
        printf("%d ", digit);      // 打印每一位
        number /= 10;              // 去掉最低位
    }
  • 空格问题scanf 使用 %s 读取字符串时,遇到空格、制表符或者换行符就会停止读取。因此,如果输入的字符串中有空格,scanf 只能获取到第一个单词。例如,输入 Hello World 时,scanf 只会读取 Hello,而 World 会被留在输入缓冲区。
int a = 10;
int &ref = a;  // 通过引用初始化 a

在编译时,编译器可能会将其转化为:

int a = 10;
int *ref = &a;  // ref 是指向 a 的指针,类似引用

&是赋值还是被赋值,等号左边还是右边

“~”符号的输出:Shift + Fn + Esc。 “`”符号的输出:Fn + Esc。

小脑(运动控制),以及大脑(具身智能)

Welcome to Rust!

This will download and install the official compiler for the Rust
programming language, and its package manager, Cargo.

Rustup metadata and toolchains will be installed into the Rustup
home directory, located at:

  /home/zgh/.rustup

This can be modified with the RUSTUP_HOME environment variable.

The Cargo home directory is located at:

  /home/zgh/.cargo

This can be modified with the CARGO_HOME environment variable.

The cargo, rustc, rustup and other commands will be added to
Cargo's bin directory, located at:

  /home/zgh/.cargo/bin

This path will then be added to your PATH environment variable by
modifying the profile files located at:

  /home/zgh/.profile
  /home/zgh/.bashrc

You can uninstall at any time with rustup self uninstall and
these changes will be reverted.

Current installation options:


   default host triple: x86_64-unknown-linux-gnu
     default toolchain: stable (default)
               profile: default
  modify PATH variable: yes
set(CMAKE_PREFIX_PATH "/opt/Qt/6.7.2/gcc_64")

image-20241224212847057

name="urdf_spawner"

  • 作用:指定该节点的名字。

  • 意义:在 ROS 中,节点名称是全局唯一的标识,用于区分不同的节点。

  • 例子

    • urdf_spawner 是该节点的名字,表示它的功能是用来生成(spawn)一个 URDF 模型到 Gazebo 中。

respawn="false"

  • 作用:指定节点是否在退出后自动重启。

  • 选项

    • false(默认值):节点在退出后不会自动重启。
    • true:如果节点因任何原因退出(例如崩溃),ROS 会自动尝试重新启动该节点。
  • 意义

    • 如果该节点负责关键功能(如控制器或监控器),可以设置为 true 确保系统稳定性。
    • 在本例中,设置为 false,表明 urdf_spawner 节点在完成模型生成任务后不需要持续运行或重启。

output="screen"

  • 作用:定义节点的日志输出方式。

  • 选项

    • screen:节点的日志输出会直接显示在终端中。
    • log:节点的日志输出会写入 ROS 的日志文件(通常在 ~/.ros/log 文件夹中)。
  • 意义

    • 设置为 screen 有助于实时查看节点的运行信息(如错误信息或调试日志),适合在开发和调试阶段使用。
    • 如果希望保存日志供后续分析,可以设置为 log

controller_manager 是控制器的管理层

  • 负责加载和运行具体的控制器,包括 joint_state_controller

joint_state_controller 是具体的状态发布控制器

  • 从硬件接口读取关节状态数据,并发布到 /joint_states 话题。

robot_state_publisher 是基于状态的姿态计算工具

  • 读取 /joint_states 中的关节数据,结合机器人模型生成 TF 坐标变换,用于可视化和坐标计算。

举例说明

假设我们有一个机械臂机器人,以下是如何使用这些组件:

  1. 控制器管理
    • 使用 controller_manager 动态加载和启动控制器,例如 joint_state_controller 和关节位置控制器。
  2. 状态发布
    • 启动 joint_state_controller,从硬件中获取关节状态并发布到 /joint_states
  3. 姿态计算
    • 启动 robot_state_publisher,读取 /joint_states,根据 URDF 生成动态的 TF 坐标变换。
  4. 可视化
    • 在 RViz 中加载机器人模型,使用 TF 数据实时显示机器人在仿真或实际环境中的姿态变化。

image-20250110122451446