个人github仓库欢迎star:https://github.com/huaianxizhilang/unitree_ros_dev_demob站demo视频csdn越来越废了视频链接也给封禁了后面不想用csdn了b站go2开发demo视频b站go2 slam建图1 基础环境配置如下这里记得换成humble编译cyclone dds如果使用Humble此步骤可跳过这里我使用的是humble所以跳过。但是按照B站教程还是得编译先去bashrc将这个source注释掉后面再打开换成humble设置网络配置这个是我之前设置的本机地址unitree的地址为192.168.123.161登陆发现此时的网口号如下改成humble和自己的网口信息在bashrc里面添加这个source文件这样不用每次source上面都做好了之后按照官方教程处理无法处理得不到toplic将防火墙关闭了不行在其他博客里面看到了这个于是远程ssh到unitree go2上面然后可以看到此时在unitree本地机子上面是有的 。注意这里 unitree上面的环境变量不小心添上去的后续要学会自己删除。不知道是不是这个原因再使用wifi连接下看看按照这个来搞还是不行最后参考这个时间点的博客参考这个搞出来到就是这个2个原因记得setup.bash url后面不要带上空格本地网要写对。同时ros2 topic list --no-daemon2 实际开发过程下面均为原课程编号1.2.4 toptic数据及rivz2可视化unitree l1雷达可视化如下显示L1 雷达数据ros2 topic echo /utlidar/cloud --no-arr --no-daemonrviz2 教程具体看rviz2视频1.2.5 编译测试例程按照如下编译会有报错参考doubao将这个ut_errror.hpp文件润色了下但是还是会报std warning告警信息#pragmaonce#includecstdint#includerclcpp/rclcpp.hpp// 确保包含RCLCPP头文件RCLCPP_ERROR依赖// 定义错误码和对应的描述#defineUT_DECL_ERR(name,code,desc)\constint32_tnamecode;\constconstexprchar*name##_DESCdesc;UT_DECL_ERR(UT_ROBOT_SUCCESS,0,success.)UT_DECL_ERR(UT_ROBOT_TASK_TIMEOUT,-1,task timeout.)UT_DECL_ERR(UT_ROBOT_TASK_UNKNOWN_ERROR,-2,task unknown error.)// 修正后的错误打印宏确保反斜杠后无空格仅换行#defineUT_PRINT_ERR(code,error)\if((code)(error)){\RCLCPP_ERROR(this-get_logger(),%s,error##_DESC);\}代办./install/unitree_ros2_example/bin/read_motion_statesport_model1.3.1 1.3.2 机器狗helloworld过滤request话题寻找需要发布的运动信息ros2 topic list | grep -i request四足狗运动的话题 /api/sport/request查看接口格式ros2 toptic info /api/sport/request查看具体如何定义ros2 interface show unitree_api/msg/Request创建功能包ros2 pkg create go2_helloworld --build-type ament_cmake --dependencies rclcpp unitree_apic类编写代码编写的时候报错原因是找不到路径将路径写到里面就会包含了。写好了一些代码编译的时候没文件需要在cmakelist里面添加相应的依赖和编译项写好程序之后编译source 源文件然后运行话题就可以注意如果没有连接go2端口开机会爆如下的错代办需要看下为什么代码这样写c代码python类使用如下命令创建包记得结尾加上 node-name)ros2 pkg create helloworld_py --build-type ament_python --dependencies rclpy unitree_api --node-name hello写完之后编译colcon build --packages-select helloworld_py然后source源文件,source install/setup.bash ,然后ros2 run helloworld_py hello代办这里需要再执行下2.1.1 高层状态获取代办这里需要再执行下查看 sportmodestate 这里可以看到不同频率的sportmodestateros2 topic list | grep -i sportmodestateros2 topic hz /lf/sportmodestate (低频ros2 topic hz /mf/sportmodestate中频ros2 topic hz /sportmodestate高频ros2 topic type /sportmodestate (看消息类型ros2 interface show unitree_go/msg/SportModeState 接口定义的具体数据结构ros2 topic echo /sportmodestate --no-arr (查看数据具体官方代码实现example/src/src/read_motion_state.cpp如果需要执行的话直接按照官方文档编译后在终端运行./install/unitree_ros2_example/bin/read_motion_state2.1.2 低层状态获取[INFO] [1762252280.016273967] [rviz]: Message Filter dropping message: frame ‘base_link’ at time 1762252245.246 for reason discarding message because the queue is full代办这里需要再执行下ros2 topic list | grep -i lowstateros2 topic type /lowstate (看消息类型ros2 topic type /lf/lowstate (看消息类型ros2 topic hz /lowstate (低频ros2 topic hz /lf/lowstate (看消息类型ros2 interface show unitree_go/msg/LowState 接口定义的具体数据结构具体官方代码实现example/src/src/read_low_state.cpp如果需要执行的话直接按照官方文档编译后在终端运行2.1.3 遥控器状态获取代办这里需要再执行下ros2 topic list | grep -i wirelessros2 topic type /wirelesscontroller (看消息类型剩下和之前的一样有官方例子2.2.1 运动控制代办这里需要再执行下ros2 topic list | grep -i request四足狗运动的话题 /api/sport/request查看接口格式ros2 toptic info /api/sport/request查看具体如何定义ros2 interface show unitree_api/msg/Request剩下和之前的一样有官方例子可以 直接使用rqt 来进行发布写上对应的toptic和角度 然后沟上就会自动发布话题高层运动控制的完整例程位于example/src/sport_mode_ctrl.cpp这里我没找到2.2.2 电机控制代办这里需要再执行下ros2 topic type /lowcmd (看消息类型运行地层控制服务之前需确保app上面sport服务关闭机器人架空之后就可以按照下面的源码来进行处理example/src/src/low_level_ctrl.cpp恢复时候摆到阻尼状态再到app恢复3.1.1 键盘控制这里由于控制比较简单所以不写c写python程序ros2 pkg create go2_teleop_ctrl_keyboard --build-type ament_python --dependencies rclpy unitree_api --node-name go2_teleop_ctrl_keyboardpython脚本里面里面多了个子线程步骤因为需要主线程等待操作然后编译ros2 run go2_teleop_ctrl_keyboard go2_teleop_ctrl_keyboard运行代办但是直接使用视频中的程序停止之后无法恢复平衡站立3.2.1 Twist消息转换这个只能实现比较基础的转换比如线速度和角速度转换ros2 pkg create go2_twist_bridge --build-type ament_cmake --dependencies rclcpp geometry_msgs unitree_api --node-name twist_bridgeros2 pkg create go2_twist_bridge_py --build-type ament_python --dependencies rclpy geometry_msgs unitree_api --node-name twist_bridge在写这个代码之前需要将/home/xzl/Project/unitree/unitree_ros2/example/src/include/nlohmann 我的unitree_ros2)目录下的这个include这个目录复制到当前功能包include目录下python版本编写时候注意导包不要忘记.剩余流程差不多注意使用ros2 原生的这种使用按键不一样同时这个速度会非常快很容易撞倒3.3.2 机器人模型可视化注意的是这里为什么不用官方的因为官方的下载下来之后都是用的ros1不适配ros2所以必须要改造成ros2的。https://github.com/unitreerobotics/unitree_ros/tree/master按照教程将cmake和package写好之后编译source setup.bash这里有个注意点包名和官方的urdf要同统一不然后续所有的urdf都要改此时如果机器狗没开会报错如果机器狗开了在终端执行就会这样按照视频做到这三项但是此时模型不完全对另外要注意如果有如下错可能是没source 环境setup.bash注意上面只解决了go2本体的可视化但是radar的扫描不显示因为urdf官方中用的radar但是ros topic话题中这个radar数据用的base是 utlidar_lidar此时可以手动坐标系转换在shell3中加上这个重映射ros2 run tf2_ros static_transform_publisher --frame-id radar --child-frame-id utlidar_lidar这里Launch文件为什么需要添加这个额外的参数控制因为后续这个joint需要其他程序动态发布3.4.2## 3.4 机器人驱动包 c 机器人驱动包 c五大功能上面的需求中里程计和里程计相关的坐标变换从sportmodel四足狗发布的话题里面取关节状态从lowstate话题里面取然后转换发布出去这里补充一点代码如果没有这个补充参数发布的时候关节会不停地抖动此时我们通过godriver重新发布了一个就不应该使用默认的如下代码红框发布的这个了就是之前课程讲的四个足半趴状态所以这里要将其关了创建对应的包ros2 pkg create go2_driver --build-type ament_cmake --dependencies rclcpp unitree_go sensor_msgs tf2 tf2_ros geometry_msgs nav_msgs --node-name driverros2 pkg create go2_driver_py --build-type ament_python --dependencies rclpy unitree_go sensor_msgs tf2_ros geometry_msgs nav_msgs --node-name driver这里可以自己添加rviz配置这样每次不用自己手动修改rviz配置可以在riviz目录下面创建display.rviz另外launch文件中增加了条件所以可以使用ros2 launch go2_driver driver.launch.py use_rviz:false来不启动rviz此时想保存rviz配置报错那为什么将rviz2中的Fixed Frame 设置为 odom后会报以下错误但是将Fixed Frame 设置为base后雷达点云又显示正常【INFO】 【1752416695.855021906】 【rviz】: Message Filter dropping message: frame ‘utlidar_lidar’ at time 1740213107.629 for reason ‘the timestamp on the message is earlier than all the data in the transform cache’doubao解释这个问题的核心原因是不同坐标系odom和base的 TF 变换缓存中时间戳与雷达点云时间戳不匹配具体分析如下1. 为什么Fixed Frame设为base时正常base是机器人的基坐标系通常与机器人底盘刚性连接而激光雷达的坐标系utlidar_lidar与base之间的变换通常是静态 TF通过static_transform_publisher发布比如base → radar → utlidar_lidar的固定关系。静态 TF 的特点是一旦发布会被 TF 缓存长期保存默认缓存时间较长且时间戳通常会被强制设为当前时间如果加了--use-current-time参数。因此当Fixed Frame为base时RViz 只需要base到utlidar_lidar的静态 TF 变换而这个变换的时间戳始终是“有效”的与点云时间戳的偏差较小或静态 TF 被长期缓存所以点云能正常显示。2. 为什么Fixed Frame设为odom时出错odom是里程计坐标系它与base之间的变换是动态 TF由里程计节点实时发布比如odom → base的变换随机器人运动不断更新。动态 TF 的时间戳是实时更新的与机器人运动同步且 TF 缓存默认只保留最近一段时间的数据比如几秒到十几秒。当雷达点云的时间戳远早于odom → base动态 TF 的时间戳时比如点云时间戳是 1740213107而odom到base的 TF 时间戳已经是 1752416695RViz 无法在 TF 缓存中找到“点云时间戳对应的odom → base → utlidar_lidar完整变换链”因此会报错并丢弃点云。根本原因总结雷达点云的时间戳严重滞后于系统当前时间从报错看点云时间戳 1740213107 比 RViz 运行时间 1752416695 早了很久可能是雷达内部时钟未同步或驱动时间戳设置错误。当Fixed Frame为odom时必须依赖动态更新的odom → base变换而这个变换的时间戳是“最新的”与滞后的点云时间戳无法匹配。当Fixed Frame为base时仅依赖静态的base → utlidar_lidar变换静态 TF 时间戳通常被强制为当前时间因此即使点云滞后也能找到匹配的变换。解决方法针对真实环境1. 优先解决雷达时间戳滞后问题检查雷达驱动时间戳确保雷达点云的header.stamp使用系统当前时间而非雷达内部时钟可能未同步。在雷达驱动代码中强制覆盖时间戳// 发布点云前用ROS节点的当前时间更新时间戳cloud_msg.header.stampthis-now();// this 是当前ROS节点pointcloud_pub-publish(cloud_msg);确保系统时间同步通过 NTP 同步所有设备雷达、机器人主控、上位机的系统时间避免时间戳偏差过大具体操作见前文。2. 优化动态 TF 的缓存策略增加动态 TFodom → base的发布频率确保 TF 缓存中始终有“较新”的变换数据。在 RViz 中调大TF Cache Time例如设为 60s允许缓存更早的动态 TF 变换适应轻微的时间戳滞后。操作RViz →Displays→Global Options→TF Cache Time→ 改为 60.0。3. 验证 TF 变换链的完整性通过ros2 topic echo /tf检查odom → base的变换是否存在且时间戳是否为当前时间与系统时间date对比偏差应小于 1s。base → radar → utlidar_lidar的静态变换是否存在时间戳是否正常建议加--use-current-time参数。通过以上步骤先解决雷达时间戳滞后问题再确保 TF 变换链的时间戳匹配即可在Fixed Frame设为odom时正常显示点云。这里我没使用上面的解决步骤来解决rviz的可视化使用unitree官方的其他话题来显示点云信息。具体配置如下搞好之后保存到这里重新编译就可以后面就不用单独再开rviz了代办但是时间长了之后还是会报错说帧数饱满了[INFO] [1762252280.016273967] [rviz]: Message Filter dropping message: frame ‘base_link’ at time 1762252245.246 for reason discarding message because the queue is fullros2 launch go2_driver driver.launch.py 启动即可同步相应姿态数据3.4.3 机器人驱动包 python未看呢,后续更新4 通信例程为了实现topic,service,action三种级别代码的编写未看呢,后续更新5 go2_ros2_sdk 非官方sdk开发使用依赖安装好了直接编译会报错将源代码文件红框这里改成4个空格子保持一致按照文档连接报错原因是foxglove_bridge没装ros-humble-slam-toolbox/ros-humble-nav2-bringup这里出现这种原因就是rosdep install --from-paths src --ignore-src -r -y 这个命令当时没在src上级目录执行安装此时可以进行webrtc开发其他博客发现要使用cyclonedds进行开发需升级具体见其他博客社区legion1581作者2024/11/21 20:03:14发言需启用二次开发才行代办这个社区里面有foxglove和另外一款可视化工具非常不错。社区讲解的如何保存地图具体建图步骤可以看这个https://www.hiascend.com/document/detail/zh/Atlas200IDKA2DeveloperKit/23.0.RC2/Application%20Cases/oanvadg/inoaadg_0016.htmlhttps://github.com/SteveMacenski/slam_toolbox这里可以添加插件成功建图