Learning ROS notes from theconstructsim.com


Ros tutorial
https://app.theconstructsim.com/#/Desktop

Topics:
communication to compnents of

services and actions

tutorial 1


# basic demoroslaunch publisher_example move.launch
roslaunch publisher_example stop.launch

# services
roslaunch service_demo service_launch.launch
rosservice call /service_demo "{}"

the subscribers run last message that it recieved

services

Defintion:

basic demoroslaunch publisher_example move.launch

roslaunch publisher_example stop.launch

services

requices the node to finish its process

actions

live feedback retuine

roslaunch service_demo service_launch.launch
rosservice call /service_demo "{}"
roslaunch action_demo action_launch.launch
roslaunch action_demo_client client_launch.launch
rosrun rviz rviz
cd ~/catkin_ws/src
catkin_create_pkg my_examples_pkg rospy std_msgs
cd ~/catkin_ws
catkin_make
source devel/setup.bash
rospack profile
roscd my_examples_pkg
mkdir scripts


roscd my_examples_pkg/scripts
touch NAME_OF_EXAMPLE_SCRIPT.py
chmod +x NAME_OF_EXAMPLE_SCRIPT.py

roscd my_examples_pkg/scripts
python NAME_OF_EXAMPLE_SCRIPT.py
# OR
rosrun my_examples_pkg NAME_OF_EXAMPLE_SCRIPT.py

roscd my_examples_pkg/scripts
touch simple_topic_publisher.py
chmod +x simple_topic_publisher.py

file simple_topic_publisher.py

#! /usr/bin/env python

import rospy
from std_msgs.msg import Int32 

rospy.init_node('topic_publisher')
pub = rospy.Publisher('/counter', Int32, queue_size=1)
rate = rospy.Rate(2)
count = Int32()
count.data = 0

while not rospy.is_shutdown(): 
  pub.publish(count)
  count.data += 1
  rate.sleep()

run shell 1

rosrun my_examples_pkg simple_topic_publisher.py

run shell 2

rostopic list | grep  '/counter'

how to see data publishing on ros

rostopic info /counter

result

user:~$ rostopic info /counter
Type: std_msgs/Int32

Publishers:
 * /topic_publisher (http://5_xterm:42533/)

Subscribers: None

how view the data

rostopic echo /counter

data: 546
---
data: 547
---
data: 548
---

what's a topic?

A topic is a channel that acts as a pipe, where other ROS nodes can either publish or read information

list ros topics

rostopic list

rostopic echo <topic_name>
rostopic echo <topic_name> -n1
rostopic echo /counter
rostopic echo /counter -n1


rostopic info /counter
rostopic -h
20210219

Messages

rosmsg show <message>
rosmsg show std_msgs/Int32

resulst

user:~/catkin_ws/src/my_examples_pkg$ rosmsg show std_msgs/Int32
int32 data

'data' is a variable defined in simple_topic_publisher.py

count = Int32()
count.data = 0

looking at Int32.msg

roscd std_msgs/msg/

rostopic info /cmd_vel 
rosmsg show

solving the challenge

cd ~/catkin_ws/src/
catkin_create_pkg exercise_31 rospy std_msgs geometry_msgs
cd ~/catkin_ws
catkin_make
source devel/setup.bash
rospack profile
roscd exercise_31
mkdir scripts
touch ./scripts/move_robot.py
#! /usr/bin/env python

import rospy
from geometry_msgs.msg import Twist

rospy.init_node('move_robot_node')
pub = rospy.Publisher('/cmd_vel', Twist, queue_size=1)
rate = rospy.Rate(2)
move = Twist()
move.linear.x = 0.5 #Move the robot with a linear velocity in the x axis
move.angular.z = 0.5 #Move the with an angular velocity in the z axis

while not rospy.is_shutdown(): 
  pub.publish(move)
  rate.sleep()

link how ros launch files work roslaunch - ROS Wiki

roscd exersize_31
# created a file called /catkin_ws/src/exersize_31/launch/move_robot.launch
touch ./launch/move_robot.launch
chmod +x ./launch/move_robot.launch

add text

<launch>
    <node pkg="exercise_31" type="move_robot.py" name="move_robot_node" output="screen" />
</launch>
chmod +x ./scripts/move_robot.py
roslaunch exercise_31 move_robot.py

roslaunch exercise_31 move_robot.launch

Subscribers

reads data from a publisher (similar to a client)


cd ~/catkin_ws/src
catkin_create_pkg my_examples_pkg rospy std_msgs
cd ~/catkin_ws
catkin_make
source devel/setup.bash
rospack profile
roscd my_examples_pkg
mkdir scripts

roscd my_examples_pkg/scripts
touch NAME_OF_EXAMPLE_SCRIPT.py
chmod +x NAME_OF_EXAMPLE_SCRIPT.py

roscd my_examples_pkg/scripts
python NAME_OF_EXAMPLE_SCRIPT.py
# OR
rosrun my_examples_pkg NAME_OF_EXAMPLE_SCRIPT.py


roscd my_examples_pkg/scripts
touch simple_topic_subscriber.py
chmod +x simple_topic_subscriber.py

simple_topic_subscriber.py


#! /usr/bin/env python

import rospy
from std_msgs.msg import Int32 

def callback(msg): 
  print (msg.data)

rospy.init_node('topic_subscriber')
sub = rospy.Subscriber('/counter', Int32, callback)
rospy.spin()

rosrun my_examples_pkg simple_topic_subscriber.py
rostopic echo /counter

OUTPUT:
----------
user ~ $ rostopic echo /counter
WARNING: no messages received and simulated time is active.
Is /clock being published?
---------

how to publish test data to topic

rostopic pub <topic_name> <message_type> <value>
rostopic pub /counter std_msgs/Int32 5

OUTPUT
----
user ~ $ rostopic echo /counter
WARNING: no messages received and simulated time is active.
Is /clock being published?
data:
5
---
----

#! /usr/bin/env python

import rospy                                          
from std_msgs.msg import Int32 

def callback(msg):   # Define a function called 'callback' that receives a parameter 
                     # named 'msg'
    print (msg.data) # Print the value 'data' inside the 'msg' parameter
rospy.init_node('topic_subscriber')  # Initiate a Node called 'topic_subscriber'

# Create a Subscriber object that will listen to the /counter
# topic and will cal the 'callback' function each time it reads

sub = rospy.Subscriber('/counter', Int32, callback)

# something from the topic
rospy.spin()   

Challenge 2


rostopic info /odom
OUTPUT:
--------------------------
Type: nav_msgs/Odometry

Publishers:
 * /gazebo (http://15_simulation:35255/)

Subscribers: None
--------------------------

find more about nav_msgs/Odometry

roscd nav_msgs


Debugging tools

Questions:

  • what does "{}" mean
  • what does it mean to 'call' a sevice
  • what does http://5_xterm:37773/ mean
  • what is a ros master?
    • how is it used?
  • what are paramaters?
  • what is queue_size=1
  • how does the datatypes work in ros
  • what does rospy.spin() do?

Sucess!

Results!

#! /usr/bin/env python

import rospy
from std_msgs.msg import Int32 
from nav_msgs.msg import Odometry
def callback(msg): 
  print (msg.header)
  print (msg.child_frame_id)
  print (msg.pose)
  print (msg.twist)

rospy.init_node('topic_subscriber')
sub = rospy.Subscriber('/odom', Odometry, callback)
rospy.spin()

roscd <package_name>
mkdir msg

The "Age.msg" file must contain this:


float32 years
float32 months
float32 days


how to install ros serial to communicate with arduino

rosserial_arduino/Tutorials/Arduino IDE Setup - ROS Wiki

sudo apt-get install ros-noetic-rosserial-arduino
sudo apt-get install ros-noetic-rosserial
cd ~/catkin_ws/src
git clone https://github.com/ros-drivers/rosserial.git
cd ~/catkin_ws
catkin_make
catkin_make install

Errors with install

Trying catkin_make_isolated

that didnt work...

this issue was someone's elses package was installed that was broaken

Fix: move the problem package out and run 'catkin_make`

Sucess!

install arduino ide

Program an Arduino UNO with your Raspberry Pi — The MagPi magazine

sudo apt-get update && sudo apt-get upgrade
sudo apt-get install arduino
Skechbook folder location
cd ~/sketchbook/libraries
rm -rf ros_lib
rosrun rosserial_arduino make_libraries.py .

Windows note:

If you are building the Arduino on Windows, you need to create the ros_lib folder in some convenient directory.

cd <some_empty_directory>
rosrun rosserial_arduino make_libraries.py .

Issue i ran into

links

usb_cam - ROS Wiki

fatal error: serial/serial.h: no such file or directory in ros - ROS Answers: Open Source Q&A Forum

robotarmhackathon/launch at main · agillies8/robotarmhackathon

agillies8/robotarmhackathon: Code for the robot arm hackathon

ros-drivers/rosserial: A ROS client library for small, embedded devices, such as Arduino. See: http://wiki.ros.org/rosserial

rosserial_arduino - ROS Wiki

3AxisArm/Single_BUTTON_TEST.ino at master · agillies8/3AxisArm

exaplse simple

3AxisArm/buttonPlex.py at master · agillies8/3AxisArm

3AxisArm/TWO_BUTTON_TEST.ino at master · agillies8/3AxisArm

simple keyboard input

teleop_twist_keyboard - ROS Wiki