连接到在另一台计算机上运行的Subscriber
何为“另一台计算机”你可以认为是处于同一局域网内的另一台计算机,或者是通过VPN连接的远程计算机。 譬如,发布者计算机的 Ip 地址是 192.168.0.3,监听者计算机的 Ip 地址是 192.168.0.103. 实现办法设置 ROS_DOMAIN_IDROS 2 使用 ROS_DOMAIN_ID 来隔离网络中的不同机器人群组。 所有电脑必须使用相同的 Domain ID。 默认 ID 是 0。 我们可以在发布者和监听者的电脑上设置相同的 ROS_DOMAIN_ID,例如: 1export ROS_DOMAIN_ID=30 即将 ROS_DOMAIN_ID 设置为 30,当然,你也可以选择其他数字,只要确保发布者和监听者使用相同的值即可。 设置 ROS_LOCALHOST_ONLYROS_LOCALHOST_ONLY 就是“仅本机模式”,如果设置为 1,ROS 2 将只在本地计算机上进行通信,不会与其他计算机进行通信。 因此,在发布者和监听者的电脑上都需要将 ROS_LOCALHOST_ONLY 设置为 0,以允许跨计算机通信: 1export ROS_LOCALHOST...
弄一个简单的 ROS 2 程序
前提条件确保你的 Conda 环境中安装了 rclpy 包。如果没有安装,可以使用以下命令进行安装: 1pip install rclpy 创建 ROS 2 发布节点创建一个名为 simple_ros2_node.py 的 Python 文件,并添加以下代码: 1234567891011121314151617181920212223242526import rclpyfrom rclpy.node import Nodefrom std_msgs.msg import Stringclass MyRobotNode(Node): def __init__(self): super().__init__('robot_brain') # 创建一个发布者,发布到 'chatter' 话题 self.publisher_ = self.create_publisher(String, 'chatter', 10) # 每 3 秒发一次 self.t...
Berkeley Humanoid Lite 的 scripts/sim2real/visualize.py
scripts/sim2real/visualize.py 只负责接收数据并画图,不负责控制逻辑。 初始化环境123456visualizer = MujocoVisualizer(Cfg( { "num_joints": 12, # 机器人关节数量(Lite版本通常是12个自由度) "physics_dt": 0.001, # 物理仿真步长 1ms })) 这里的 num_joints 会对应到 MujocoEnv 的这个部分 1234if cfg.num_joints == 22: self.mj_model = mujoco.MjModel.from_xml_path("source/berkeley_humanoid_lite_assets/data/mjcf/bhl_scene.xml")else: self.mj_model = mujoco.MjModel.from_xml_path("source/berkeley_h...
Berkeley Humanoid Lite Lowlevel 的 policy/config.py
Cfg 类策略配置 (Policy)1policy_checkpoint_path: str policy_checkpoint_path: 训练好的神经网络模型文件(.pt 或 .jit)的路径。 对应的 Berkeley-Humanoid-Lite/configs/policy_biped_50hz.yaml 文件中,它有这样的参数: 1policy_checkpoint_path: "checkpoints/policy_biped_50hz.onnx" 网络配置 (Networking)1234ip_robot_addr: strip_policy_obs_port: intip_host_addr: strip_policy_acs_port: int 定义了机器人(Robot)和策略服务器(Host)之间的 IP 地址及端口。这通常用于离机控制:算力强大的 PC 跑策略,通过网络将指令发给算力较弱的机器人控制器。 对应的 Berkeley-Humanoid-Lite/configs/policy_biped_50hz.yaml 文件中,它有这...
Berkeley Humanoid Lite Lowlevel 的 recoil/can.py
DataFrame 的定义一个通用的数据帧结构,用于存储通信协议中的基本信息,并强制执行数据长度的一致性检查。 12345678910111213class DataFrame: def __init__( self, device_id: int = 0, func_id: int | None = None, size: int = 0, data: bytes | bytearray = b"" ): self.device_id = device_id self.func_id = func_id self.size = size self.data = data assert self.size == len(self.data) 参数详解: device_id: 设备 ID(整数),用于标识发送者或接收者。 func_id: 功能 ID(整数或 None)。用于标识这条指令是做什么的(例如:读数...
Berkeley Humanoid Lite Lowlevel 的 recoil/core.py
根据您提供的代码,我将其中的常量类整理为表格,并对 Bus 类的核心方法进行了分类列表和说明。 常量类列表Class Function (CAN功能码)该类定义了CAN ID的高4位,用于区分消息类型。 常量名称 值 (Binary) 值 (Decimal) 描述 NMT 0b0000 0 网络管理 (模式切换) SYNC_EMCY 0b0001 1 同步/紧急消息 TIME 0b0010 2 时间戳 TRANSMIT_PDO_1 0b0011 3 发送 PDO 1 RECEIVE_PDO_1 0b0100 4 接收 PDO 1 TRANSMIT_PDO_2 0b0101 5 发送 PDO 2 (位置/速度反馈) RECEIVE_PDO_2 0b0110 6 接收 PDO 2 (位置/速度命令) TRANSMIT_PDO_3 0b0111 7 发送 PDO 3 RECEIVE_PDO_3 0b1000 8 接收 PDO 3 TRANSMIT_PDO_4 0b1001 9 发送 PDO 4 RECEI...
Berkeley Humanoid Lite Lowlevel 的 robot/bimanual.py
代码概述 硬件拓扑结构: 左臂: 连接在 can0 总线上,关节 ID 为奇数 (1, 3, 5, 7, 9)。 右臂: 连接在 can1 总线上,关节 ID 为偶数 (2, 4, 6, 8, 10)。 夹爪: 通过 USB 串口 /dev/ttyUSB0 控制。 运动学修正 (joint_axis_directions & position_offsets): 由于电机安装方向不同,物理旋转方向可能与代码逻辑方向相反。代码中使用 +1 或 -1 数组来统一坐标系。 校准逻辑: 在 start() 方法中,机器人将当前的上电位置作为“零点”记录到 position_offsets 中。这意味着机器人每次启动时保持的姿势被视为初始位置。 控制循环 (step & update_joints): 这是一个典型的 Action -> Observation 循环。 step(actions): 接收目标角度,更新内部状态。 update_joints(): 将目标角度转换为电机指令(应用方向和偏移)。 通过 CAN 总线发送 PDO (Process...
Berkeley Humanoid Lite Lowlevel 的 robot/imu.py
核心逻辑 通信协议:IMU 通过串口发送二进制数据帧。每一帧以 0x55 开头,紧接着是帧类型(Frame Type),然后是数据载荷。 **数据解析 (__read_frame)**: 代码不断读取串口数据,利用 struct.unpack 将二进制数据转换为整数。 物理量转换:原始整数数据被转换为物理单位。例如,加速度的原始值除以 32768.0 再乘以量程 16.0,得到单位为 $g$ 的加速度。 支持的数据类型包括:加速度、角速度、欧拉角(Roll/Pitch/Yaw)、磁场、四元数。 **多线程运行 (run_forever)**: 为了不阻塞主程序的运行,驱动开启了一个后台线程(threading.Thread)专门负责读取串口数据并更新类的成员变量(如 self.acceleration)。 配置机制: IMU 有写保护。修改配置前必须先调用 unlock() 发送特定密钥。 修改后需调用 save() 将配置写入 EEPROM,否则掉电丢失。 主要类 SerialImu 的关键方法 __init__: 打开串口,初始化存储数据的 ...
Berkeley Humanoid Lite Lowlevel 的 robot/humanoid.py
humanoid.py 运行在机器人机载计算机(如 Jetson Orin 或 NUC)上,负责连接真实的传感器和执行器,并管理机器人的运行状态。 State 类12345class State: INVALID = 0 IDLE = 1 # 闲置/阻尼模式 RL_INIT = 2 # 初始化过渡模式(缓慢移动到初始姿态) RL_RUNNING = 3 # RL 策略接管控制模式 在后面的 Humanoid 类的 step 方法中的 match-case 结构中,根据当前状态执行不同的控制逻辑: 12345678910111213141516171819202122232425match (self.state): # 状态 1: 闲置/准备 case State.IDLE: # 目标设为当前测量值 -> 也就是不发力移动 self.joint_position_target[:] = self.joint_position_measured[:] # 检测手柄是否按下切...
Berkeley Humanoid Lite 的 environments/mujoco.py
辅助函数quat_rotate_inverse(q, v) 功能:计算向量 $v$ 经过四元数 $q$ 的逆旋转后的结果。 数学含义:通常用于将 世界坐标系 下的向量(如重力向量 $[0, 0, -1]$)转换到 机器人基座(Base)坐标系 下。这是人形机器人 RL 中常用的观测特征,用于让机器人感知“哪边是下”。 类详解class MujocoEnv (基类)这是仿真环境的基础封装。 模型加载:根据 cfg.num_joints 自动判断加载哪种 XML 模型文件: 22关节:全尺寸人形 (bhl_scene.xml)。 其他:双足版本 (bhl_biped_scene.xml)。 初始化: mj_model: 静态模型定义。 mj_data: 动态仿真数据(位置、速度、力等)。 mj_viewer: 启动被动的 3D 查看器。 class MujocoVisualizer (可视化器)用途:用于“回放”或“监视”。它不进行物理控制,而是强制修改机器人的状态。 reset: 将机器人重置到原点,姿态归零。 step(robot_observations): 输...