跳转到内容

ROS 话题测试案例

已完成ROS主从机通信配置(以机器狗为主机,本地计算机为从机)

本文内容操作步骤以感知主机为例,导航主机的配置方法与此类似。

使用网线将开发主机连接到机器狗尾部网口,或通过 WiFi 连接机器狗:

  • WiFi 名称:X30******(请查看机器狗序列号)
  • WiFi 密码为:12345678

连接WiFi

Terminal window
ssh ysc@192.168.1.105

密码是 '(英文单引号)

登录成功界面

测试本地终端与机器狗终端连通性

Section titled “测试本地终端与机器狗终端连通性”

得到本地终端的IP:

查看本地IP

在机器狗终端 ping 本地终端,在本地终端 ping 机器狗终端:

Terminal window
ping 192.168.1.123 #机器狗终端输入,注意替换为你自己本地终端的IP
ping 192.168.1.105 #本地终端输入

若两个终端均有数据返回,则表示连通。

ping测试1

ping测试2

Terminal window
export HOSTNAME=szc #替换为本地终端的名字
export ROS_IP=192.168.1.123 #替换为本地终端的IP
export ROS_MASTER_URI=http://192.168.1.105:11311 #机器狗的IP

改完之后 source ~/.bashrc。

从机bashrc配置验证

从机 hosts 文件修改(一般仅需修改一次)

Section titled “从机 hosts 文件修改(一般仅需修改一次)”
Terminal window
sudo vi /etc/hosts

增加以下内容(注意IP和hostname之间是tab不是空格):

192.168.1.123 szc #替换为本地终端的IP和名字
192.168.1.105 ysc

从机hosts文件修改

Terminal window
export ROS_HOSTNAME=ysc
export ROS_IP=192.168.1.105
export ROS_MASTER_URI=http://192.168.1.105:11311

改完之后 source ~/.bashrc。

主机bashrc配置验证

验证输出:

Terminal window
http://192.168.1.105:11311
http://192.168.1.105:11311

主机bashrc验证结果

Terminal window
sudo vi /etc/hosts

增加以下内容:

192.168.1.105 ysc
192.168.1.123 szc #替换为你自己本地终端的IP和名字

主机hosts文件修改

在本地终端执行:

Terminal window
rostopic list

若能列出一系列话题名:

rostopic list

再以 /battery/current 话题为例测试:

Terminal window
rostopic echo /battery/current

若可接收到话题消息,表示主从机通讯配置成功。

rostopic echo测试

场景一:ROS自带话题,无需自定义

Section titled “场景一:ROS自带话题,无需自定义”

以 /imu/data 话题为例,该话题为开机后即有消息发布。

#include "ros/ros.h"
#include "sensor_msgs/Imu.h"
int g_count = 0;
void imuCallback(const sensor_msgs::Imu::ConstPtr& msg)
{
g_count++;
ROS_INFO("Subscribed imu data, cycle : %d ", g_count);
ROS_INFO("header: ");
ROS_INFO(" seq: %d", msg->header.seq);
ROS_INFO(" stamp: ");
ROS_INFO(" secs: %d", msg->header.stamp.sec);
ROS_INFO(" nsecs: %d", msg->header.stamp.nsec);
ROS_INFO(" frame_id: \"%s\"", msg->header.frame_id.c_str());
ROS_INFO("orientation: ");
ROS_INFO(" x: %f", msg->orientation.x);
ROS_INFO(" y: %f", msg->orientation.y);
ROS_INFO(" z: %f", msg->orientation.z);
ROS_INFO(" w: %f", msg->orientation.w);
ROS_INFO("angular_velocity: ");
ROS_INFO(" x: %f", msg->angular_velocity.x);
ROS_INFO(" y: %f", msg->angular_velocity.y);
ROS_INFO(" z: %f", msg->angular_velocity.z);
ROS_INFO("linear_acceleration: ");
ROS_INFO(" x: %f", msg->linear_acceleration.x);
ROS_INFO(" y: %f", msg->linear_acceleration.y);
ROS_INFO(" z: %f", msg->linear_acceleration.z);
ROS_INFO("---");
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "imu_subscriber");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("/imu/data", 10, imuCallback);
ros::spin();
return 0;
}
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
sensor_msgs
)

CMakeLists find_package

catkin_package(
CATKIN_DEPENDS roscpp rospy sensor_msgs
)

CMakeLists catkin_package

add_executable(imu_subscriber src/imu_subscriber.cpp)
target_link_libraries(imu_subscriber ${catkin_LIBRARIES})

CMakeLists add_executable

Terminal window
cd ~/jy_cog/transfer
catkin_make
export ROS_IP=192.168.1.123 #替换为本地终端的IP
export ROS_MASTER_URI=http://192.168.1.105:11311
source devel/setup.bash
rosrun imu_driver imu_subscriber

以话题 /battery_state 为例,消息类型 message_transformer_cpp/BatteryData 是自定义消息类型。

自定义消息文件源码(BatteryData.msg)

Section titled “自定义消息文件源码(BatteryData.msg)”
uint16 voltage
int16 current
uint16 remaining_capacity
uint16 nominal_capacity
uint16 cycles
uint16 production_date
uint16 balanced_low
uint16 balanced_high
uint16 protected_state
uint8 software_version
uint8 battery_level
uint8 mos_state
uint8 battery_quantity
uint8 battery_ntc
float32[] battery_temperature
#include "ros/ros.h"
#include "battery_state/BatteryData.h"
int g_count = 0;
void batteryCallback(const battery_state::BatteryData::ConstPtr& msg)
{
g_count++;
ROS_INFO("voltage: %d", msg->voltage);
ROS_INFO("current: %d", msg->current);
ROS_INFO("remaining_capacity: %d", msg->remaining_capacity);
ROS_INFO("nominal_capacity: %d", msg->nominal_capacity);
ROS_INFO("cycles: %d", msg->cycles);
ROS_INFO("production_date: %d", msg->production_date);
ROS_INFO("balanced_low: %d", msg->balanced_low);
ROS_INFO("balanced_high: %d", msg->balanced_high);
ROS_INFO("protected_state: %d", msg->protected_state);
ROS_INFO("software_version: %d", msg->software_version);
ROS_INFO("battery_level: %d", msg->battery_level);
ROS_INFO("mos_state: %d", msg->mos_state);
ROS_INFO("battery_quantity: %d", msg->battery_quantity);
ROS_INFO("battery_ntc: %d", msg->battery_ntc);
ROS_INFO("battery_temperature: [");
for (size_t i = 0; i < msg->battery_temperature.size(); ++i) {
if (i == msg->battery_temperature.size() - 1) {
ROS_INFO(" %f", msg->battery_temperature[i]);
} else {
ROS_INFO(" %f,", msg->battery_temperature[i]);
}
}
ROS_INFO("]");
ROS_INFO("---");
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "battery_subscriber");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("/battery_state", 10, batteryCallback);
ros::spin();
return 0;
}
find_package(catkin REQUIRED COMPONENTS
geometry_msgs
roscpp
rospy
std_msgs
message_generation
)
add_message_files(FILES BatteryData.msg)
generate_messages(DEPENDENCIES std_msgs)
catkin_package(
CATKIN_DEPENDS roscpp rospy sensor_msgs message_runtime
)
add_executable(battery_subscriber src/battery_subscriber.cpp)
target_link_libraries(battery_subscriber ${catkin_LIBRARIES})
add_dependencies(battery_subscriber ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

需提前完成 Livox-ros-driver2 驱动包的安装和环境配置,具体参考 Livox驱动安装教程。

问题: rostopic echo /livox/lidar 输出时仅有点云数组相关数据,不含标准消息头和激光雷达帧元数据。

解决方案: 在本地终端需要先完成 Livox-ros-driver2 驱动包的安装,才能在本地终端正确解析 /livox/lidar 话题的自定义消息类型。