运动通信功能示例
- 打开一个新的终端执行以下命令,以查看通信功能运行状态:
sudo systemctl status transfer

- 若状态显示为 active,则可直接使用通信功能;
- 若状态显示为 inactive,则需要执行以下命令行启动通信功能:
sudo systemctl start transfer- 如需关闭通信功能,则在终端中输入:
sudo systemctl stop transfer- 如需查看通信功能运行日志,则在终端中输入:
journalctl -fu transfer- 打开一个新的终端,使用 ROS 中的 rostopic 命令查看机器狗状态信息:
rostopic info xxxxxxrostopic echo xxxxxx # xxxxxx 指的是具体话题名称,可在自己的代码中订阅话题进行二次开发- 使用
/cmd_vel话题向运动主机下发速度指令,话题消息类型geometry_msgs/Twist定义如下:
geometry_msgs/Vector3 linear # 线速度(m/s) float64 x # 前向速度,向前为正 float64 y # 侧向速度,向左为正 float64 z # 无效参数geometry_msgs/Vector3 angular # 角速度(rad/s) float64 x # 无效参数 float64 y # 无效参数 float64 z # 转向角速度,左转为正a) 用户可在基于 ROS 编译的 C++ 和 Python 程序中发布该话题(ROS 基础的学习请参考 http://wiki.ros.org/ROS/Tutorials),也可以打开一个终端,输入命令发布进行调试,请先输入:
rostopic pub /cmd_vel geometry_msgs/Twistb) 输入完先不运行,在语句后面加一个空格,再按 Tab 键,就会自动补充当前消息类型的内容,具体如下:
rostopic pub /cmd_vel geometry_msgs/Twist "linear: x: 0.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0"c) 使用键盘上的向左/向右方向键移动光标修改速度值,然后在 geometry_msgs/Twist 之后加入 -r 10 规定发布频率(即每秒发布 10 次),输入完毕后终端内容如下所示:
rostopic pub /cmd_vel geometry_msgs/Twist -r 10 "linear: x: 0.2 y: 0.1 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.3"d) 运行命令,即可发布话题。
e) 传输程序会订阅该话题,并将其转为 UDP 指令消息发给运动主机。
f) 传输程序正常开启后,使机器狗起立,并启动 APP 设置页中的自主模式,机器狗即可按照如上速度行动。
注意: 请在空旷处调试以防对人或物品造成损伤,遇到紧急情况,及时按下软急停,或关闭自主模式。
程序结构说明
Section titled “程序结构说明”/home/ysc/lite_cog/transfer/src├── CMakeLists.txt└── message_transformer ├── CMakeLists.txt ├── include │ ├── protocol.h │ └── sensor_logger.h ├── launch │ └── message_transformer.launch ├── msg │ ├── SimpleCMD.msg │ └── ComplexCMD.msg ├── package.xml └── src ├── nx2app.cpp ├── qnx2ros.cpp ├── ros2qnx.cpp └── sensor_checker.cpp- nx2app.cpp 主要用于感知主机与手柄 APP 之间进行 UDP 通信,APP 下发指令到感知主机,该程序根据收到的命令执行相应的操作。手柄与感知主机之间通信所用的指令结构体如下:
class SimpleCMD{public: int32_t cmd_code; int32_t cmd_value; int32_t type;};- qnx2ros.cpp 用于接收运动主机上报的数据,并将其转化为 ROS 话题,供其他功能包调用,发布的话题如下:
leg_odom_pub_ = nh.advertise<geometry_msgs::PoseWithCovarianceStamped>("leg_odom", 1);leg_odom_pub2_ = nh.advertise<nav_msgs::Odometry>("leg_odom2", 1);joint_state_pub_ = nh.advertise<sensor_msgs::JointState>("joint_states", 1);imu_pub_ = nh.advertise<sensor_msgs::Imu>("/imu/data", 1);handle_pub_ = nh.advertise<geometry_msgs::Twist>("/handle_state", 1);ultrasound_pub_ = nh.advertise<std_msgs::Float64>("/us_publisher/ultrasound_distance", 1);- ros2qnx.cpp 订阅其他功能包节点发布的话题,转化为 UDP 数据报下发给运动主机,订阅的话题如下:
ros::Subscriber vel_sub = nh.subscribe("cmd_vel", 1, &ROS2QNX::CmdVelCallback, &ros2qnx);ros::Subscriber vel_sub2 = nh.subscribe("cmd_vel_corrected", 1, &ROS2QNX::CmdVelCallback, &ros2qnx);ros::Subscriber simplecmd_sub = nh.subscribe("simple_cmd", 1, &ROS2QNX::SimpleCMDCallback, &ros2qnx);ros::Subscriber complexcmd_sub = nh.subscribe("complex_cmd", 1, &ROS2QNX::ComplexCMDCallback, &ros2qnx);- 从桌面打开一个新的终端执行以下命令,以查看通信功能运行状态:
sudo systemctl status transfer_ros2
- 若状态显示为 active,则可直接使用通信功能;
- 若状态显示为 inactive,则需要执行以下命令行启动通信功能:
sudo systemctl start transfer_ros2- 如需关闭通信功能,则在终端中输入:
sudo systemctl stop transfer_ros2- 如需查看通信功能运行日志,则在终端中输入:
journalctl -fu transfer_ros2- 打开一个新的终端,使用 ROS 中的 ros2 topic 命令查看机器狗状态信息:
ros2 topic info xxxxxxros2 topic echo xxxxxx # xxxxxx 指的是具体话题名称,可在自己的代码中订阅话题进行二次开发- 使用
/cmd_vel话题向运动主机下发速度指令,话题消息类型geometry_msgs/msg/Twist定义如下:
geometry_msgs/msg/Vector3 linear # 线速度(m/s) float64 x # 前向速度,向前为正 float64 y # 侧向速度,向左为正 float64 z # 无效参数geometry_msgs/msg/Vector3 angular # 角速度(rad/s) float64 x # 无效参数 float64 y # 无效参数 float64 z # 转向角速度,左转为正a) 用户可在基于 ROS2 编译的 C++ 和 Python 程序中发布该话题(ROS 基础的学习请参考 https://docs.ros.org/en/foxy/Tutorials.html),也可以打开一个终端,输入命令发布进行调试,请输入:
ros2 topic pub /cmd_vel -r 10 geometry_msgs/msg/Twist "{linear: {x: 0.5, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"b) 运行命令,即可发布话题。
c) 传输程序会订阅该话题,并将其转为 UDP 指令消息发给运动主机。
d) 传输程序正常开启后,使机器狗起立,并启动 APP 设置页中的自主模式,机器狗即可按照如上速度行动。
注意: 请在空旷处调试以防对人或物品造成损伤,遇到紧急情况,及时按下软急停,或关闭自主模式。
程序结构说明
Section titled “程序结构说明”ysc@lite:~/lite_cog_ros2/transfer/src$ tree .├── transfer│ ├── CMakeLists.txt│ ├── include│ │ └── protocol.hpp│ ├── launch│ │ └── transfer_launch.py│ ├── package.xml│ └── src│ ├── Jetson2App.cpp│ ├── Jetson2Motion.cpp│ ├── SensorChecker.cpp│ └── SensorsLogger.hpp└── transfer_interfaces ├── CMakeLists.txt ├── msg │ ├── MotionComplexCMD.msg │ └── MotionSimpleCMD.msg └── package.xml- Jetson2App.cpp 主要用于感知主机与手柄 APP 之间进行 UDP 通信,APP 下发指令到感知主机,该程序根据收到的命令执行相应的操作。手柄与感知主机之间通信所用的指令结构体如下:
class SimpleCMD{public: int32_t cmd_code; int32_t cmd_value; int32_t type;};- Jetson2Motion.cpp 中包含 MotionReceiver 和 MotionSender 两个类。其中 MotionReceiver 用于接收运动主机上报的数据,并将其转化为 ROS 话题,供其他功能包调用,发布的话题如下:
leg_odom_pub_ = create_publisher<geometry_msgs::msg::PoseWithCovarianceStamped>("leg_odom", 10);leg_odom_pub2_ = create_publisher<nav_msgs::msg::Odometry>("leg_odom2", 10);joint_state_pub_ = create_publisher<sensor_msgs::msg::JointState>("joint_states", 10);imu_pub_ = create_publisher<sensor_msgs::msg::Imu>("/imu/data", 10);handle_pub_ = create_publisher<geometry_msgs::msg::Twist>("/handle_state", 10);ultrasound_pub_ = create_publisher<std_msgs::msg::Float64>("/us_publisher/ultrasound_distance", 10);MotionSender 订阅其他功能包节点发布的话题,转化为 UDP 数据报下发给运动主机,订阅的话题如下:
cmd_vel_sub_ = create_subscription<geometry_msgs::msg::Twist>( "cmd_vel", 10, std::bind(&MotionSender::CmdVelCallback, this, std::placeholders::_1));cmd_vel_corrected_sub_ = create_subscription<geometry_msgs::msg::Twist>( "cmd_vel_corrected", 10, std::bind(&MotionSender::CmdVelCallback, this, std::placeholders::_1));simplecmd_sub = create_subscription<transfer_interfaces::msg::MotionSimpleCMD>( "simple_cmd", 10, std::bind(&MotionSender::SimpleCMDCallback, this, std::placeholders::_1));complexcmd_sub = create_subscription<transfer_interfaces::msg::MotionComplexCMD>( "complex_cmd", 10, std::bind(&MotionSender::ComplexCMDCallback, this, std::placeholders::_1));