O firmware para controlo de braços robóticos com ROS não é especifico para o moveit.
O controlo é relativamente fácil e envolve dois nodes, e dois tópicos.
Um node ROS localizado num computador, subscreve o tópico /joint_states, com mensagens do tipo sensor_msgs/JointState, e depois de converter cada uma das mensagens (no tipo de dados adequado) publica mensagens no tópico subscrito pelo node rosserial a ser executado como firmware no micro- controlador responsável pelo controlo directo dos motores do braço.
O tipo de dados necessário para conduzir os motores pode variar conforme os motores usados, (servos ou steppers) mas regra geral será um array de inteiros com a posição em graus que cada um dos motores do braço robótico deve ter a cada momento.
Exemplos do firmware usado num microcontrolador adequado ao ros moveit, ou de forma genérica a outro processo de controlo de braços robóticos pode ser encontrado no seguinte repositório:
https://github.com/inaciose/ntbd_firmware
Exemplo de node ROS em python que subscreve um tópico Float64 e publica mensagens no topico /joint_states.
import rospy
from sensor_msgs.msg import JointState
from std_msgs.msg import Float64
class CommandToJointState:
def __init__(self):
self.joint_name = rospy.get_param("~joint_name")
self.joint_state = JointState()
self.joint_state.name.append(self.joint_name)
self.joint_state.position.append(0.0)
self.joint_state.velocity.append(0.0)
self.joint_pub = rospy.Publisher("joint_states", JointState, queue_size=1)
self.command_sub = rospy.Subscriber("command", Float64,
self.command_callback, queue_size=1)
def command_callback(self, msg):
self.joint_state.position[0] = msg.data
self.joint_state.header.stamp = rospy.Time.now()
self.joint_pub.publish(self.joint_state)
if __name__ == '__main__':
rospy.init_node('command_to_joint_state')
command_to_joint_state = CommandToJointState()
rospy.spin()
fonte:
https://answers.ros.org/question/276405/how-to-write-my-own-joint-state/