Skip to content

Latest commit

 

History

History
169 lines (125 loc) · 5.23 KB

ros1_helper_file.md

File metadata and controls

169 lines (125 loc) · 5.23 KB

To create a ROS1 node that reads camera and IMU data from a CSV file and then publishes it, follow these steps:

  1. Create a new ROS package:
cd ~/catkin_ws/src
catkin_create_pkg csv_publisher std_msgs rospy roscpp sensor_msgs
cd ~/catkin_ws
catkin_make
source devel/setup.bash
  1. Create a Python script csv_publisher.py in the scripts folder of the csv_publisher package.

  2. Update the script with the following content:

#!/usr/bin/env python

import rospy
from std_msgs.msg import String
from sensor_msgs.msg import Image, Imu
import csv

def read_csv_file(csv_file_path):
    data = []
    with open(csv_file_path, 'r') as file:
        reader = csv.reader(file)
        headers = next(reader)  # Skip header row
        for row in reader:
            data.append(row)
    return data

def csv_publisher():
    rospy.init_node('csv_publisher', anonymous=True)

    camera_pub = rospy.Publisher('camera_data', Image, queue_size=10)
    imu_pub = rospy.Publisher('imu_data', Imu, queue_size=10)

    rate = rospy.Rate(10)  # 10hz

    csv_data = read_csv_file('path_to_csv_file.csv')

    for row in csv_data:
        # Assuming the format: timestamp, camera_data, imu_data
        timestamp, camera_data, imu_data = row

        # Construct Image and Imu messages
        img_msg = Image()
        imu_msg = Imu()
        # TODO: Fill in the data for the messages using camera_data and imu_data

        camera_pub.publish(img_msg)
        imu_pub.publish(imu_msg)
        rate.sleep()

    rospy.spin()

if __name__ == '__main__':
    try:
        csv_publisher()
    except rospy.ROSInterruptException:
        pass

Note: The above script assumes a simplified CSV structure with a timestamp, camera data, and IMU data. You will need to modify the script according to the structure of your CSV and populate the relevant fields in the Image and Imu messages.

  1. Make the script executable:
chmod +x ~/catkin_ws/src/csv_publisher/scripts/csv_publisher.py
  1. Modify your CSV path in the script at 'path_to_csv_file.csv'.

  2. Run the ROS node:

roscore
rosrun csv_publisher csv_publisher.py

Remember to modify the node to fit the exact structure and type of data you have in your CSV file. The provided code is a starting point and will likely require customization.

Running the info at different speed

To publish the IMU data at a higher frequency than the images, you can adjust the publishing rate for each. Let's assume you want to publish the IMU data 10 times more frequently than the image data. Here's how you can modify the given ROS node to achieve this:

  1. Adjust the csv_publisher function:
def csv_publisher():
    rospy.init_node('csv_publisher', anonymous=True)

    camera_pub = rospy.Publisher('camera_data', Image, queue_size=10)
    imu_pub = rospy.Publisher('imu_data', Imu, queue_size=10)

    camera_rate = rospy.Rate(1)  # e.g., 1 Hz for camera
    imu_rate = rospy.Rate(10)  # e.g., 10 Hz for IMU

    csv_data = read_csv_file('path_to_csv_file.csv')

    for row in csv_data:
        # Assuming the format: timestamp, camera_data, imu_data
        timestamp, camera_data, imu_data = row

        # Publish Image data
        img_msg = Image()
        # TODO: Fill in the data for the Image message using camera_data
        camera_pub.publish(img_msg)
        camera_rate.sleep()  # Sleep to match the desired camera rate

        # Publish IMU data 10 times for each image data, as an example
        imu_msg = Imu()
        # TODO: Fill in the data for the Imu message using imu_data
        for _ in range(10):
            imu_pub.publish(imu_msg)
            imu_rate.sleep()  # Sleep to match the desired IMU rate

    rospy.spin()

In this example, for each row of the CSV, the camera data is published once, and the IMU data is published ten times. You can adjust the frequencies by modifying the arguments to the Rate constructors and changing the range in the loop.

Remember that this is a basic implementation that makes some assumptions about your CSV structure and the nature of your data. Depending on your exact requirements and CSV structure, you may need to refine this approach further.

stackoverflow image publisher:

import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
import os
import numpy as np

class Nodo(object):
    def __init__(self):
        # Params
        self.image = None
        self.br = CvBridge()
        # Node cycle rate (in Hz).
        self.loop_rate = rospy.Rate(1)

        # Publishers
        self.pub = rospy.Publisher('imagetimer', Image,queue_size=10)

        # Subscribers
        rospy.Subscriber("/camera/image_color",Image,self.callback)

    def callback(self, msg):
        rospy.loginfo('Image received...')
        self.image = self.br.imgmsg_to_cv2(msg)


    def start(self):
        rospy.loginfo("Timing images")
        #rospy.spin()
        while not rospy.is_shutdown():
            rospy.loginfo('publishing image')
            #br = CvBridge()
            if self.image is not None:
                self.pub.publish(self.br.cv2_to_imgmsg(self.image))
            self.loop_rate.sleep()
            
if __name__ == '__main__':
    rospy.init_node("imagetimer111", anonymous=True)
    my_node = Nodo()
    my_node.start()
    ```