准备工作
【创建工作空间】
- 新建一个目录
mkder ledDemo[工作空间名称,可以自定义]
- 初始化工作空间
# 进入工作空间目录
cd ledDemo[工作空间名称]
# 初始化
catkin_make
- 创建功能包
# 在工作目录下新建一个名为 src 的目录
mkdir src
# 进入 src 目录
cd src
# 执行创建功能包的命令
catkin_create_pkg 自定义ROS包名 roscpp rospy std_msgs
代码实现
1. C++ 编写一个节点
- 进入功能包的src目录 ledDemo/src/led_package/src
- 新建一个名为 led.cpp 的c++文件
gedit led.cpp
- 编写代码
led.cpp文件:
#include <ros/ros.h>
#include <std_msgs/Int8.h>
int main(int argc, char **argv)
{
ros::init(argc, argv, "led_node");
ros::NodeHandle n;
ros::Rate rate(1);
ros::Publisher pub = n.advertise<std_msgs::Int8>("model",10);
while (n.ok())
{
ROS_INFO("spin once 000111222333--000111222333");
ros::spinOnce();
std_msgs::Int8 msg;
msg.data = 2;
pub.publish(msg);
rate.sleep();
}
return 0;
}
- 配置项目
》 # 打开 /ledDemo/src/led_package/src 下的 CMakeLists.txt文件,配置我们
gedit CMakeLists.txt
内容:
add_executable(led_node src/led.cpp)
target_link_libraries(led_node
${catkin_LIBRARIES}
)
# led_node为节点名称,led.cpp为主编程序
- 编译
》 进入工作环境的根目录
catkin_make
2. arduino定义话题
#include <ros.h>
#include <std_msgs/String.h>
#include <std_msgs/Int8.h>
#define led 7
//ros节点变量
ros::NodeHandle nh;
//订阅的topic消息的处理
void ModelCb(const std_msgs::Int8& model){
if(model.data==0){
digitalWrite(led,0);
}
else if(model.data==1){
digitalWrite(led,1);
}
}
//定义订阅 名为 "model" 的topic 并指定处理函数
ros::Subscriber<std_msgs::Int8> sub("model", ModelCb );
void setup(void) {
pinMode(led,OUTPUT);
//初始化nodeHandle
nh.initNode();
nh.subscribe(sub);
}
void loop(void) {
nh.spinOnce();
delay(1);
}
测试
- 运行 roscore
roscore
- 启动websocket
# 安装 rosbridge-suite
sudo apt-get install ros-melodic-rosbridge-server
# 启动 rosbridge_websocket
roslaunch rosbridge_server rosbridge_websocket.launch
- 启动节点
# 节点包包添加环境变量
source ~/ros/workSpace/ledDemo/devel/setup.bash
# 启动
rosrun led_package led_node
- 开启串口监听
rosrun rosserial_python serial_node.py /dev/ttyACM0
- 监听节点
rosnode echo led_node
- 使用Android的 ROSBridgeClient 测试程序或者 webSocket模拟客户端软件进行发布消息