跳转到内容

运动通信功能示例

  1. 打开一个新的终端执行以下命令,以查看通信功能运行状态:
Terminal window
sudo systemctl status transfer

transfer-active

transfer-inactive

  • 若状态显示为 active,则可直接使用通信功能;
  • 若状态显示为 inactive,则需要执行以下命令行启动通信功能:
Terminal window
sudo systemctl start transfer
  • 如需关闭通信功能,则在终端中输入:
Terminal window
sudo systemctl stop transfer
  • 如需查看通信功能运行日志,则在终端中输入:
Terminal window
journalctl -fu transfer
  1. 打开一个新的终端,使用 ROS 中的 rostopic 命令查看机器狗状态信息:
Terminal window
rostopic info xxxxxx
rostopic echo xxxxxx # xxxxxx 指的是具体话题名称,可在自己的代码中订阅话题进行二次开发
  1. 使用 /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),也可以打开一个终端,输入命令发布进行调试,请先输入:

Terminal window
rostopic pub /cmd_vel geometry_msgs/Twist

b) 输入完先不运行,在语句后面加一个空格,再按 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 设置页中的自主模式,机器狗即可按照如上速度行动。

注意: 请在空旷处调试以防对人或物品造成损伤,遇到紧急情况,及时按下软急停,或关闭自主模式。

/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
  1. nx2app.cpp 主要用于感知主机与手柄 APP 之间进行 UDP 通信,APP 下发指令到感知主机,该程序根据收到的命令执行相应的操作。手柄与感知主机之间通信所用的指令结构体如下:
class SimpleCMD{
public:
int32_t cmd_code;
int32_t cmd_value;
int32_t type;
};
  1. 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);
  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);
  1. 从桌面打开一个新的终端执行以下命令,以查看通信功能运行状态:
Terminal window
sudo systemctl status transfer_ros2

transfer-ros2-status

  • 若状态显示为 active,则可直接使用通信功能;
  • 若状态显示为 inactive,则需要执行以下命令行启动通信功能:
Terminal window
sudo systemctl start transfer_ros2
  • 如需关闭通信功能,则在终端中输入:
Terminal window
sudo systemctl stop transfer_ros2
  • 如需查看通信功能运行日志,则在终端中输入:
Terminal window
journalctl -fu transfer_ros2
  1. 打开一个新的终端,使用 ROS 中的 ros2 topic 命令查看机器狗状态信息:
Terminal window
ros2 topic info xxxxxx
ros2 topic echo xxxxxx # xxxxxx 指的是具体话题名称,可在自己的代码中订阅话题进行二次开发
  1. 使用 /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),也可以打开一个终端,输入命令发布进行调试,请输入:

Terminal window
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 设置页中的自主模式,机器狗即可按照如上速度行动。

注意: 请在空旷处调试以防对人或物品造成损伤,遇到紧急情况,及时按下软急停,或关闭自主模式。

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
  1. Jetson2App.cpp 主要用于感知主机与手柄 APP 之间进行 UDP 通信,APP 下发指令到感知主机,该程序根据收到的命令执行相应的操作。手柄与感知主机之间通信所用的指令结构体如下:
class SimpleCMD{
public:
int32_t cmd_code;
int32_t cmd_value;
int32_t type;
};
  1. 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));